国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spring中存儲和獲取bean對象

這篇具有很好參考價值的文章主要介紹了spring中存儲和獲取bean對象。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 存儲bean對象

存儲 Bean 分為以下 2 步:

  1. 存儲 Bean 之前,先得有 Bean 才?,因此先要創(chuàng)建?個 Bean, 說白了也就是寫一個類。
  2. 告訴spring,把這個類的對象存起來。

1.1 使用配置文件存儲bean對象

  1. 編寫User類, 有sayHi方法。
public class User {
    public void sayHi() {
        System.out.println("你好");
    }
}
  1. 告訴spring,把這個類的對象存起來。
    在配置文件中可以通過<bean>標簽來告訴spring把對象存起來。
<bean id="user1" class="demo.User"></bean>
  • id : 是用來標識一個對象的,就像我們的身份證一樣。
    也稱為bean對象的name(名字), 后面通過這個名字就能找到這個對象。
  • class:是帶包的類名, 讓spring知道我們要存的是哪一個類的對象。

完整的xml文件如下:
spring中存儲和獲取bean對象,JavaEE,spring,java

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <bean id="user1" class="demo.User"></bean>
</beans>

注意:配置文件其他的標簽不用管,直接復制粘貼,需要關(guān)注的是<bean>標簽。


怎么知道Spring把對象存起來了呢?我們查找一下這個bean對象的name(名字) 就行了。
使用BeanFactory或者ClassPathXmlApplicationContext就能查找bean對象了。

BeanFactory的代碼如下:
spring中存儲和獲取bean對象,JavaEE,spring,java

public class Test {
    public static void main(String[] args) {
        //創(chuàng)建BeanFactory的實現(xiàn)類的對象
        BeanFactory beanFactory =
                new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
                
        //根據(jù)名字查找bean對象
        User user1 = (User)beanFactory.getBean("user1");
        
        //調(diào)用sayHi()方法
        user1.sayHi();
    }
}

結(jié)果:

spring中存儲和獲取bean對象,JavaEE,spring,java

如何創(chuàng)建BeanFactory對象:

  • BeanFactory是一個接口,XmlBeanFactory是其中的一個實現(xiàn)類,因為我們用xml文件來告訴spring存儲bean對象,所以用XmlBeanFactory這個類。
  • XmlBeanFactory 其中的一個構(gòu)造器的參數(shù)類型是:Resource 。
    Resource也是一個接口, 所以還需要創(chuàng)建Resource接口的實現(xiàn)類。

使用ClassPathXmlApplicationContext上下文對象,查找bean對象。

public class Test {
    public static void main(String[] args) {
        test2();
    }

    public static void test2() {
        //創(chuàng)建上下文對象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        //查找bean對象,第二個參數(shù)傳了User的類型,得到bean對象后就無需轉(zhuǎn)型了
        User user1 = context.getBean("user1", User.class);
        user1.sayHi();
    }
}

結(jié)果:
spring中存儲和獲取bean對象,JavaEE,spring,java

1.2 使用五大類注解存儲bean對象

xml的形式來存儲對象會比較麻煩,如果需要存很多個對象,就需要在xml配置文件中寫多個<bean>標簽。
這樣子會很麻煩。所以spring提供了更加簡便的方式來存儲bean對象, 那就是使用注解。
下面介紹使用注解存儲bean對象。

使用注解的方式,也要配置xml文件,不過只需要配置一個標簽:<content:component-scan>
配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="demo"></content:component-scan>
</beans>

說明:
<content:component-scan>這個標簽用來配置包掃描路徑, base-package="demo"配置的就是具體的包。
作用就是告訴spring在哪個包下掃描帶有注解的類。spring掃描到帶有注解的類就會為這個類創(chuàng)建對象。

<content:component-scan base-package="demo"></content:component-scan>

想要將對象存儲在 Spring 中,有兩種注解類型可以實現(xiàn):

  1. 類注解:
    @Controller(控制器)、@Service(服務)、
    @Repository(倉庫)、@Component(組件)、@Configuration(配置)。
  2. ?法注解:
    @Bean

