溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

@Autowired 的作用和用法是什么?

發(fā)布時(shí)間:2020-07-15 21:54:18 來源:網(wǎng)絡(luò) 閱讀:1467 作者:專注地一哥 欄目:編程語言

@Autowired 的作用是什么?
@Autowired 是一個(gè)注釋,它可以對類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,讓 spring 完成 bean 自動裝配的工作。
@Autowired 默認(rèn)是按照類去匹配,配合 @Qualifier 指定按照名稱去裝配 bean。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import blog.service.ArticleService;
import blog.service.TagService;
import blog.service.TypeService;@Controller
br/>@Controller
//成員屬性字段使用 @Autowired,無需字段的 set 方法@Autowired
br/>@Autowired
//set 方法使用 @Autowired
private ArticleService articleService;@Autowired
br/>@Autowired
this.articleService = articleService;
}
//構(gòu)造方法使用 @Autowired
private TagService tagService;@Autowired
br/>@Autowired
this.tagService = tagService; }
}
?@Autowired的用法
br/>}
}
?@Autowired的用法
<bean id="userDao" class="..."/>
<bean id="userService" class="...">
????<property name="userDao">
??????<ref bean="userDao"/>????</property>
</bean>
這樣你在userService里面要做一個(gè)userDao的setter/getter方法。
但如果你用了@Autowired的話,你只需要在UserService的實(shí)現(xiàn)類中聲明即可。
br/>????</property>
</bean>
這樣你在userService里面要做一個(gè)userDao的setter/getter方法。
但如果你用了@Autowired的話,你只需要在UserService的實(shí)現(xiàn)類中聲明即可。
private IUserDao userdao;Spring@Autowired注解與自動裝配
br/>Spring@Autowired注解與自動裝配
我們編寫spring?框架的代碼時(shí)候。一直遵循是這樣一個(gè)規(guī)則:所有在spring中注入的bean?都建議定義成私有的域變量。并且要配套寫上?get?和?set方法。
Boss?擁有?Office?和?Car?類型的兩個(gè)屬性:??
清單?3. Boss.java
package com.baobaotao;????
public class Boss {????
????private Car car;????
????private Office office;????????//?省略?get/setter?????
????@Override???
br/>????//?省略?get/setter?????
????@Override???
????????return "car:" + car + "/n" + "office:" + office;????
????}????
}????
??System.out.println必須實(shí)現(xiàn)toString方法
我們在?Spring?容器中將?Office?和?Car?聲明為?Bean,并注入到?Boss Bean?中:下面是使用傳統(tǒng)?XML?完成這個(gè)工作的配置文件?beans.xml:??
清單?4. beans.xml?將以上三個(gè)類配置成?Bean???
<?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)我們運(yùn)行以下代碼時(shí),控制臺將正確打出?boss?的信息:??
清單?5.?測試類:AnnoIoCTest.java??
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
br/>????????System.out.println(boss);????
????}????
}????
這說明?Spring?容器已經(jīng)正確完成了?Bean?創(chuàng)建和裝配的工作。??
?2???@Autowired
要實(shí)現(xiàn)我們要精簡程序的目的。需要這樣來處理:
?在applicationContext.xml中加入:
<!--?該?BeanPostProcessor?將自動對標(biāo)注@Autowired?的?Bean?進(jìn)行注入?-->??????<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>?
Spring?通過一個(gè)BeanPostProcessor?對?@Autowired?進(jìn)行解析,所以要讓?@Autowired?起作用必須事先在Spring?容器中聲明?AutowiredAnnotationBeanPostProcessor Bean。??
?修改在原來注入spirng容器中的bean的方法。?????在域變量上加上標(biāo)簽@Autowired,并且去掉?相應(yīng)的get?和set方法
br/>?????在域變量上加上標(biāo)簽@Autowired,并且去掉?相應(yīng)的get?和set方法
package com.baobaotao;????
import org.springframework.beans.factory.annotation.Autowired;????
public class Boss {????????@Autowired???
br/>????@Autowired???
br/>????@Autowired???
????…????
}?????
*?在applicatonContext.xml中?把原來?引用的<porpery >標(biāo)簽也去掉。
<?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?將自動起作用,對標(biāo)注?@Autowired?的?Bean?進(jìn)行自動注入?-->????
br/>????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?將自動起作用,對標(biāo)注?@Autowired?的?Bean?進(jìn)行自動注入?-->????
????????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>???
?這樣,當(dāng)?Spring?容器啟動時(shí),AutowiredAnnotationBeanPostProcessor?將掃描?Spring?容器中所有?Bean,當(dāng)發(fā)現(xiàn)?Bean?中擁有?@Autowired?注釋時(shí)就找到和其匹配(默認(rèn)按類型匹配)的?Bean,并注入到對應(yīng)的地方中去。??
br/>????</bean>????
</beans>???
?這樣,當(dāng)?Spring?容器啟動時(shí),AutowiredAnnotationBeanPostProcessor?將掃描?Spring?容器中所有?Bean,當(dāng)發(fā)現(xiàn)?Bean?中擁有?@Autowired?注釋時(shí)就找到和其匹配(默認(rèn)按類型匹配)的?Bean,并注入到對應(yīng)的地方中去。??
當(dāng)然,您也可以通過?@Autowired?對方法或構(gòu)造函數(shù)進(jìn)行標(biāo)注,如果構(gòu)造函數(shù)有兩個(gè)入?yún)?,分別是?bean1?和bean2,@Autowired?將分別尋找和它們類型匹配的?Bean,將它們作為?CountryService (Bean1 bean1 ,Bean2 bean2)?的入?yún)韯?chuàng)建CountryService Bean。來看下面的代碼:??對方法
package com.baobaotao;????
public class Boss {????
????private Car car;????
????private Office office;?????????@Autowired????
br/>?????@Autowired????
????????this.car = car;????????}????
????@Autowired???
br/>????}????
????@Autowired???
????????this.office = office;????????}????
????…????
}????
這時(shí),@Autowired?將查找被標(biāo)注的方法的入?yún)㈩愋偷?Bean,并調(diào)用方法自動注入這些?Bean。而下面的使用方法則對構(gòu)造函數(shù)進(jìn)行標(biāo)注:??
br/>????}????
????…????
}????
這時(shí),@Autowired?將查找被標(biāo)注的方法的入?yún)㈩愋偷?Bean,并調(diào)用方法自動注入這些?Bean。而下面的使用方法則對構(gòu)造函數(shù)進(jìn)行標(biāo)注:??
public class Boss {????
????private Car car;????
????private Office office;????????@Autowired???
br/>????@Autowired???
????????this.car = car;????
????????this.office = office ;????
????}????
????…????
}????
由于?Boss()?構(gòu)造函數(shù)有兩個(gè)入?yún)?,分別是?car?和?office,@Autowired?將分別尋找和它們類型匹配的?Bean,將它們作為?Boss(Car car ,Office office)?的入?yún)韯?chuàng)建?Boss Bean。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI