创建应用对象之间协作关系的行为称为装配(wiring), 这也是DI的本质.

Spring中装配Bean的方式

Spring提供了三种装配Bean的方式.

  1. 隐式的Bean发现机制和自动装配
  2. Java Config
  3. Xml Config

Spring可以任意选择三种方式其中的一种或多种组合. 但建议尽量使用自动装配方式以避免产生繁杂的xml配置文件及java代码, 其次是使用类型安全的Java Config, 如果都满足不了需求则最后再考虑xml config.

自动配置

借助于下面两个方面Spring可以实现自动化Bean配置.

  1. 组件扫描(component scanning): 自动发现上下文种创建的bean
  2. 自动专配(autowiring) 自动创建对象间依赖

一. 组件扫描:

  • @Component 注解标记的java类会作为组件类. 带参的@Component("beanid"), 参数为bean的名称, 默认为首字母小写的类名. @Component 等同 @Named 注解;

    对应xml配置节点<bean>
  • @ComponentScan 用来启动组件扫描, 默认的扫描范围是该注解标记的类所在的包. 带参的 @ComponentScan(basePackages={"basePackage1","basePackage2"}) 可以指定扫描的包范围 ; 带参的 @ComponentScan(basePackageClasses={ClassNameA.class,InterfaceB.class})这些类或接口所在的包将作为扫描的基础包范围, 相比指定字符串的基础包, 这种方式提供了类型安全性(重构友好的);

    对应的xml配置节点是<context:component-scan>

二. 自动装配

  • @AutoWired 提供了自动装配能力. 构造器注入和setter注入均可以使用该注解, 事实上它可以在任何方法上发挥作用.@AutoWired(required=false) 设置为false在没有匹配到bean时不会抛出异常. @AutoWired等同于@Inject

Java Config

对于无法使用@Conmponent@Autowired注解的, 比如第三方类库的组件, 可以使用java config的方式装配. 同时, javaconfig也是java代码, 他们不应该包含任何业务代码, 实际上两者应该完全分开,所以一般会将java config代码放在单独的包中.

  • @Configuration 注解标识类是一个配置类.
  • @Bean 注解的方法声明为返回bean. @Bean(name='methodname') 参数标识bean的id名称, 默认为方法名称.
@Bean
public A getA(){
return new A();
} @Bean
public B getB(){
return new B(getA());
} @Bean
public C getC(){
return new C(getA());
}

在上面代码中构建组件B,C使用的构造器注入了A的beangetA(), 在一般的java程序中B,C的Bean会分别持有A的不同实例, 但Spring中不是这样, 所有getA()会被拦截, 并返回同一个bean. 默认情况下Spring的bean都是单例的.

可以使用更为简单的方式创建B,C的bean, 代码如下:

@Bean
public B getB(){
return new B(A a); // 也可以使用setter方式, 或者任何其他方式创建bean
} @Bean
public C getC(){
return new C(A a);
}
  • @Import({ClassnameA.class,ClassnameB.class}) 对于不同位置的bean, javaconfig可以使用此注解导入其他配置类.

XML Config

XML是Spring最原始的装配方式, 熟悉Xml config对了解历史项目, 以及渐进重构到java config或自动配置都是有帮助的.

xml配置构造器(setter)注入的方式有两种, 两种方式各有利弊:

  1. <constructor-arg><property> 特点是可以定义集合,数组注入
  2. c-命名控制 或 p-命名空间 特点是简洁, 但不能注入集合; 使用时需要引入XSD.
  • 配置文件的顶部需要声明多个XSD.
  • <bean class="com.xlx.c02.MyClass"> 声明了一个bean, 默认id为com.xlx.c02.MyClass#0, 可以使用属性id为bean指定名称<bean id="myclass" class="com.xlx.c02.MyClass">.
  • <constructor-arg> 用来配置构造器注入的参数, 引用其他bean时使用<constructor-arg ref="otherBeanId">, 等同c-命名空间的属性c:otherBean-ref='otherBeanId', 或者参数数字索引c:_0-ref='otherBeanId'(单参数可以省略数字); 也可以注入字面量值<constructor-arg value="this is value"> 等同c-命名空间的属性c:_name='jery',或 c:_0='jery'(单参数可省略数字)
  • 装配集合
<constuctor-arg>
<list>
<value>first</value>
<value>second</value>
</list>
</constuctor-arg>
  • 设置属性: <property name="propertyName" ref="beanId">p:propertyName-ref="beanId"
  • util 命名空间的功能可以简化一些字面量属性设置, 同样,需要首先声明XSD.
<!--定义集合-->
<util:list id="trackList">
<value>first</value>
<value>second</value>
</util:list> <!--p-命名的方式引用集合-->
p:tracks-ref="trackList"

混合配置

一. Java Config引用其他

  • @Import 可以导入java配置类
  • @ImportResource 可以导入xml配置, 如@ImportResource("classpath:my-config.xml")