1.2.1 類注解

  1. 使用@Controller類注解

在下面的代碼中創(chuàng)建了ControllerTest類,有sayHello方法,類的上面有@Controller注解
有了這個@Controller注解,spring就能掃描到這個類,然后spring就會創(chuàng)建對象了。

@Controller
public class ControllerTest {
    public void sayHello() {
        System.out.println("hello, 正在測試@Controller注解");
    }
}

測試類:

public class Test {
    public static void main(String[] args) {
        test3();
    }

   public static void test3() {
        //創(chuàng)建上下文對象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        //獲取bean對象, 如果沒有在注解上加參數(shù),默認用類名的首字母小寫獲取bean對象
        ControllerTest controllerTest = context.getBean("controllerTest", ControllerTest.class);
        controllerTest.sayHello();
    }

結(jié)果:
spring中存儲和獲取bean對象,JavaEE,spring,java

注意:
如果在注解上沒有指定bean對象的名字,將類名的首字母小寫后作為bean對象的名字獲取bean對象。
ControllerTest類名小寫后是controllerTest,所以用controllerTest可以獲取到bean對象。

也可以在注解上傳參,指定bean對象的名字。

spring中存儲和獲取bean對象,JavaEE,spring,java

根據(jù)名字獲取bean對象

spring中存儲和獲取bean對象,JavaEE,spring,java

  1. 使用@Service注解
    @Service注解跟@Controller的用法幾乎一模一樣。
@Service
public class ServiceTest {
    public void sayHello() {
        System.out.println("hello, 正在測試@Service注解");
    }
}
public class Test {
    public static void main(String[] args) {
        test4();
    }
    
    public static void test4() {
        //創(chuàng)建上下文對象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        //獲取bean對象, 如果沒有在注解上加參數(shù),默認用類名的首字母小寫獲取bean對象
        ServiceTest serviceTest = context.getBean("serviceTest", ServiceTest.class);
        serviceTest.sayHello();
    }
}

spring中存儲和獲取bean對象,JavaEE,spring,java
@Repository, @Component, @Configuarion注解用法跟上面的代碼差不多,就不再演示了。

1.2.2 五大類注解的作用

因為后端程序是分層的,這五個類注解,分別就代表不同的層。
@Controller代表了業(yè)務邏輯層。
@Service代表了服務層。
@Repository代表了數(shù)據(jù)層。
@Configuration是配置層。
這些類注解功能是一樣的,都是告訴spring存儲bean對象。
但是當我們看到一個類上帶了@Controller注解的時候,我們就清楚了,這個類處于 哪一層的,是干什么的。
spring中存儲和獲取bean對象,JavaEE,spring,java
這樣做這樣可以大大提高程序的可閱讀性。

spring中存儲和獲取bean對象,JavaEE,spring,java

1.2.3 方法注解

@Bean方法注解用來將方法返回的對象存到spring中。

ControllerTest類中,寫一個getObj方法,這個方法返回的ArrayList對象會存到spring

@Controller("con")
public class ControllerTest {
    public void sayHello() {
        System.out.println("hello, 正在測試@Controller注解");
    }

    @Bean(name = "list")
    public ArrayList<Integer> getObj() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        return list;
    }
}

測試列:

public class Test {
    public static void main(String[] args) {
        test5();
    }
    
   public static void test5() {
        //創(chuàng)建上下文對象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //根據(jù)name獲取bean對象
        ArrayList<Integer> list = context.getBean("list", ArrayList.class);
        System.out.println(list.get(0));
    }
}

輸出:

spring中存儲和獲取bean對象,JavaEE,spring,java

2.獲取bean對象

獲取 bean 對象也叫做對象裝配,是把對象取出來放到某個類中,也可以叫對象注?。
對象注?的實現(xiàn)?法以下 3 種:

  1. 屬性注?
  2. 構(gòu)造?法注?
  3. Setter 注?

