网站死链接扫描,网站建设方案书,开发者模式怎么关闭vivo,北京汉邦未来网站建设有限公司context:annotation-config 是用于激活那些已经在spring容器里注册过的bean#xff08;无论是通过xml的方式还是通过package sanning的方式#xff09;上面的注解。 context:component-scan除了具有context:annotation-config的功能之外#xff0c;…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中. [java] view plaincopyprint? 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 idbBeanclasscom.xxx.B/
bean idcBeanclasscom.xxx.C/
bean idaBeanclasscom.yyy.Aproperty namebbb refbBean/property nameccc refcBean/
/bean 加载applicationContext.xml配置文件将得到下面的结果: creating bean B: com.xxx.Bc2ff5
creating bean C: com.xxx.C1e8a1f6
creating bean A: com.yyy.A1e152c5
setting A.bbb with com.xxx.Bc2ff5
setting A.ccc with com.xxx.C1e8a1f6 OK, 这个结果没什么好说的就是完全通过xml的方式不过太过时了下面通过注解的方式来简化我们的xml配置文件 首先我们使用autowire的方式将对象bbb和ccc注入到A中 [java] view plaincopyprint? 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 namebbb refbBean/
property nameccc refcBean/ 移除之后我们的applicationContext.xml配置文件就简化为下面的样子了 bean idbBeanclasscom.xxx.B/
bean idcBeanclasscom.xxx.C/
bean idaBeanclasscom.yyy.A/ 当我们加载applicationContext.xml配置文件之后将得到下面的结果 creating bean B: com.xxx.B5e5a50
creating bean C: com.xxx.C54a328
creating bean A: com.yyy.Aa3d4cf OK, 结果是错误的的究竟是因为什么呢为什么我们的属性没有被注入进去呢 是因为注解本身并不能够做任何事情它们只是最基本的组成部分我们需要能够处理这些注解的处理工具来处理这些注解 这就是context:annotation-config 所做的事情 我们将applicationContext.xml配置文件作如下修改 context:annotation-config /
bean idbBeanclasscom.xxx.B/
bean idcBeanclasscom.xxx.C/
bean idaBeanclasscom.yyy.A/ 当我们加载applicationContext.xml配置文件之后将得到下面的结果 creating bean B: com.xxx.B15663a2
creating bean C: com.xxx.Ccd5f8b
creating bean A: com.yyy.A157aa53
setting A.bbb with com.xxx.B15663a2
setting A.ccc with com.xxx.Ccd5f8b OK, 结果正确了 但是如果我们将代码作如下修改 [java] view plaincopyprint? 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-packagecom.xxx/ 当我们加载applicationContext.xml的时候会得到下面的结果 creating bean B: com.xxx.B1be0f0a
creating bean C: com.xxx.C80d1ff 这是什么原因呢 是因为我们仅仅扫描了com.xxx包及其子包的类而class A是在com.yyy包下所以就扫描不到了 下面我们在applicationContext.xml中把com.yyy也加入进来 context:component-scan base-packagecom.xxx/context:component-scan base-packagecom.xxx,com.yyy/ 然后加载applicationContext.xml就会得到下面的结果 creating bean B: com.xxx.Bcd5f8b
creating bean C: com.xxx.C15ac3c9
creating bean A: com.yyy.Aec4a87
setting A.bbb with com.xxx.Bcd5f8b
setting A.ccc with com.xxx.C15ac3c9 哇结果正确啦 回头看下我们的applicationContext.xml文件已经简化为 context:component-scan base-packagecom.xxx/context:component-scan base-packagecom.xxx,com.yyy/ 了。 那如果我们在applicationContext.xml手动加上下面的配置也就是说既在applicationContext.xml中手动的注册了A的实例对象同时通过component-scan去扫描并注册B,C的对象 context:component-scan base-packagecom.xxx/
bean idaBeanclasscom.yyy.A/ 结果仍是正确的: creating bean B: com.xxx.B157aa53
creating bean C: com.xxx.Cec4a87
creating bean A: com.yyy.A1d64c37
setting A.bbb with com.xxx.B157aa53
setting A.ccc with com.xxx.Cec4a87 虽然class A并不是通过扫描的方式注册到容器中的 但是context:component-scan 所产生的的处理那些注解的处理器工具会处理所有绑定到容器上面的bean不管是通过xml手动注册的还是通过scanning扫描注册的。 那么如果我们通过下面的方式呢我们既配置了context:annotation-config /又配置了context:component-scan base-packagecom.xxx /它们都具有处理在容器中注册的bean里面的注解的功能。会不会出现重复注入的情况呢 context:annotation-config /context:component-scan base-packagecom.xxx/bean idaBeanclasscom.yyy.A/ 不用担心不会出现的 creating bean B: com.xxx.B157aa53
creating bean C: com.xxx.Cec4a87
creating bean A: com.yyy.A1d64c37
setting A.bbb with com.xxx.B157aa53
setting A.ccc with com.xxx.Cec4a87 因为context:annotation-config /和 context:component-scan同时存在的时候前者会被忽略。也就是那些autowireresource等注入注解只会被注入一次 哪怕是你手动的注册了多个处理器spring仍然只会处理一次 [xml] view plaincopyprint? context:annotation-config / context:component-scan base-packagecom.xxx / bean idaBean classcom.yyy.A / bean idbla classorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor / bean idbla1 classorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor / bean idbla2 classorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor / bean idbla3 classorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor / 结果仍是正确的 creating bean B: com.xxx.B157aa53
creating bean C: com.xxx.Cec4a87
creating bean A: com.yyy.A25d2b2
setting A.bbb with com.xxx.B157aa53
setting A.ccc with com.xxx.Cec4a87转载于:https://www.cnblogs.com/sandea/p/3437324.html