詳解Spring框架注解掃描開啟之配置細(xì)節(jié)
前言
Spring框架對Bean進(jìn)行裝配提供了很靈活的方式,下面歸納一下主要的方式:
- 在XML中進(jìn)行顯示配置
- 在Java中進(jìn)行顯示配置
- 隱式的bean發(fā)現(xiàn)機(jī)制和自動裝配
而自動裝配實(shí)現(xiàn)就需要注解掃描,這時(shí)發(fā)現(xiàn)了兩種開啟注解掃描的方式,即<context:annotation-config/>和<context:component-scan>
下面歸納一下這兩種方式的異同點(diǎn):
<context:annotation-config>:注解掃描是針對已經(jīng)在Spring容器里注冊過的Bean
<context:component-scan>:不僅具備<context:annotation-config>的所有功能,還可以在指定的package下面掃描對應(yīng)的bean
Demo:
Demo:XML注冊Bean方式
下面給出兩個(gè)類,類A和類B
package com.test;
pubic class B{
public B(){
System.out.println("B類");
}
}
package com.test;
public class A {
private B bClass;
public void setBClass(B bClass){
this.bClass = bClass;
System.out.println("通過set的方式注入B類");
}
public A(){
System.out.println("A類");
}
}
如何我們這時(shí)可以通過傳統(tǒng)的xml配置在Application.xml里進(jìn)行bean注冊
<bean id="bBean"class="com.test.B"/> <bean id="aBean"class="com.test.A"> <property name="bClass" ref="bBean"/> </bean>
啟動加載Application.xml
輸出:
類B
類A
通過set的方式注入B類
Demo:annotation配置注解開啟方式
package com.test;
pubic class B{
public B(){
System.out.println("B類");
}
}
package com.test;
public class A {
private B bClass;
@Autowired
public void setBClass(B bClass){
this.bClass = bClass;
System.out.println("通過set的方式注入B類");
}
public A(){
System.out.println("A類");
}
}
然后我們需要在Application.xml里注冊Bean,假如我們先這樣配置,僅僅注冊Bean,不開啟掃描
<bean id="bBean"class="com.test.B"/> <bean id="aBean"class="com.test.A"/>
或者僅僅開啟掃描,不注冊Bean
<context:annotation-config/>
這時(shí)加載Application.xml配置
輸出:
類B
類A
我們會發(fā)現(xiàn)下面的@Autowired的方法是不能被加載的
@Autowired
public void setBClass(B bClass){
this.bClass = bClass;
System.out.println("通過set的方式注入B類");
}
解決方法:
修改Application.xml配置文件
<context:annotation-config/> <bean id="bBean"class="com.test.B"/> <bean id="aBean"class="com.test.A"/>
重新加載配置文件,輸出正常了
輸出:
類B
類A
通過set的方式注入B類
歸納:<context:annotation-config>:注解掃描是針對已經(jīng)在Spring容器里注冊過的Bean
Demo:component配置注解開啟方式
package com.test;
pubic class B{
public B(){
System.out.println("B類");
}
}
package com.test;
@Component
public class A {
private B bClass;
@Autowired
public void setBClass(B bClass){
this.bClass = bClass;
System.out.println("通過set的方式注入B類");
}
public A(){
System.out.println("A類");
}
}
然后我們配置一下application.xml,開啟annotaion-config掃描
<context:annotation-config />
加載配置文件:
輸出:
類B
類A
原因:<context:annotation-config>:注解掃描是針對已經(jīng)在Spring容器里注冊過的Bean,Bean并沒有注冊過,所以即使開啟了@Autowired、@Component注解 和配置開啟了annotaion-config掃描還是加載不到
修改配置文件:
<context:component-scan base-package="com.test"/>
重新加載配置文件:
輸出:
類B
類A
通過set的方式注入B類
歸納:
<context:annotation-config>:注解掃描是針對已經(jīng)在Spring容器里注冊過的Bean
<context:component-scan>:不僅具備<context:annotation-config>的所有功能,還可以在指定的package下面掃描對應(yīng)的bean
<context:annotation-config />和 <context:component-scan>同時(shí)存在的時(shí)候,前者會被忽略。
即使注冊Bean,同時(shí)開啟<context:annotation-config />掃描,@autowire,@resource等注入注解只會被注入一次,也即只加載一次
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
intellij idea快速查看當(dāng)前類中的所有方法(推薦)
這篇文章主要介紹了intellij idea快速查看當(dāng)前類中的所有方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
如何使用IDEA新建一個(gè)普通的Javaweb項(xiàng)目
今天給大家普及如何使用IDEA新建一個(gè)普通的Javaweb項(xiàng)目及配置tomcat的方法,在文末給大家提到如果不想每次都重啟tomcat,可以設(shè)置快捷方式,對idea新建Javaweb項(xiàng)目感興趣的朋友一起看看吧2021-06-06
解析Tomcat 6、7在EL表達(dá)式解析時(shí)存在的一個(gè)Bug
這篇文章主要是對Tomcat 6、7在EL表達(dá)式解析時(shí)存在的一個(gè)Bug進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12
Java用戶交互scanner及運(yùn)算結(jié)構(gòu)代碼詳解
這篇文章主要介紹了Java用戶交互scanner及運(yùn)算結(jié)構(gòu)代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
springboot使用shiro-整合redis作為緩存的操作
這篇文章主要介紹了springboot使用shiro-整合redis作為緩存的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java常用API類之Math System tostring用法詳解
System類代表系統(tǒng),系統(tǒng)級的很多屬性和控制方法都放置在該類的內(nèi)部。該類位于java.lang包,Java 的 Math 包含了用于執(zhí)行基本數(shù)學(xué)運(yùn)算的屬性和方法,如初等指數(shù)、對數(shù)、平方根和三角函數(shù),toString() 方法用于返回以一個(gè)字符串表示的 Number 對象值2021-10-10

