生活随笔
收集整理的這篇文章主要介紹了
Spring之使用注解实例化Bean并注入属性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.準備工作
(1)導入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:業務層
- @Controller:WEB層
- @Repository:持久層
雖然分了層,但目前這四個注解的功能是一樣的。
@Service(value = "user") @Test bean的作用域配置
Spring中可以使用scope屬性來配置bean的作用域:
singleton:單例,在初始化配置文件時生成單例bean對象
prototype:原型的,在初始化配置文件時不生成bean對象,使用時返回不同的bean對象
request:web環境下每一個request請求都會返回一個不同的bean,只在本次請求中有效
session:web環境下每一個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結合使用
當然我們也可以同時使用注解和xml,一般我們在xml中實例化Bean,使用注解為屬性賦值。
Spring@Autowired注解與自動裝配
1 ? 配置文件的方法
我們編寫spring 框架的代碼時候。一直遵循是這樣一個規則:所有在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必須實現toString方法 ?? 我們在 Spring 容器中將 Office 和 Car 聲明為 Bean,并注入到 Boss Bean 中:下面是使用傳統 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>? ?? 當我們運行以下代碼時,控制臺將正確打出 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 容器已經正確完成了 Bean 創建和裝配的工作。??? ? |
2 ? @Autowired?
Spring 2.5 引入了 @Autowired 注釋,它可以對類成員變量、方法及構造函數進行標注,完成自動裝配的工作。?通過 @Autowired的使用來消除 set ,get方法。
要實現我們要精簡程序的目的。需要這樣來處理:?
* 在applicationContext.xml中加入:?
[c-sharp]?view plain
?copy <!--?該?BeanPostProcessor?將自動對標注?@Autowired?的?Bean?進行注入?-->???????<bean?class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>?? Spring 通過一個 BeanPostProcessor 對 @Autowired 進行解析,所以要讓 @Autowired 起作用必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。? ?
* 修改在原來注入spirng容器中的bean的方法。?
???? 在域變量上加上標簽@Autowired,并且去掉 相應的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 >標簽也去掉。?
[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>???? ?這樣,當 Spring 容器啟動時,AutowiredAnnotationBeanPostProcessor 將掃描 Spring 容器中所有 Bean,當發現 Bean 中擁有 @Autowired 注釋時就找到和其匹配(默認按類型匹配)的 Bean,并注入到對應的地方中去。???
??
按照上面的配置,Spring 將直接采用 Java 反射機制對 Boss 中的 car 和 office 這兩個私有成員變量進行自動注入。所以對成員變量使用 @Autowired 后,您大可將它們的 setter 方法(setCar() 和 setOffice())從 Boss 中刪除。???
??
當然,您也可以通過 @Autowired 對方法或構造函數進行標注,如果構造函數有兩個入參,分別是 bean1 和 bean2,@Autowired 將分別尋找和它們類型匹配的 Bean,將它們作為 CountryService (Bean1 bean1 ,Bean2 bean2) 的入參來創建 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 將查找被標注的方法的入參類型的 Bean,并調用方法自動注入這些 Bean。而下面的使用方法則對構造函數進行標注:? ?
[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() 構造函數有兩個入參,分別是 car 和 office,@Autowired 將分別尋找和它們類型匹配的 Bean,將它們作為 Boss(Car car ,Office office) 的入參來創建 Boss Bean。??
?
附:https://www.jianshu.com/p/80df0a6daf65
https://blog.csdn.net/l1212xiao/article/details/80424064
轉載于:https://www.cnblogs.com/myseries/p/10825540.html
總結
以上是生活随笔為你收集整理的Spring之使用注解实例化Bean并注入属性的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。