日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring之使用注解实例化Bean并注入属性

發布時間:2025/3/19 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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"> <!-- 開啟注解掃描,到包里面掃描類、屬性、方法上是否有注解 --> <context:component-scan base-package="com.codeliu"/> </beans>

2.注解實例化Bean

(1)實例化Bean有四個注解

  • @Component
  • @Service:業務層
  • @Controller:WEB層
  • @Repository:持久層

雖然分了層,但目前這四個注解的功能是一樣的。

@Service(value = "user") //相當于bean標簽中的id,四種方式功能一樣 // @Component(value = "user") // @Controller(value = "user") // @Repository(value = "user") @Scope(value = "singleton") public class User { public void print() { System.out.println("user......"); } } @Test/*** 使用注解實例化User類*/public void testUser() { // 讀取配置文件 @SuppressWarnings("resource") ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); User user = (User)context.getBean("user"); user.print(); }

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 { // 注入對象類型的屬性,不用提供set方法 // 1.使用自動裝配 // @Autowired // 為byType類型,如果有多個相同類型的,得配合@Qualifier注解 // private UserDao userDao; // 2.不使用自動裝配 @Resource(name = "userDao") private UserDao userDao; // 注入普通類型的屬性 @Value(value = "CodeTiger") private String name; public void print() { System.out.println("UserService......"); userDao.print(); System.out.println(name); } }

為屬性賦值,我們可以使用自動裝配,也可以手動賦值。

@Test/*** 使用注解注入屬性*/public void testUserService() { @SuppressWarnings("resource") ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); UserService service = (UserService)context.getBean("userService"); service.print(); }

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;?????
  • ????
  • ????//?省略?get/setter?????
  • ????
  • ????@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">?????
  • ????
  • ????<!--?該?BeanPostProcessor?將自動起作用,對標注?@Autowired?的?Bean?進行自動注入?-->?????
  • ????<bean?class="org.springframework.beans.factory.annotation.?????
  • ????????AutowiredAnnotationBeanPostProcessor"/>?????
  • ????
  • ????<!--?移除?boss?Bean?的屬性注入配置的信息?-->?????
  • ????<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并注入属性的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。