最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于接口ApplicationContext中的getBean()方法使用

 更新時(shí)間:2022年09月29日 10:18:12   作者:過路人「借過」  
這篇文章主要介紹了關(guān)于接口ApplicationContext中的getBean()方法使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

我們知道可以通過ApplicationContext的getBean方法來獲取Spring容器中已初始化的bean。

getBean一共有以下四種方法原型

  • 1,l getBean(String name)
  • 2,l getBean(Class<T> type)
  • 3,l getBean(String name,Class<T> type)
  • 4,l getBean(String name,Object[] args)

下來我們分別來探討以上四種方式獲取bean的區(qū)別。

其中實(shí)體類Person定義如下:

public class Person {
?
private String name;
private int age;
public Person(){}
?
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
?
public int getAge() {
return age;
}
?
public void setAge(int age) {
this.age = age;
}
?
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}

applicationContext.xml注冊有id為p的bean,配置如下:

<bean id="p" class="com.bean.Person">
?
<property name="name" value="張三"/>
?
<property name="age" value="18"/>
?
</bean>

第一種:l getBean(String name)

參數(shù)name表示IOC容器中已經(jīng)實(shí)例化的bean的id或者name,且無論是id還是name都要求在IOC容器中是唯一的不能重名。

那么這種方法就是通過id或name去查找獲取bean.獲取bean的參考代碼如下:

@Test
?
public void testPerson()
{
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
?
Person p = (Person) ctx.getBean("p");
?
System.out.println(p);
}

第二種:l getBean(Class<T> type)

參數(shù)Class<T> type表示要加載的Bean的類型。

如果該類型沒有繼承任何父類(Object類除外)和實(shí)現(xiàn)接口的話,那么要求該類型的bean在IOC容器中也必須是唯一的。

比如applicationContext.xml配置兩個(gè)類型完全一致的bean,且都沒有配置id和name屬性。

<bean class="com.bean.Person">
?
<property name="name" value="張三"/>
?
<property name="age" value="18"/>
?
</bean>
?
<bean class="com.bean.Person">
?
<property name="name" value="李四"/>
?
<property name="age" value="20"/>
?
</bean>

那么通過com.bean.Person這種類型來查找bean,參考代碼如下:

@Test
public void testPerson()
?
{
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
?
Person p = ctx.getBean(Person.class);
?
System.out.println(p);
}

但是由于屬于com.bean.Person的bean在IOC容器中不唯一,所以這里會(huì)拋出NoUniqueBeanDefinitionException異常。

由此我們可以總結(jié)getBean(String name)和getBean(Class<T> type)的異同點(diǎn)。

  • 相同點(diǎn):都要求id或者name或者類型在容器中的唯一性。
  • 不同點(diǎn):getBean(String name)獲得的對象需要類型轉(zhuǎn)換而getBean(Class<T> type)獲得的對象無需類型轉(zhuǎn)換。

第三種:l getBean(String name,Class<T> type)

這種方式比較適合當(dāng)類型不唯一時(shí),再通過id或者name來獲取bean。

例如applicationContext.xml配置有如下bean:

<bean id="p1" class="com.bean.Person">
?
<property name="name" value="張三"/>
?
<property name="age" value="18"/>
?
</bean>
?
<bean name="p2" class="com.bean.Person">
?
<property name="name" value="李四"/>
?
<property name="age" value="20"/>
?
</bean>

參考代碼如下:

@Test
public void testPerson()
{
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
?
Person p = ctx.getBean("p2",Person.class);
?
System.out.println(p);
}

這樣可以獲取到名字叫”李四”的對象。

第四種:l getBean(String name,Object[] args)

這種方式本質(zhì)還是通過bean的id或者name來獲取bean,通過第二個(gè)參數(shù)Object[] args可以給bean的屬性賦值,賦值的方式有兩種:構(gòu)造方法和工廠方法。

但是通過這種方式獲取的bean必須把scope屬性設(shè)置為prototype,也就是非單例模式。

先在com.factory包下設(shè)計(jì)有如下的工廠類:

public class PersonFactory {
//靜態(tài)工廠注入
public static Person getPersonInstance(String name,int age)throws Exception
{
?
Person p = (Person)Class.forName("com.bean.Person").newInstance();
?
Method m = p.getClass().getMethod("setName", java.lang.String.class);
?
m.invoke(p, name);
?
m = p.getClass().getMethod("setAge", int.class);
?
m.invoke(p, age);
?
return p;
}
}

在applicationContext.xml中配置有如下bean:

<bean name="p3" class="com.bean.Person" scope="prototype"/>

獲取bean的參考代碼如下:

