详解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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • spring基础系列之JavaConfig配置详解

    早以前,Spring推荐使用XML的方式来定义Bean及Bean之间的装配规则,但是在Spring3之后,Spring提出的强大的JavaConfig这种类型安全的Bean装配方式,它基于Java代码的灵活性,使得装配的过程也变得及其灵活. 使用JavaConfig来装配Bean拥有其自己的一套规则,我们在这里来看一看: 1.规则 规则一:@Configuration注解 我们在定义JavaConfig类时,都会在其上加注@Configuration注解,来表明这是一个配置类,@Configur

  • spring配置扫描多个包问题解析

    spring 配置扫描多个包,有时候我们希望不同功能类型的包放在不同的包下,这就需要 <!-- 自动扫描该包,使 SpringMVC 为包下用了@controller注解的类是控制器 --> <context:component-scan base-package="com.weixiao.ssmcleardb.controller" /> <context:component-scan base-package="com.weixiao.lis

  • Spring MVC配置双数据源实现一个java项目同时连接两个数据库的方法

    前言 本文主要介绍的是关于Spring MVC配置双数据源实现一个java项目同时连接两个数据库的方法,分享出来供大家参考学习,下面来看看详细的介绍: 实现方法: 数据源在配置文件中的配置 <pre name="code" class="java"><?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spring

  • 详解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)

    一.整合原理 二.导包(41个) 1.hibernate (1)hibernate/lib/required (2)hibernate/lib/jpa | java persist api java的持久化规范(接口) (3)数据库驱动 2.struts2 (1)struts-blank.war/WEB-INF/lib/* 注意:javassist-3.18.1-GA.jar包与hibernate中的重复(只保留高版本即可) (2)struts整合spring插件包 注意:这个包一旦导入,那么s

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

    前言 Spring框架对Bean进行装配提供了很灵活的方式,下面归纳一下主要的方式: 在XML中进行显示配置 在Java中进行显示配置 隐式的bean发现机制和自动装配 而自动装配实现就需要注解扫描,这时发现了两种开启注解扫描的方式,即<context:annotation-config/>和<context:component-scan> 下面归纳一下这两种方式的异同点: <context:annotation-config>:注解扫描是针对已经在Spring容器里注

  • 详解Spring框架入门

    一.什么是Spring Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开发.从简单性.可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益.Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. ◆目的:解决企业应用开发的复杂性 ◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 ◆范围:任何Java应用 二.

  • 详解Spring Hibernate连接oracle数据库的配置

    详解Spring Hibernate连接oracle数据库的配置 jdbc.properties文件配置如下  driverClassName=oracle.jdbc.driver.OracleDriver url=jdbc\:oracle\:thin\:@localhost\:1521\: database=OA username=oa password=oa initialSize=2 maxActive=10 maxIdle=2 minIdle=2 removeAbandoned=true

  • 详解Spring框架下向异步线程传递HttpServletRequest参数的坑

    在spring的注解 @RequestMapping 之下可以直接获取 HttpServletRequest 来获得诸如request header等重要的请求信息: @Slf4j @RestController @RequestMapping("/test") public class TestController { private static final String HEADER = "app-version"; @RequestMapping(value

  • 详解spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子. 这有几个需要注意的地方 1.form的enctype="multipart/form-data" 这个是上传文件必须的 2.applicationContext.xml中 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> 关于

  • 详解Spring框架---IOC装配Bean

    IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicationContext.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

  • 详解Spring Boot中如何自定义SpringMVC配置

    目录 前言 一.SpringBoot 中 SpringMVC 配置概述 二.WebMvcConfigurerAdapter 抽象类 三.WebMvcConfigurer 接口 四.WebMvcConfigurationSupport 类-自定义配置 五.WebMvcAutoConfiguration 配置类 – 自动化配置 六.@EnableWebMvc 注解 七.总结 前言 在 Spring Boot 框架中只需要在项目中引入 spring-boot-starter-web 依赖,Spring

  • 详解Spring Kafka中关于Kafka的配置参数

    SpringKafka文档地址:https://docs.spring.io/spring-kafka/reference/htmlsingle kafka文档地址:http://kafka.apache.org/documentation SpringKafka中配置的Java配置实现类:https://github.com/spring-projects/spring-boot/blob/v1.5.4.RELEASE/spring-boot-autoconfigure/src/main/ja

  • 详解Spring框架之基于Restful风格实现的SpringMVC

    如果说现在你要做一个系统,假设说有一个模块属于公告管理,那么我们可能安排路径的时候会这样安排NewsAction路径: 增加新闻:/pages/back/admin/news/add.action: 新闻列表:/pages/back/admin/news/list.action 随着技术的发展,有一种新型的架构设计思想:Restful风格,也就是说利用一个简单的路径,而后根据HTTP提交模式不同.那么可以完成不同的功能,也就是说: 看一个新闻内容:/news/1,GET: 删除新闻:/news/

  • 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    注释介绍 @Cacheable @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @Cacheable 作用和配置方法 参数 解释 example value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如: @Cacheable(value="mycache") @Cacheable(value={"cache1","cache2"} key 缓存的 key,可以为空,如果指定要按照

随机推荐