生活随笔
收集整理的這篇文章主要介紹了
Spring之使用注解实例化Bean并注入属性
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.準(zhǔn)備工作 (1)導(dǎo)入jar包
除了上篇文章使用到的基本jar包外,還得加入aop的jar包,所有jar包如下
所需jar包
(2)配置xml
<?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:context="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 http://www.springframework.org/schema/context/spring-context.xsd"> 2.注解實例化Bean (1)實例化Bean有四個注解
@Component @Service :業(yè)務(wù)層@Controller :WEB層@Repository :持久層雖然分了層,但目前這四個注解的功能是一樣的。
@Service(value = "user") @Test bean的作用域配置 Spring中可以使用scope屬性來配置bean的作用域: singleton:單例,在初始化配置文件時生成單例bean對象 prototype:原型的,在初始化配置文件時不生成bean對象,使用時返回不同的bean對象 request:web環(huán)境下每一個request請求都會返回一個不同的bean,只在本次請求中有效 session:web環(huán)境下每一個request請求都會返回一個不同的bean,在session中有效 3.注解為屬性賦值 首先來個UserDao
@Component(value = "userDao")
public class UserDao { public void print() { System.out.println("userdao......"); } } 再來個service
@Service(value = "userService")
public class UserService { 為屬性賦值,我們可以使用自動裝配,也可以手動賦值。
@Test 4.注解和xml結(jié)合使用 當(dāng)然我們也可以同時使用注解和xml,一般我們在xml中實例化Bean,使用注解為屬性賦值。
Spring@Autowired注解與自動裝配
1 ? 配置文件的方法
我們編寫spring 框架的代碼時候。一直遵循是這樣一個規(guī)則:所有在spring中注入的bean 都建議定義成私有的域變量。并且要配套寫上 get 和 set方法。
Boss 擁有 Office 和 Car 類型的兩個屬性:??? ?? 清單 3. Boss.java
?
[java] ?view plain?copy package ?com.baobaotao;????? ???? public ? class ?Boss?{????? ????private ?Car?car;????? ????private ?Office?office;????? ???? ?????? ???? ????@Override ???? ????public ?String?toString()?{????? ????????return ? "car:" ?+?car?+? "/n" ?+? "office:" ?+?office;????? ????}????? }? ? ? ??System.out.println必須實現(xiàn)toString方法 ?? 我們在 Spring 容器中將 Office 和 Car 聲明為 Bean,并注入到 Boss Bean 中:下面是使用傳統(tǒng) XML 完成這個工作的配置文件 beans.xml:??? ?? 清單 4. beans.xml 將以上三個類配置成 Bean??? ??????????????????? [xhtml] ?view plain?copy <? xml ? version = "1.0" ? encoding = "UTF-8" ? ?> ????? < beans ? xmlns = "http://www.springframework.org/schema/beans" ???? ????xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" ???? ????xsi:schemaLocation ="http://www.springframework.org/schema/beans?????? http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> ????? ????< bean ? id = "boss" ? class = "com.baobaotao.Boss" > ????? ????????< property ? name = "car" ? ref = "car" /> ????? ????????< property ? name = "office" ? ref = "office" ? /> ????? ????</ bean > ????? ????< bean ? id = "office" ? class = "com.baobaotao.Office" > ????? ????????< property ? name = "officeNo" ? value = "002" /> ????? ????</ bean > ????? ????< bean ? id = "car" ? class = "com.baobaotao.Car" ? scope = "singleton" > ????? ????????< property ? name = "brand" ? value = "?紅旗?CA72" /> ????? ????????< property ? name = "price" ? value = "2000" /> ????? ????</ bean > ????? </ beans > ? ?? 當(dāng)我們運行以下代碼時,控制臺將正確打出 boss 的信息:??? ?? 清單 5. 測試類:AnnoIoCTest.java??? ??????????????????? [java] ?view plain?copy import ?org.springframework.context.ApplicationContext;????? import ?org.springframework.context.support.ClassPathXmlApplicationContext;????? public ? class ?AnnoIoCTest?{????? ???? ????public ? static ? void ?main(String[]?args)?{????? ????????String[]?locations?=?{"beans.xml" };????? ????????ApplicationContext?ctx?=?????? ????????????new ?ClassPathXmlApplicationContext(locations);????? ????????Boss?boss?=?(Boss)?ctx.getBean("boss" );????? ????????System.out.println(boss);????? ????}????? }????? ?????? ?? 這說明 Spring 容器已經(jīng)正確完成了 Bean 創(chuàng)建和裝配的工作。??? ?
2 ? @Autowired?
Spring 2.5 引入了 @Autowired 注釋,它可以對類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動裝配的工作。?通過 @Autowired的使用來消除 set ,get方法。
要實現(xiàn)我們要精簡程序的目的。需要這樣來處理:?* 在applicationContext.xml中加入: ?
[c-sharp] ?view plain
?copy <!--?該?BeanPostProcessor?將自動對標(biāo)注?@Autowired?的?Bean?進(jìn)行注入?-->????? ??<bean?class = "org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />?? Spring 通過一個 BeanPostProcessor 對 @Autowired 進(jìn)行解析,所以要讓 @Autowired 起作用必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。? ?
* 修改在原來注入spirng容器中的bean的方法。 ? ???? 在域變量上加上標(biāo)簽@Autowired,并且去掉 相應(yīng)的get 和set方法
清單 6. 使用 @Autowired 注釋的 Boss.java? ?? ? ? ? ? ? ? ??
[java] ?view plain
?copy package ?com.baobaotao;????? import ?org.springframework.beans.factory.annotation.Autowired;????? ???? public ? class ?Boss?{????? ???? ????@Autowired ???? ????private ?Car?car;????? ???? ????@Autowired ???? ????private ?Office?office;????? ???? ????…????? }? ? ? * 在applicatonContext.xml中 把原來 引用的<porpery >標(biāo)簽也去掉。 ?
[xhtml] ?view plain
?copy ???????????? <? xml ? version = "1.0" ? encoding = "UTF-8" ? ?> ????? < beans ? xmlns = "http://www.springframework.org/schema/beans" ???? ????xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" ???? ????xsi:schemaLocation ="http://www.springframework.org/schema/beans?????? http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> ????? ???? ????????? ????< bean ? class ="org.springframework.beans.factory.annotation.????? ????????AutowiredAnnotationBeanPostProcessor"/> ????? ???? ????????? ????< bean ? id = "boss" ? class = "com.baobaotao.Boss" /> ????? ?????? ????< bean ? id = "office" ? class = "com.baobaotao.Office" > ????? ????????< property ? name = "officeNo" ? value = "001" /> ????? ????</ bean > ????? ????< bean ? id = "car" ? class = "com.baobaotao.Car" ? scope = "singleton" > ????? ????????< property ? name = "brand" ? value = "?紅旗?CA72" /> ????? ????????< property ? name = "price" ? value = "2000" /> ????? ????</ bean > ????? </ beans > ???? ?這樣,當(dāng) Spring 容器啟動時,AutowiredAnnotationBeanPostProcessor 將掃描 Spring 容器中所有 Bean,當(dāng)發(fā)現(xiàn) Bean 中擁有 @Autowired 注釋時就找到和其匹配(默認(rèn)按類型匹配)的 Bean,并注入到對應(yīng)的地方中去。??? ?? 按照上面的配置,Spring 將直接采用 Java 反射機(jī)制對 Boss 中的 car 和 office 這兩個私有成員變量進(jìn)行自動注入。所以對成員變量使用 @Autowired 后,您大可將它們的 setter 方法(setCar() 和 setOffice())從 Boss 中刪除。??? ?? 當(dāng)然,您也可以通過 @Autowired 對方法或構(gòu)造函數(shù)進(jìn)行標(biāo)注,如果構(gòu)造函數(shù)有兩個入?yún)?#xff0c;分別是 bean1 和 bean2,@Autowired 將分別尋找和它們類型匹配的 Bean,將它們作為 CountryService (Bean1 bean1 ,Bean2 bean2) 的入?yún)韯?chuàng)建 CountryService Bean。來看下面的代碼:??對方法
?
[java] ?view plain
?copy package ?com.baobaotao;????? ???? public ? class ?Boss?{????? ????private ?Car?car;????? ????private ?Office?office;????? ???? ?????@Autowired ???? ????public ? void ?setCar(Car?car)?{????? ????????this .car?=?car;????? ????}????? ?????? ????@Autowired ???? ????public ? void ?setOffice(Office?office)?{????? ????????this .office?=?office;????? ????}????? ????…????? }????? ?
這時,@Autowired 將查找被標(biāo)注的方法的入?yún)㈩愋偷?Bean,并調(diào)用方法自動注入這些 Bean。而下面的使用方法則對構(gòu)造函數(shù)進(jìn)行標(biāo)注:? ?
[java] ?view plain
?copy package ?com.baobaotao;????? ???? public ? class ?Boss?{????? ????private ?Car?car;????? ????private ?Office?office;????? ?????? ????@Autowired ???? ????public ?Boss(Car?car?,Office?office){????? ????????this .car?=?car;????? ????????this .office?=?office?;????? ????}????? ?????? ????…????? }? ? ? 由于 Boss() 構(gòu)造函數(shù)有兩個入?yún)?#xff0c;分別是 car 和 office,@Autowired 將分別尋找和它們類型匹配的 Bean,將它們作為 Boss(Car car ,Office office) 的入?yún)韯?chuàng)建 Boss Bean。??
?
附:https://www.jianshu.com/p/80df0a6daf65
https://blog.csdn.net/l1212xiao/article/details/80424064
轉(zhuǎn)載于:https://www.cnblogs.com/myseries/p/10825540.html
總結(jié)
以上是生活随笔 為你收集整理的Spring之使用注解实例化Bean并注入属性 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。