详解Spring框架注解扫描开启之配置细节

作者:Javahih 时间:2022-11-01 18:04:14 

前言

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


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类");
 }
}

如何我们这时可以通过传统的xml配置在Application.xml里进行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/>

这时加载Application.xml配置

输出:
类B
类A

我们会发现下面的@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>:注解扫描是针对已经在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>:注解扫描是针对已经在Spring容器里注册过的Bean,Bean并没有注册过,所以即使开启了@Autowired、@Component注解 和配置开启了annotaion-config扫描还是加载不到

修改配置文件:


<context:component-scan base-package="com.test"/>

重新加载配置文件:

输出:
类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等注入注解只会被注入一次,也即只加载一次

来源:http://www.jianshu.com/p/cd0091aacf89

标签:spring,注解,扫描
0
投稿

猜你喜欢

  • C#使用HtmlAgilityPack抓取糗事百科内容实例

    2022-01-16 10:45:16
  • Unity 通过LineRenderer绘制两点之间的直线操作

    2021-08-04 04:15:08
  • Java编程实现提取文章中关键字的方法

    2022-10-10 22:08:42
  • java中set接口使用方法详解

    2023-03-15 06:10:12
  • 简单了解Java方法的定义和使用实现

    2021-11-07 06:12:53
  • C/C++常用函数易错点分析

    2021-11-13 23:21:30
  • SSM项目使用拦截器实现登录验证功能

    2023-06-17 16:12:38
  • Spring MVC URL地址映射的示例代码

    2022-12-09 19:53:33
  • C#多线程系列之线程完成数

    2021-12-24 03:07:47
  • c#自定义Attribute获取接口实现示例代码

    2022-09-02 05:05:26
  • Java 微信公众号开发相关总结

    2021-11-11 03:43:30
  • Java 高并发三:Java内存模型和线程安全详解

    2021-10-24 07:04:13
  • 基于Java实现的图的广度优先遍历算法

    2021-06-02 06:51:20
  • Android编程开发之Spinner组件用法

    2022-09-02 17:55:26
  • c# 值类型实例构造器

    2023-12-23 16:10:10
  • Java中一个for语句导致无穷大死循环的例子

    2022-12-17 08:13:33
  • Java 回调函数详解及使用

    2023-11-03 02:32:35
  • Android多渠道打包时获取当前渠道的方法

    2021-06-18 18:10:25
  • android控件实现多张图片渐变切换

    2022-06-18 20:11:57
  • Unity3D使用右键菜单打开工程

    2023-07-18 05:08:46
  • asp之家 软件编程 m.aspxhome.com