applicationContext.xml中<context:annotationITeye - 超凡娱乐

applicationContext.xml中<context:annotationITeye

2019年02月25日12时33分12秒 | 作者: 曦晨 | 标签: 装备,成果,文件 | 浏览: 2624

Difference between context:annotation-config vs context:component-scan

 

context:annotation-config  是用于激活那些现已在spring容器里注册过的bean(无论是

经过xml的方法仍是经过package sanning的方法)上面的注解。

context:component-scan 除了具有 context:annotation-config 的功用之外,

context:component-scan 还可以在指定的package下扫描以及

注册javabean 。

 

下面咱们经过例子来具体检查他们的差异,

有三个class   A,B,C,而且B,C的目标被注入到A中.

 

package com.xxx;
public class B {
 public B() {
 System.out.println("creating bean B: " + this);
package com.xxx;
public class C {
 public C() {
 System.out.println("creating bean C: " + this);
package com.yyy;
import com.xxx.B;
import com.xxx.C;
public class A { 
 private B bbb;
 private C ccc;
 public A() {
 System.out.println("creating bean A: " + this);
 public void setBbb(B bbb) {
 System.out.println("setting A.bbb with " + bbb);
 this.bbb = bbb;
 public void setCcc(C ccc) {
 System.out.println("setting A.ccc with " + ccc);
 this.ccc = ccc; 
}

 

 

在applicationContext.xml中参加下面的装备 :

 

 bean id="bBean" / 
 bean id="cBean" / 
 bean id="aBean" 
 property name="bbb" ref="bBean"/ 
 property name="ccc" ref="cBean"/ 
 /bean 

 

 

 

加载applicationContext.xml装备文件,将得到下面的成果:

 

creating bean B: com.xxx.B@c2ff5
creating bean C: com.xxx.C@1e8a1f6
creating bean A: com.yyy.A@1e152c5
setting A.bbb with com.xxx.B@c2ff5
setting A.ccc with com.xxx.C@1e8a1f6

 

 

 

OK, 这个成果没什么好说的,就是彻底经过xml的方法,不过太过期了,下面经过注解的方法来简化咱们的xml装备文件

首要,咱们运用autowire的方法将目标bbb和ccc注入到A中:

 

 

package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import com.xxx.B;
import com.xxx.C;
public class A { 
 private B bbb;
 private C ccc;
 public A() {
 System.out.println("creating bean A: " + this);
 @Autowired
 public void setBbb(B bbb) {
 System.out.println("setting A.bbb with " + bbb);
 this.bbb = bbb;
 @Autowired
 public void setCcc(C ccc) {
 System.out.println("setting A.ccc with " + ccc);
 this.ccc = ccc;
}

 

 

然后,咱们就可以从applicationContext.xml中移除下面的装备

 

 property name="bbb" ref="bBean"/ 
 property name="ccc" ref="cBean"/ 

 

 

 

移除之后,咱们的applicationContext.xml装备文件就简化为下面的姿态了

 bean id="bBean" / 
 bean id="cBean" / 
 bean id="aBean" / 

  

 

 

当咱们加载applicationContext.xml装备文件之后,将得到下面的成果:

 

creating bean B: com.xxx.B@5e5a50
creating bean C: com.xxx.C@54a328
creating bean A: com.yyy.A@a3d4cf

 

OK, 成果是过错的的,终究是由于什么呢?为什么咱们的特点没有被注入进去呢?

是由于注解自身并不可以做任何工作,它们只是最基本的组成部分,咱们需求可以处理这些注解的处理东西来处理这些注解

这就是 context:annotation-config  所做的工作

咱们将applicationContext.xml装备文件作如下修正:

 

 context:annotation-config / 
 bean id="bBean" / 
 bean id="cBean" / 
 bean id="aBean" / 

  

 

 

当咱们加载applicationContext.xml装备文件之后,将得到下面的成果:

 

creating bean B: com.xxx.B@15663a2
creating bean C: com.xxx.C@cd5f8b
creating bean A: com.yyy.A@157aa53
setting A.bbb with com.xxx.B@15663a2
setting A.ccc with com.xxx.C@cd5f8b

 

OK, 成果正确了

可是假如咱们将代码作如下修正:

 

 

package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class B {
 public B() {
 System.out.println("creating bean B: " + this);
package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class C {
 public C() {
 System.out.println("creating bean C: " + this);
package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.xxx.B;
import com.xxx.C;
@Component
public class A { 
 private B bbb;
 private C ccc;
 public A() {
 System.out.println("creating bean A: " + this);
 @Autowired
 public void setBbb(B bbb) {
 System.out.println("setting A.bbb with " + bbb);
 this.bbb = bbb;
 @Autowired
 public void setCcc(C ccc) {
 System.out.println("setting A.ccc with " + ccc);
 this.ccc = ccc;
}

 

 

 

applicationContext.xml装备文件修正为:

 

 context:annotation-config / 

 

当咱们加载applicationContext.xml装备文件之后,却没有任何输出,这是为什么呢?

那是由于 context:annotation-config / 仅可以在现已在现已注册过的bean上面起作用。关于没有在spring容器中注册的bean,它并不能履行任何操作。

可是不必忧虑, context:component-scan 除了具有 context:annotation-config / 的功用之外,还具有主动将带有@component,@service,@Repository等注解的目标注册到

spring容器中的功用。

咱们将applicationContext.xml装备文件作如下修正:

 

 context:component-scan base-package="com.xxx"/ 

 

当咱们加载applicationContext.xml的时分,会得到下面的成果:

 

creating bean B: com.xxx.B@1be0f0a
creating bean C: com.xxx.C@80d1ff

 

这是什么原因呢?

是由于咱们只是扫描了com.xxx包及其子包的类,而class  A是在com.yyy包下,所以就扫描不到了

下面咱们在applicationContext.xml中把com.yyy也参加进来:

 

 context:component-scan base-package="com.xxx"/ 
 context:component-scan base-package="com.xxx,com.yyy"/ 
然后加载applicationContext.xml就会得到下面的成果:
creating bean B: com.xxx.B@cd5f8b
creating bean C: com.xxx.C@15ac3c9
creating bean A: com.yyy.A@ec4a87
setting A.bbb with com.xxx.B@cd5f8b
setting A.ccc with com.xxx.C@15ac3c9

 

哇,成果正确啦 !

回头看下咱们的applicationContext.xml文件,现已简化为:

 

 context:component-scan base-package="com.xxx"/ 
 context:component-scan base-package="com.xxx,com.yyy"/ 

 

了。

 

那假如咱们在applicationContext.xml手动加上下面的装备,也就是说既在applicationContext.xml中手动的注册了A的实例目标,一起,经过component-scan去扫描并注册B,C的目标

 

 context:component-scan base-package="com.xxx"/ bean id="aBean" / 

 

成果仍是正确的:

 

creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@1d64c37
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87

 

尽管class  A并不是经过扫描的方法注册到容器中的 ,可是 context:component-scan  所发生的的处理那些注解的处理器东西,会处理一切绑定到容器上面的bean,

不管是经过xml手动注册的仍是经过scanning扫描注册的。

那么,假如咱们经过下面的方法呢?咱们既装备了 context:annotation-config / ,又装备了 context:component-scan base-package="com.xxx" / ,它们都具有处理在

容器中注册的bean里边的注解的功用。会不会呈现重复注入的状况呢?

 

 context:annotation-config / context:component-scan base-package="com.xxx"/ bean id="aBean" / 

 

不必忧虑,不会呈现的:

 

creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@1d64c37
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87

 

由于 context:annotation-config / 和  context:component-scan 一起存在的时分,前者会被疏忽。也就是那些@autowire,@resource等注入注解只会被注入一次

哪怕是你手动的注册了多个处理器,spring依然只会处理一次:

 

 context:annotation-config / 
 context:component-scan base-package="com.xxx" / 
 bean id="aBean" / 
 bean id="bla" / 
 bean id="bla1" / 
 bean id="bla2" / 
 bean id="bla3" / 

 

 

成果仍是正确的:

 

creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@25d2b2
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87

 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表超凡娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章