详解Spring框架注解扫描开启之配置细节
前⾔
Spring框架对Bean进⾏装配提供了很灵活的⽅式,下⾯归纳⼀下主要的⽅式:
在XML中进⾏显⽰配置
在Java中进⾏显⽰配置
隐式的bean发现机制和⾃动装配
⽽⾃动装配实现就需要注解扫描,这时发现了两种开启注解扫描的⽅式,即<context:annotation-config/>和
<context:component-scan>
下⾯归纳⼀下这两种⽅式的异同点:
<context:annotation-config>:注解扫描是针对已经在Spring容器⾥注册过的Bean
<context:component-scan>:不仅具备<context:annotation-config>的所有功能,还可以在指定的package下⾯扫描对应的bean Demo:
Demo:XML注册Bean⽅式
下⾯给出两个类,类A和类B
st;
pubic class B{
public B(){
System.out.println("B类");
}
}
st;
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类");
}
}
如何我们这时可以通过传统的xml配置在l⾥进⾏bean注册
<bean id="bBean"class="st.B"/>
<bean id="aBean"class="st.A">
<property name="bClass" ref="bBean"/>
</bean>
启动加载l
输出:
类B
类A
通过set的⽅式注⼊B类
Demo:annotation配置注解开启⽅式
st;
pubic class B{
public B(){
System.out.println("B类");
}
}
st;
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类");
}
}
然后我们需要在l⾥注册Bean,假如我们先这样配置,仅仅注册Bean,不开启扫描<bean id="bBean"class="st.B"/>
<bean id="aBean"class="st.A"/>
或者仅仅开启扫描,不注册Bean
<context:annotation-config/>
这时加载l配置
输出:
类B
类A
我们会发现下⾯的@Autowired的⽅法是不能被加载的
@Autowired
public void setBClass(B bClass){
this.bClass = bClass;
System.out.println("通过set的⽅式注⼊B类");
}
解决⽅法:
修改l配置⽂件
<context:annotation-config/>
<bean id="bBean"class="st.B"/>
<bean id="aBean"class="st.A"/>
重新加载配置⽂件,输出正常了
输出:
类B
类A
通过set的⽅式注⼊B类
归纳:<context:annotation-config>:注解扫描是针对已经在Spring容器⾥注册过的Bean Demo:component配置注解开启⽅式
st;
pubic class B{
public B(){
System.out.println("B类");
}
}
st;
@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类");
}
}
然后我们配置⼀下l,开启annotaion-config扫描
<context:annotation-config />
spring怎么读取配置加载配置⽂件:
输出:
类B
类A
原因:<context:annotation-config>:注解扫描是针对已经在Spring容器⾥注册过的Bean,Bean并没有注册过,所以即使开启了@Autowired、@Component注解和配置开启了annotaion-config扫描还是加载不到
修改配置⽂件:
<context:component-scan base-package="st"/>
重新加载配置⽂件:
输出:
类B
类A
通过set的⽅式注⼊B类
归纳:
<context:annotation-config>:注解扫描是针对已经在Spring容器⾥注册过的Bean
<context:component-scan>:不仅具备<context:annotation-config>的所有功能,还可以在指定的package下⾯扫描对应的bean <context:annotation-config />和 <context:component-scan>同时存在的时候,前者会被忽略。
即使注册Bean,同时开启<context:annotation-config />扫描,@autowire,@resource等注⼊注解只会被注⼊⼀次,也即只加载⼀次
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论