Spring實(shí)例化對(duì)象的幾種常見方式
前言
Spring框架作為一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)容器,為開發(fā)者提供了多種對(duì)象實(shí)例化的策略。通過這些策略,開發(fā)者可以更加靈活地控制對(duì)象的生命周期和依賴關(guān)系。無論是通過XML配置、注解配置還是Java配置,Spring都能輕松地實(shí)現(xiàn)對(duì)象的實(shí)例化。本文將介紹Spring實(shí)例化對(duì)象的幾種常見方式。
前面的例子都是無參構(gòu)造實(shí)例化,所以這里就不再贅述。
有參構(gòu)造實(shí)例化
先提供一個(gè)有參的構(gòu)造方法:
public UserService(String str){ System.out.println("有參構(gòu)造實(shí)例化對(duì)象"+str); }
然后在配置的xml文件使用constructor-arg添加參數(shù),value為參數(shù)的值:
<bean id="text" class="com.cc.service.UserService" > <constructor-arg name="str" value="hhhhhh"/> </bean>
注意name的值要與形參相同:
運(yùn)行結(jié)果如圖:
在有多個(gè)參數(shù)的情況下,還需要使用index屬性來配置參數(shù)的值(如果name屬性都配置了也可以不用index):
public UserService(String str,int string){ System.out.println("有參構(gòu)造實(shí)例化對(duì)象"+str+","+string); }
<bean id="text" class="com.cc.service.UserService" > <constructor-arg name="str" index="0" value=""/> <constructor-arg name="string" index="1" value="188"/> </bean>
工廠方式實(shí)例化對(duì)象
靜態(tài)工廠方式實(shí)例化對(duì)象
靜態(tài)工廠方式實(shí)例化對(duì)象是通過屬性factory-method來指定一個(gè)靜態(tài)方法,在該靜態(tài)方法中達(dá)到創(chuàng)建對(duì)象的目標(biāo)并返回交給spring容器管理。
<bean id="user" class="com.cc.entity.User" factory-method="createObj"></bean>
public class User { public static Person createObj() { return new Person(); } }
public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext a = new ClassPathXmlApplicationContext("test.xml"); Person user = (Person) a.getBean("user"); System.out.println(user); } }
采用靜態(tài)工廠的方式去實(shí)例化對(duì)象,只需要在bean標(biāo)簽中指定一個(gè)靜態(tài)方法即可,用factory-method屬性來指定,方面名自已取,反正由idea自動(dòng)幫我們創(chuàng)建好。然后我們只需要在創(chuàng)建好的靜態(tài)方法中返回一個(gè)對(duì)象就搞定了。
實(shí)例工廠方式實(shí)例化對(duì)象
實(shí)例工廠方式與靜態(tài)工廠方式略有不同:
靜態(tài)工廠方式是一個(gè)靜態(tài)方法,它直接通過類名調(diào)用,并返回一個(gè)新的bean實(shí)例;
在xml配置文件中,使用<bean>標(biāo)簽定義bean實(shí)例,用factory-method屬性指定靜態(tài)工廠方法名稱
實(shí)例工廠方式是一個(gè)非靜態(tài)方法,它需要在已經(jīng)創(chuàng)建了工廠對(duì)象的基礎(chǔ)上,通過工廠對(duì)象來調(diào)用。
factory-bean指定已經(jīng)創(chuàng)建好的工廠bean的id,再使用factory-method屬性指定工廠方法的名稱
<bean id="user" class="com.cc.entity.User" ></bean> <bean id="person" class="com.cc.entity.Person" factory-bean="user" factory-method="createObj"></bean>
public class User { public User createObj() { return new User(); } }
public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext a = new ClassPathXmlApplicationContext("test.xml"); Object bean = a.getBean("person"); System.out.println(bean); } }
實(shí)現(xiàn)FactoryBean方式
通過這種方式創(chuàng)建對(duì)象,需要實(shí)現(xiàn)FactoryBean接口,并且實(shí)現(xiàn)它的方法,一般只需實(shí)現(xiàn)以下兩個(gè)方法:
T getObject() : 返回創(chuàng)建的對(duì)象的實(shí)例;
Class<?> getObjectType() : 返回創(chuàng)建的對(duì)象實(shí)例的類;
然后在Spring的配置文件中,將 FactoryBean實(shí)現(xiàn)類注冊(cè)為一個(gè)Bean。
public class User implements FactoryBean<Person> { @Override public Person getObject() throws Exception { return new Person(); } @Override public Class<?> getObjectType() { return Person.class; } }
<bean class="com.cc.entity.User" id="user"></bean>
以上就是Spring實(shí)例化對(duì)象的幾種常見方式的詳細(xì)內(nèi)容,更多關(guān)于Spring實(shí)例化對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Security 構(gòu)建rest服務(wù)實(shí)現(xiàn)rememberme 記住我功能
這篇文章主要介紹了Spring Security 構(gòu)建rest服務(wù)實(shí)現(xiàn)rememberme 記住我功能,需要的朋友可以參考下2018-03-03簡單談?wù)凷pringMVC轉(zhuǎn)發(fā)和重定向的區(qū)別
下面小編就為大家?guī)硪黄唵握務(wù)凷pringMVC轉(zhuǎn)發(fā)和重定向的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(4)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07SpringSecurity 測(cè)試實(shí)戰(zhàn)
這篇文章主要介紹了SpringSecurity 測(cè)試實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11淺談MyBatis循環(huán)Map(高級(jí)用法)
這篇文章主要介紹了淺談MyBatis循環(huán)Map(高級(jí)用法),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09