自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bean的依赖关系。

自动检测(autodiscovery)比自动装配更进了一步,让Spring能够自动识别哪些类需要被配置成Spring Bean,从而减少对<bean>元素的使用。

1.自动装配属性

1.1  4种类型的自动装配

● byName——把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。如果没有跟属性的名字相匹配的Bean,则该属性不进行装配。
      ● byType——把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应属性中。如果没有跟属性的类型相匹配的Bean,则该属性不被装配。
      ● constructor——把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean构造器的对应入参中。
      ● autodetect——首先尝试使用constructor进行自动装配。如果失败,在尝试使用byType进行自动装配。

      
      byName自动装配:
<bean id = "kenny" class = "com.ouc.test.springs.Instruments" autowire = "byName" >
<property name = "song" value = "bells" />
</bean>

为属性自动装配ID与该属性的名字相同的Bean。

    
     byType自动装配:
    如果Spring寻找到多个Bean,它们的类型与自动装配的属性类型都相匹配,Spring不会猜测哪一个Bean更适合自动装配,而是会抛出异常。
    可以为自动装配标识一个首选Bean,或者可以取消某个Bean自动装配的候选资格。为了使用primary属性,不得不将非首选Bean的primary属性设置为false。
<bean id = "saxophone" class = "com.ouc.test.springs.Saxophone" primary = "false" />

primary属性仅对标识首选Bean有意义。
    如果希望排除某些Bean,可以设置这些Bean的autowire-candidate属性为false。

<bean id = "saxophone" class = "com.ouc.test.springs.Saxophone" autowire-candidate = "false" />
    constructor自动装配:
    如果要通过构造器注入来配置Bean,可以移除<constructor-arg>元素,由Spring在应用上下文中自动选择Bean注入到构造器入参中。
<bean id = "saxophone" class="com.ouc.springs.test.Saxophone"  autowire ="constructor" />
    最佳自动装配:
<bean id = "saxophone" class="com.ouc.springs.test.Saxophone"  autowire ="autodetect" />

1.2 默认自动装配

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
default-autowire="byType" >
</beans>

2 .使用注解装配

Spring容器默认禁用注解装配。
    启用注解装配最简单的方式是使用Spring的context命名空间配置中的<context:annotation-config>元素。
    Spring 3 支持几种不同的用于自动装配的注解:
     ● Spring自带的@Autowired注解;
     ● JSR-330的@Inject注解;
     ● JSR-250的@Resource注解。
    

2.1 使用@Autowired

  @Autowired
public void setInstrument(Instrument instrument){
this.instrument = instrument;
}

Spring会尝试对该方法执行byType自动装配,可以使用@Autowired标注需要自动装配Bean引用的任意方法。
     可以使用@Autowired注解直接标注属性,并删除setter方法:

  @Autowired
private Instrument instrument;

1)可选的自动装配:
        默认情况下,@Autowired所标注的属性或参数必须是可以装配的。如果没有Bean可以装配到@Autowired所标注的属性或参数中,自动装配就会失败(抛出NoSuchBeanDefinitionException).
        可以通过设置@Autowired的required属性为false来配置自动装配是可选的。

    @Autowired(required=false)
private Instrument instrument;

2)限定歧义性的依赖
    @Qualifier注解缩小了自动装配挑选候选Bean的范围,通过指定Bean的ID把选择范围缩小到只剩下一个Bean。

    @Autowired
@Qualifier("guitar")
private Instrument instrument;

3)创建自定义的限定器(Qualifier)

    import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Qualifier; @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface StringedInstrument{}

2.2 借助@Inject实现基于标准的自动装配

    @Inject
private Instrument instrument;

@Inject没有required属性。
     限定@Inject所标注的属性。

    @Inject
@Named("guitar")
private Instrument instrument;

@Named通过Bean的ID来标识可选择的Bean,@Named实际上是一个使用@Qualifier注解所标注的注解。
    创建自定义的JSR-330 Qualifier

    import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier; @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface StringedInstrument{}

2.3 在注解注入中使用表达式

      @Value("#{systemProperties.myFavoriteSong}")
private String song;

3.自动检测Bean

使用<context:component-scan>元素配置自动检测。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context=="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/beans/spring-context-3.1.xsd" > <context:component-scan base-package="com.ouc.springs.test" >
</context:component-scan>
</beans>

3.1为自动检测标注Bean

默认情况下,<context:component-scan>查找使用构造型(stereotype)注解所标注的类,这些特殊的注解如下:
       @Component——通用的构造型注解,标识该类为Spring组件。
       @Controller——标识将该类定义为Spring MVC Controller。
       @Repository——标识将该类定义为数据仓库。
       @Service——标识将该类定义为服务。
        使用@Component标注的任意自定义注解。

3.2 过滤组件扫描

通过为<context:component-scan>配置<context:include-filter>和<context:exclude-filter>子元素,可以随意调整扫描行为。