二. XML Config 引用其他

  • <import resource='my-config.xml'> 引用其他xml配置
  • <bean> 引用java config

不管如何引用, 创建一个根配置会使配置更具层次, 更易于阅读管理.

Spring系列(二) Bean装配的更多相关文章

  1. Spring系列(三) Bean装配的高级技术

    profile 不同于maven的profile, spring的profile不需要重新打包, 同一个版本的包文件可以部署在不同环境的服务器上, 只需要激活对应的profile就可以切换到对应的环境 ...

  2. 使用Spring IoC进行Bean装配

    Spring概述 Spring的设计严格遵从的OCP(开闭原则),保证对修改的关闭,也就是外部无法改变spring内部的运行流程:提供灵活的扩展接口,也就是可以通过extends,implements ...

  3. Spring学习系列(二) 自动化装配Bean

    一.Spring装配-自动化装配 @Component和@ComponentScan 通过spring注解(@Component)来表明该类会作为组件类,并告知Spring要为这类创建bean,不过组 ...

  4. Spring(二)装配Spring Bean

    控制反转的概念:控制反转是一种通过描述(在Java中或者是XML或者注解)并通过第三方去产生或获取特定对象的方式. 在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependenc ...

  5. Spring系列之bean的使用

    一.Bean的定义 <bean id="userDao" class="com.dev.spring.simple.MemoryUserDao"/> ...

  6. Spring源码系列(二)--bean组件的源码分析

    简介 spring-bean 组件是 Spring IoC 的核心,我们可以使用它的 beanFactory 来获取所需的对象,对象的实例化.属性装配和初始化等都可以交给 spring 来管理. 本文 ...

  7. Spring系列(二):Spring IoC/DI的理解

    这几天重新学习了一下Spring,在网上找了相关的ppt来看,当看到Spring IoC这一章节的时候,先大致浏览了一下内容,有将近50页的内容,内心窃喜~QAQ~,看完这些内容能够对IoC有更深层次 ...

  8. Spring系列二:IoC 容器

    还君明珠双泪垂,恨不相逢未嫁时. 概述 Spring IoC容器是Spring框架的核心.只需要进行简单的容器配置,就可以将创建对象,使用对象,销毁对象联系在一起,从而管理从创建对象到销毁对象的整个生 ...

  9. Spring学习笔记(二)之装配Bean

    一,介绍Bean的装配机制 在Spring中,容器负责对象的创建并通过DI来协调对象之间的关系.但是我们要告诉Spring创建哪些Bean并且如何将其装配在一起.,装配wiring就是DI依赖注入的本 ...

随机推荐

  1. Jenkins pipeline:pipeline 语法详解

    jenkins  pipeline 总体介绍 pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化. ...

  2. Linux+Shell常用命令总结

    因为自己不经常使用linux的命令行工具,但是mac的终端还是经常使用的,有些命令总是要想一会或者百度一下才知道怎么用,抽时间整理了一下常用的命令,作为笔记. 常用命令 查看文件操作: ls :列出当 ...

  3. MyBatis 学习总结 01 快速入门

    本文测试源码下载地址: http://onl5wa4sd.bkt.clouddn.com/MyBatis0918.rar 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级 ...

  4. 【原创】JAVA面试解析(有赞一面)

    本文的题目出自博客 http://www.54tianzhisheng.cn/2018/07/12/youzan/ 但是作者没有给出答案,博主斗胆来制作答案版. 引言 说在前面的话: 本文适合人群:急 ...

  5. codeforces gym #102082C Emergency Evacuation(贪心Orz)

    题目链接: https://codeforces.com/gym/102082 题意: 在一个客车里面有$r$排座位,每排座位有$2s$个座位,中间一条走廊 有$p$个人在车内,求出所有人走出客车的最 ...

  6. php如何解决中文乱码问题?

    为什么会出现中文乱码? 很多新手朋友学习PHP的时候,发现程序中的中文在输出的时候会出现乱码的问题,那么为什么会出现这种乱码的情况呢?一般来说,乱码的出现有2种原因,一种是由于编码(charset) ...

  7. nginx(二)nginx的安装

    下载 nginx官网下载地址 把源码解压缩之后,在终端里运行如下命令: ./configure make make install 默认情况下,Nginx 会被安装在 /usr/local/nginx ...

  8. tcpdump在linux上的常见用法

    https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html tcpdump -i [interface] -w cap.cap ...

  9. Vue 闪现解决

    场景介绍:页面加载数据时,原始代码{{}}闪现. 问题代码 <div class="root"> <ul v-for="user in userProf ...

  10. RQY大佬一晚报告总结

    首先基础真的很重要.今天所有学的东西,都是为明天做铺垫,(这样看好像每天都是基础)基础牢了,学东西也就一看就会的感觉吧. 其次,自学能力很重要,投入很重要.大佬说他自己也不是看一遍书就懂的,而是反复看 ...