淺談Spring Bean的基本配置
User實(shí)體
@Data//lombok提供的有參構(gòu)造@AllArgsConstructorlombok提供的無(wú)參構(gòu)造@NoArgsConstructorpublic class User { private int id; private String name; private int age; private String sex; private String birthday;}
beanFactory.xml
<bean class='edu.xalead.User'><property name='id' value='1806'/><property name='name'> <value>張三</value></property><property name='sex' value='男'/><property name='age' value='18'/><property name='birthday' value='2000-1-1'/> </bean>1.1 set的兩種注入方法
我們?cè)趚ml文件中注入的時(shí)候我們可以寫(xiě)成這樣:
<property name='id' value='1806'/>
也可以寫(xiě)成這樣:
<property name='id'> <value>1806</value></property>
這沒(méi)什么區(qū)別的,不過(guò)我們一般使用前者,畢竟看起來(lái)代碼少,也方便
代碼測(cè)試:
@Test public void test3(){//創(chuàng)建工廠BeanFactory beanFactory = new ClassPathXmlApplicationContext('beanFactory.xml');//從工廠中拿配置好的UserServlet實(shí)例User user = beanFactory.getBean(User.class);System.out.println(user); }
有事我們?cè)谧⑷氲臅r(shí)候有時(shí)候會(huì)看到type:
<property name='id'> <value type='int'>1806</value></property>
這相當(dāng)于一個(gè)類型聲明,聲明value是什么類型的數(shù)據(jù),然后調(diào)用類型轉(zhuǎn)換器將我們寫(xiě)入的字符串轉(zhuǎn)換為我們我們所定義的類型。但其實(shí)這是一個(gè)多余的,當(dāng)我們注入的時(shí)候,會(huì)通過(guò)User對(duì)象進(jìn)行反射從而知道是什么類型。
1.3 Date()類型的注入但有一些特殊的類型是Spring所沒(méi)有的,需要我們自己去定義,就比如Date類型,如果我們這樣寫(xiě)就會(huì)報(bào)錯(cuò)
private Date birthday;
<property name='birthday' value='2000-1-1'/>
Spring是沒(méi)有這個(gè)的轉(zhuǎn)換器,將字符串轉(zhuǎn)換為Date類型,所以其實(shí)我們可以直接用String來(lái)寫(xiě),或者new Date(),但是后者約束性太大,不能得到我們想要的日期,還是前者方便。
二、Spring_scop當(dāng)我們?cè)跍y(cè)試案例中創(chuàng)建兩個(gè)User實(shí)例時(shí),進(jìn)行檢查發(fā)現(xiàn),這兩個(gè)實(shí)例其實(shí)是一個(gè)
BeanFactory beanFactory = new ClassPathXmlApplicationContext('beanFactory.xml');//從工廠中拿配置好的UserServlet實(shí)例User user = beanFactory.getBean(User.class);User user1 = beanFactory.getBean(User.class);System.out.println(user == user1);
如果我們要?jiǎng)?chuàng)建多例模式,就要使用到屬性scope
scope屬性有兩個(gè)值:
1.singleton(默認(rèn)情況下,即單例模式)
2.prototype(多例模式)
<bean scope='prototype'>
我們?cè)谶M(jìn)行測(cè)試答案為false
三、自動(dòng)注入(autowire)我們?cè)趗serServlet中注入userDao
<bean class='edu.xalead.UserDao'></bean><bean class='edu.xalead.UserServlet'> <property name='userDao' ref='userDao'/></bean>
但其實(shí)我們沒(méi)必要這樣寫(xiě),Bean中you自動(dòng)注入的屬性autowire,他有兩個(gè)值:
1.byName,根據(jù)名字注入,即id=“userDao”
<bean class='edu.xalead.UserDao'></bean><bean autowire='byName'/>
2.byType,根據(jù)類型注入,類型注入比較有局限性,同種類型只能注入一個(gè),多了會(huì)報(bào)不是唯一錯(cuò)誤
<bean class='edu.xalead.UserDao'></bean><bean autowire='byType'>四、構(gòu)造注入
<!-- User有個(gè)四參構(gòu)造,我們通過(guò)constructor-arg一個(gè)一個(gè)對(duì)應(yīng)構(gòu)造參數(shù)進(jìn)行值的注入 --><bean class='edu.xalead.User'> <constructor-arg value='1111'/> <constructor-arg value='zhangsan'/> <constructor-arg value='20'/> <constructor-arg value='M'/></bean>
構(gòu)造注入和set注入的不同點(diǎn)就是,加入元素的順序必須和你所創(chuàng)建的實(shí)體(User)類相同,若不同,則會(huì)報(bào)錯(cuò),由于反射過(guò)來(lái)的類型和轉(zhuǎn)換器轉(zhuǎn)換的類型不同,這時(shí)候我們需要加入另一個(gè)屬性index
<!-- User有個(gè)四參構(gòu)造,我們通過(guò)constructor-arg一個(gè)一個(gè)對(duì)應(yīng)構(gòu)造參數(shù)進(jìn)行值的注入 --><bean class='edu.xalead.User'> <constructor-arg value='M' index='3'/> <constructor-arg value='zhangsan' index='1'/> <constructor-arg value='1111'/ index='0'> <constructor-arg value='20' index='2'/></bean>
那什么時(shí)候使用構(gòu)造注入呢?當(dāng)我們自己定義一個(gè)構(gòu)造函數(shù)的時(shí)候使用構(gòu)造注入
public class User { private int id; private String name; private int age; private String sex; private String birthday;//自定義構(gòu)造函數(shù) public User(int id , String name){this.id = id;this.name = name; }}
<bean class='edu.xalead.User'><constructor-arg value='18'/><constructor-arg value='張三'/> </bean>
這個(gè)時(shí)候就不能使用set注入,他會(huì)報(bào)錯(cuò),即使你寫(xiě)出全參構(gòu)造函數(shù)也不行
private String[] photos;
<property name='photos'><array> <value>1.jpg</value> <value>2.jpg</value> <value>3.jpg</value></array></property>六、List注入
private List<String> list;
<property name='list'><list> <value>a</value> <value>b</value> <value>c</value></list></property>七、Set注入
private Set<String> set;
<property name='set'><set> <value>a</value> <value>b</value> <value>c</value></set></property>八、Map注入
private Map<Integer,String> map
<property name='map'><map>//第一種寫(xiě)法 <entry key='1' value='a'/> //第二種寫(xiě)法 <entry key='2'> <value>b</value> </entry> <entry key='3' value='c'/> </map></property>九、Property注入
private Properties prop;
<property name='prop'> <props><prop key='4432'>42341231</prop><prop key='54353'>5464564</prop><prop key='9865'>2659846</prop> </props></property>
到此這篇關(guān)于淺談Spring Bean的基本配置的文章就介紹到這了,更多相關(guān)Spring Bean的配置內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