使用@Autowired或者@Resource注解實現(xiàn)spring中的bean對象注入。
這里用@Autowired注解進行演示。

2.1 屬性注入

UserService

@Service
public class UserService {
    public void sayHi() {
        System.out.println("Hi");
    }
}

UserController

獲取spring中的對象使用@Autowired注解,將UserService類的bean對象注入進來

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    public void sayHi() {
        userService.sayHi();
    }
}

測試類:

public class Test {
    public static void main(String[] args) {
        test6();
    }
    
	public static void test6() {
        //創(chuàng)建上下文對象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //獲取bean對象
        UserController userController = context.getBean("userController", UserController.class);
        userController.sayHi();
    }
}

spring中存儲和獲取bean對象,JavaEE,spring,java
輸出了HiUserSevice類的bean對象成功被注入了。

2.2 構(gòu)造器注入

@Autowired注解放在構(gòu)造器的上面,加一個形參,就可以實現(xiàn)構(gòu)造器注入了。

@Controller
public class UserController {
    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    public void sayHi() {
        userService.sayHi();
    }
}

2.3 getter注入

getter注入也一樣,將@Autowired注解放在getter方法上即可。

@Controller
public class UserController {
    private UserService userService;

    public void sayHi() {
        userService.sayHi();
    }

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

2.4 注入對象的時候有spring中有多個bean對象怎么辦

當注入對象的時候,spring中有多個對象的時候,就要告訴spring獲取的是哪個bean對象。
但是@Autowired注解不能傳入bean對象的名字,所以要用其他的方式來解決這個問題。

spring中存儲和獲取bean對象,JavaEE,spring,java

這時候有三種做法:

  1. 將類中屬性的名字,改成和要注入的bean對象的名字一樣
  2. @Autowired注解下面加@Qualifier注解
  3. 拋棄@Autowired注解, 使用@Resource注解

下面演示這三種不同處理方法:

2.4.1 將類中屬性的名字,改成和要注入的bean對象的名字一樣

Student類, 有idname、age屬性, set方法和toString方法。

public class Student {
    private int id;
    private String name;
    private int age;
    