@Test
?
public void testPerson()
?
{
?
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
?
Person p = (Person) ctx.getBean("p3",new Object[]{"王五",35});
?
System.out.println(p);
}

如果想通過工廠注入屬性,在applicationContext.xml配置如下bean:

<bean name="p3" class="com.factory.PersonFactory" factory-method="getPersonInstance" scope="prototype">
<constructor-arg name="name">
?
<null/>
?
</constructor-arg>
?
<constructor-arg name="age" value="0"/>
?
</bean>

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java Hibernate中的持久化類和實(shí)體類關(guān)系

    Java Hibernate中的持久化類和實(shí)體類關(guān)系

    Hibernate是一種Java對象關(guān)系映射框架,通過持久化類將Java對象映射到數(shù)據(jù)庫表中。持久化類需要實(shí)現(xiàn)無參構(gòu)造器、具有標(biāo)識屬性和使用注解或XML進(jìn)行映射。Hibernate通過Session來管理對象的狀態(tài),包括臨時(shí)狀態(tài)、持久化狀態(tài)和游離狀態(tài)
    2023-04-04
  • @MapperScan和@ComponentScan一塊使用導(dǎo)致沖突的解決

    @MapperScan和@ComponentScan一塊使用導(dǎo)致沖突的解決

    這篇文章主要介紹了@MapperScan和@ComponentScan一塊使用導(dǎo)致沖突的解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • IntelliJ?IDEA2022中的Java文檔注釋設(shè)置、操作方法

    IntelliJ?IDEA2022中的Java文檔注釋設(shè)置、操作方法

    這篇文章主要介紹了IntelliJ?IDEA2022中的Java文檔注釋設(shè)置、操作詳述,本文通過圖文并茂的方式給大家介紹IDEA2022?文檔注釋設(shè)置方法,需要的朋友可以參考下
    2022-08-08
  • SpringBoot+EasyPoi實(shí)現(xiàn)excel導(dǎo)出功能

    SpringBoot+EasyPoi實(shí)現(xiàn)excel導(dǎo)出功能

    最新小編遇到這樣一個(gè)需求,根據(jù)檢索條件查詢列表并將結(jié)果導(dǎo)出到excel,實(shí)現(xiàn)過程也非常簡單,感興趣的朋友跟隨小編一起看看吧
    2021-09-09
  • Springboot+Netty+Websocket實(shí)現(xiàn)消息推送實(shí)例

    Springboot+Netty+Websocket實(shí)現(xiàn)消息推送實(shí)例

    這篇文章主要介紹了Springboot+Netty+Websocket實(shí)現(xiàn)消息推送實(shí)例,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • SpringBoot兩種方式接入DeepSeek的實(shí)現(xiàn)

    SpringBoot兩種方式接入DeepSeek的實(shí)現(xiàn)

    本文主要介紹了SpringBoot兩種方式接入DeepSeek的實(shí)現(xiàn),包括HttpClient方式和基于spring-ai-openai的方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • SpringBoot+Vue靜態(tài)資源刷新后無法訪問的問題解決方案

    SpringBoot+Vue靜態(tài)資源刷新后無法訪問的問題解決方案

    這篇文章主要介紹了SpringBoot+Vue靜態(tài)資源刷新后無法訪問的問題解決方案,文中通過代碼示例和圖文講解的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • 淺談一下Java的線程并發(fā)

    淺談一下Java的線程并發(fā)

    大家好,本篇文章主要講的是淺談一下Java的線程并發(fā),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 使用redis的increment()方法實(shí)現(xiàn)計(jì)數(shù)器功能案例

    使用redis的increment()方法實(shí)現(xiàn)計(jì)數(shù)器功能案例

    這篇文章主要介紹了使用redis的increment()方法實(shí)現(xiàn)計(jì)數(shù)器功能案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • java?class?name實(shí)例深入精講

    java?class?name實(shí)例深入精講

    這篇文章主要為大家介紹了java?class?name實(shí)例深入精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09

最新評論

兴和县| 房山区| 海盐县| 策勒县| 南部县| 旌德县| 博白县| 鹿泉市| 安平县| 原平市| 梅州市| 普兰县| 如东县| 崇义县| 莱芜市| 农安县| 南郑县| 锡林郭勒盟| 喜德县| 高雄县| 天峨县| 奎屯市| 庆阳市| 常熟市| 洮南市| 正镶白旗| 泰安市| 四会市| 大名县| 宜城市| 武鸣县| 嫩江县| 汾阳市| 麦盖提县| 江城| 清流县| 台湾省| 荥经县| 远安县| 依兰县| 房产|