关闭

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

标签: spring
5317人阅读 评论(0) 收藏 举报
分类:

前言

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

1
0
查看评论

利用注解实现spring基本配置详解

Spring注解 1.准备工作 (1)导入common-annotations.jar (2)导入schema文件 文件名为spring-context-2.5.xsd (3)在xml的beans节点中配置 2.xml配置工作 ...
  • vstar283551454
  • vstar283551454
  • 2013-03-17 15:04
  • 61337

spring扫描注解

在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的Java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean base-package="com.hundsun.fs...
  • u010343544
  • u010343544
  • 2016-12-30 15:10
  • 2041

spring注解扫描配置

spring的配置文件中配置: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quo...
  • Senssic
  • Senssic
  • 2014-03-10 17:18
  • 2837

Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以取代XML配置文件。开发人员对注解(Annotation)的态度也是萝卜青菜各有所爱,个人认为注解可...
  • chjttony
  • chjttony
  • 2011-04-04 16:14
  • 59294

使用spring注解 自动装配以及自动扫描机制 实现零xml配置的前提

首先了解从spring2.5增加的新特性: 这些新特性包括:注解驱动的依赖性注入(annotation-driven dependency injection),使用注解而非XML元数据来自动侦测classpath上的Spring组件,注解对生命周期方法的支持,一个新的web控制器模型将请求映射到...
  • woshiwxw765
  • woshiwxw765
  • 2012-05-25 23:40
  • 37093

springMVC和spring各自扫描自己的注解不要相互混淆(entityManager.flush()报错no transaction is in progress)

1、问题         执行 entityManager.flush();  总是报错:javax.persistence.TransactionRequiredException: no transaction is in p...
  • pucao_cug
  • pucao_cug
  • 2015-12-19 21:54
  • 11540

SpringMVC和Spring的配置文件扫描包详解

其实Spring和SpringMVC是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题,我们在此来分析和理解Spring和SpringMVC的父子容器关系并且给出Spring和SpringMVC配置文件中包扫描的官方推荐方式。  在Spring整体框架的核心概念中,容器是核心思想,就是用来...
  • uniqueweimeijun
  • uniqueweimeijun
  • 2017-05-23 09:00
  • 9095

关于spring、pringmvc整合时注解扫描

一般都设置springmvc.xml只让扫@controller注解 spring.xml不让扫@controller注解 (貌似这样可以避免一些事务上的问题) 具体配置如下:springmvc.xml:<!-- 使用Annotation自动注册Bean,只扫描@Controller -...
  • Fasure_Smile
  • Fasure_Smile
  • 2016-08-05 17:09
  • 892

Spring常用注解,自动扫描bean

1 引入context命名空间(在Spring的配置文件中),配置文件如下: Xml代码   xmlns:context="http://www.springframework.org/schema/context" ...
  • u011518709
  • u011518709
  • 2015-06-09 15:29
  • 2043

Spring Aop实例之xml配置

上篇博客《3幅图让你了解Spring AOP》中介绍了aop通知类型,AOP的配置方式有2种方式:xml配置和AspectJ注解方式。今天我们就来实践一下xml配置方式。
  • xiaoxian8023
  • xiaoxian8023
  • 2013-12-19 08:49
  • 37032
    个人资料
    • 访问:516859次
    • 积分:5532
    • 等级:
    • 排名:第5721名
    • 原创:125篇
    • 转载:7篇
    • 译文:6篇
    • 评论:258条
    About Me
    Turtles
    Clock
    博客专栏