    public void setId(int id) {
        this.id = id;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

StudentService類, 使用了方法注解@Bean將兩個Student類的對象存到spring中。

@Service
public class StudentService {
    @Bean("stu1")
    public Student getStu1() {
        Student student = new Student();
        student.setId(1);
        student.setName("張三");
        student.setAge(22);
        return student;
    }

    @Bean("stu2")
    public Student getStu2() {
        Student student = new Student();
        student.setId(2);
        student.setName("李四");
        student.setAge(23);
        return student;
    }
}

StudentController類中,有屬性stu1showStuInfo方法, 使用@Autowired將對象注入到屬性上。

@Controller("stucon")
public class StudentController {
    @Autowired
    private Student stu1;

    public void showStuInfo() {
        System.out.println(stu1.toString());
    }
}

stu1屬性名bean對象的名字一樣。

spring中存儲和獲取bean對象,JavaEE,spring,java

spring中存儲和獲取bean對象,JavaEE,spring,java

測試類:

public class Test {
    public static void main(String[] args) {
        test7();
    }
    
	public static void test7() {
        //創(chuàng)建上下文對象
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        
        StudentController studentController = context.getBean("stucon", StudentController.class);
        studentController.showStuInfo();
    }
}

輸入出:

spring中存儲和獲取bean對象,JavaEE,spring,java

2.4.2 在 @Autowired注解下面加@Qualifier注解

@Qualifier注解的源碼,使用注解的時候,可以傳遞value的值
spring中存儲和獲取bean對象,JavaEE,spring,java

@Qualifier注解的中加上bean對象的名字,spring就知道要注入哪一個bean對象了。

StudentController類如下。

@Controller("stucon")
public class StudentController {
    @Autowired
    @Qualifier("stu1")
    private Student stu;

    public void showStuInfo() {
        System.out.println(stu.toString());
    }
}

2.4.3 拋棄@Autowired注解, 使用@Resource注解

@Resource注解的部分源碼。

spring中存儲和獲取bean對象,JavaEE,spring,java

在注解上傳遞一個參數(shù)即可,name = "stu1"就表示要注入名為stu1bean對象

@Controller("stucon")
public class StudentController {
    @Resource(name = "stu1")
    private Student stu;

    public void showStuInfo() {
        System.out.println(stu.toString());
    }
}

2. 5 @Autowired和@Resource注解的區(qū)別

  • 出身不同。@Autowired來自于spring,而@ResourceJDK自帶的。
  • 傳參不同。@Resource相比@Autowired,可以傳遞的參數(shù)更多。
  • @Autowired注解可以用于屬性注入,構(gòu)造方法注入,setter注入。
    @Resource注解只能用于屬性注入和setter注入, 不同用于構(gòu)造方法注入。
    因為@Autowried注解可以修飾屬性,構(gòu)造器,和方法,@Resource不能修飾構(gòu)造器,但可以修飾屬性和方法。

@Autowried注解部分源碼

spring中存儲和獲取bean對象,JavaEE,spring,java

@Resource注解部分源碼

spring中存儲和獲取bean對象,JavaEE,spring,java文章來源地址http://www.zghlxwxcb.cn/news/detail-612659.html

到了這里,關(guān)于spring中存儲和獲取bean對象的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關(guān)文章

  • 【JavaEE進階】 Spring使用注解存儲對象

    【JavaEE進階】 Spring使用注解存儲對象

    在博主前面所寫的《【JavaEE進階】 Spring 的創(chuàng)建和使?》中我們已經(jīng)可以實現(xiàn)基本的 Spring 讀取和存儲對象的操作了,但在操作的過程中我們發(fā)現(xiàn)讀取和存儲對象并沒有想象中的那么“簡單”,所以接下來我們要學習更加簡單的操作 Bean 對象的?法。 在 Spring 中想要更簡單的存

    2024年02月05日
    瀏覽(19)
  • 【Spring】使用注解讀取和存儲Bean對象

    【Spring】使用注解讀取和存儲Bean對象

    ?哈嘍,哈嘍,大家好~ 我是你們的老朋友: 保護小周? ?? 談起Java 圈子里的框架,最年長最耀眼的莫過于 Spring 框架啦,本期給大家?guī)淼氖牵? 將對象存儲到 Spring 中、Bean 對象的命名規(guī)則、從Spring 中獲取bean 對象、注入的、@Autowired 與?@Resource 的區(qū)別、解決@Bean 方

    2024年02月13日
    瀏覽(23)
  • Spring中Bean對象的存儲與讀取

    Spring中Bean對象的存儲與讀取

    在項目的 pom.xml 中添加 Spring 支持 如何選定版本環(huán)境:打開官網(wǎng),點擊github圖標 jdk8最后一個Spring版本是5.3.x,Spring6.0.x最低需要jdk17 版本沖突問題Maven自己處理 version : 可以選擇帶有 RELEASE結(jié)尾或者純數(shù)字結(jié)尾,這樣的版本更穩(wěn)定 項目下創(chuàng)建一個main方法的啟動類 存儲 Bean 之前

    2024年01月24日
    瀏覽(21)
  • Spring的存儲與獲取Bean

    Spring的存儲與獲取Bean

    關(guān)于 Spring 的創(chuàng)建及簡單的使用 可以參考這篇文章 之前的存儲方式是利用 bean id=\\\"\\\" class=\\\"\\\"/bean 進行存儲 但這種方式存在一個弊端 即需要存儲的 Bean 過多時, 手動添加過于繁瑣 利用注解可以有效規(guī)避這種情況 添加注解存儲 Bean 類注解 @Controller: 控制器存儲 @Service: 服務存儲 @