<context:component-scan base-package="com.ouc.springs.test" >
<context:include-filter type="assignable" expression="com.ouc.springs.tst.Instrument" />
<context:exclude-filter type="annotation" expression="com.ouc.springs.tst.SkipIt" />
</context:component-scan>

4.使用Spring基于Java的配置

4.1 定义一个配置类

   import org.springframework.context.annotation.Configuration;

   @Configuration
public class SpringIdolConfig{}

@Configuration注解会作为一个标识告知Spring:这个类将包含一个或多个Spring Bean的定义。

4.2 声明一个简单的Bean

   @Bean
public Performer duke(){
return new Juggler();
}

@Bean告知Spring这个方法将返回一个对象,该对象应该被注册为Spring应用上下文中的一个Bean,方法名将作为该Bean的ID。

Spring学习笔记—最小化Spring XML配置的更多相关文章

  1. Spring 学习笔记(四)—— XML配置依赖注入

    依赖注入(DI)与控制反转(IoC)是同一个概念,都是为了处理对象间的依赖关系. 通过DI/IoC容器,相互依赖的对象由容器负责创建和装配,而不是在代码中完成. Spring支持通过setter方法和 ...

  2. 【Spring学习笔记-MVC-15】Spring MVC之异常处理

    作者:ssslinppp       1. 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理 ...

  3. Spring学习笔记五:Spring进行事务管理

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6776256.html  事务管理主要负责对持久化方法进行统一的提交或回滚,Spring进行事务管理即我们无需在 ...

  4. struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)

    课时22 基于XML配置方式实现对action的所有方法进行校验   使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...

  5. spring学习笔记 星球日one - xml方式配置bean

    ide: idea lib包的导入:http://webcache.googleusercontent.com/search?q=cache:http://zyjustin9.iteye.com/bl ...

  6. Spring学习笔记之二----基于XML的Spring AOP配置

    在Spring配置文件中,通常使用<aop:config>元素来设置AOP,其中应包括: <aop:aspect>指定aspect,aspect是一个POJO类,包含了很多的a ...

  7. Spring学习笔记:jdbcTemplate和数据源配置

    一.使用Spring框架jdbcTemplate实现数据库的增删改查 1.数据库 /* SQLyog Ultimate v8.32 MySQL - 5.7.19-log : Database - in ...

  8. spring学习笔记(22)声明式事务配置,readOnly无效写无异常

    在上一节内容中.我们使用了编程式方法来配置事务,这种优点是我们对每一个方法的控制性非常强.比方我须要用到什么事务,在什么位置假设出现异常须要回滚等.能够进行非常细粒度的配置.但在实际开发中.我们可能并 ...

  9. Spring学习笔记之六(数据源的配置)

    1.前言 上一篇博客分析了,Spring中实现AOP的两种动态代理的机制,以下这篇博客.来解说一下Spring中的数据源的配置.  2.DAO支持的模板类 Spring提供了非常多关于Dao支持的模板 ...

随机推荐

  1. PYTHON 自动化学习之路

    一.用户交互小程序 username = 'gyc' password = 'gyc' u = input("what is you name?:") p = input(&quo ...

  2. 寻找下一款Prisma APP:深度学习在图像处理中的应用探讨(阅读小结)

    原文链接:https://yq.aliyun.com/articles/61941?spm=5176.100239.bloglist.64.UPL8ec 某会议中的一篇演讲,主要讲述深度学习在图像领域 ...

  3. 解压.tar.gz出错gzip: stdin: not in gzip format tar: /Child returned status 1 tar: Error is not recoverable: exiting now

    先查看文件真正的属性是什么? [root@xxxxx ~]# tar -zxvf tcl8.4.16-src.tar.gz  gzip: stdin: not in gzip format tar: ...

  4. linux 命令free -m 命令结果分析

    free -m 命令详解 free -m 分析系统内存使用情况:

  5. 转:SQL子句的执行顺序

    SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...

  6. easyui datagrid中datetime字段的显示和增删改查问题

    datagrid中datetime字段的异常显示: 使用过easyui datagrid的应该都知道,如果数据库中的字段是datetime类型,绑定在datagrid显式的时候会不正常显示,一般需要借 ...

  7. 深入浅出Java回调机制

    本文转载自http://hellosure.iteye.com/blog/1130176 在网上看到了一个比喻,觉得很形象,这里借用一下: 你有一个复杂的问题解决不了,打电话给你的同学,你的同学说可以 ...

  8. IPC---共享内存

    共享内存就是允许两个或多个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据时,不需要在客户进程和服务器进程之间幅值,因此是最快的一种IPC.不同进程之间共享的内存通常安 ...

  9. ios 使用xib时,在UIScrollView中添建内容view时,使用约束的注意

    请参与一下链接:http://segmentfault.com/a/1190000002462033 简单的说下,就是必须写满一个view的6个约束,就是上下左右高宽,让scrollview 能够根据 ...

  10. rabbitMQ中vhost虚拟主机的理解

    每个virtual host本质上都是一个RabbitMQ Server,拥有它自己的queue,exchagne,和bings rule等等.这保证了你可以在多个不同的application中使用R ...