    2024年02月09日
    瀏覽(19)
  • 【Spring】(三)Spring 使用注解存儲和讀取 Bean對象

    【Spring】(三)Spring 使用注解存儲和讀取 Bean對象

    前面的文章詳細的介紹了 Spring 對象的創(chuàng)建,以及對 Bean 對象的存取操作,但是通過配置文件注冊 Bean 對象以及使用 ApplicationContext 或 BeanFactory 的方式獲取 Bean 對象的操作就顯得格外的復雜。因此,本文主要就是詳細介紹了一種更加簡單的方式來實現(xiàn)對 Bean 對象更加簡單的儲

    2024年02月14日
    瀏覽(19)
  • Spring更簡單的存儲和讀取Bean對象

    Spring更簡單的存儲和讀取Bean對象

    目錄 1.第一個Spring項目 2.存儲Bean對象 2.1 準備工作 2.2?五大類注解 2.3?方法注解@Bean 2.4 Bean對象的默認命名規(guī)則 3. 讀取Bean對象 3.1 屬性注入 3.2 setter注入 3.3 構(gòu)造方法注入 3.4 注入異常問題 3.5 注入方式優(yōu)缺點 3.6 @Autowired和@Resource的區(qū)別 在學習更簡單的方式來讀取和存儲Bean對象

    2024年02月03日
    瀏覽(23)
  • 【JavaEE進階】Spring 更簡單的讀取和存儲對象

    【JavaEE進階】Spring 更簡單的讀取和存儲對象

    配置掃描路徑是使用注解之前的前置工作,是非常重要的,是必須的操作項.只有被配置的包下的所有類,添加了注解才能被正確的識別并保存到 Spring 中. 首先創(chuàng)建一個Spring項目.創(chuàng)建好后,第一步就是配置掃描路徑:在 resources 目錄中創(chuàng)建一個 spring-config.xml 文件.然后在 spring-config.

    2024年02月12日
    瀏覽(23)
  • 從 Spring 的創(chuàng)建到 Bean 對象的存儲、讀取

    從 Spring 的創(chuàng)建到 Bean 對象的存儲、讀取

    目錄 創(chuàng)建 Spring 項目: 1.創(chuàng)建一個 Maven 項目: ?2.添加 Spring 框架支持: 3.配置資源文件: 4.添加啟動類: Bean 對象的使用: 1.存儲 Bean 對象: 1.1 創(chuàng)建 Bean: 1.2 存儲 Bean 到容器內(nèi): 2.獲取 Bean 對象: 2.1 創(chuàng)建 Spring 上下文: 2.2 獲取指定 Bean 對象: ApplicationContext 和 BeanFactor

    2024年02月06日
    瀏覽(17)
  • Spring - 更簡單的獲取 Bean 對象

    Spring - 更簡單的獲取 Bean 對象

    目錄 二、獲取 Bean 對象(對象裝配或者對象注入) 1. 屬性注入 1.1 屬性注入的優(yōu)點和缺點: 2. Setter注入 ?2.1?Setter注入的優(yōu)點和缺點 3. 構(gòu)造方法注入(spring 官方推薦的對象注入方式) 3.1?構(gòu)造方法的優(yōu)點和缺點 4. @Autowired 注解 和 @Resource 注解的區(qū)別 4.1 @Autowired 和 @Source 的區(qū)

    2024年02月16日
    瀏覽(21)
  • JavaEE 突擊 5 - Spring 更簡單的讀取和存儲對象(2)

    JavaEE 突擊 5 - Spring 更簡單的讀取和存儲對象(2)

    大家新年快樂 , 祝大家新的一年如圖 這個專欄給大家介紹一下 Java 家族的核心產(chǎn)品 - SSM 框架 JavaEE 進階專欄 Java 語言能走到現(xiàn)在 , 仍然屹立不衰的原因 , 有一部分就是因為 SSM 框架的存在 接下來 , 博主會帶大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相關(guān)知識點 并且?guī)ьI

    2024年02月19日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包