Spring系列(二) Bean装配
创建应用对象之间协作关系的行为称为装配(wiring), 这也是DI的本质.
Spring中装配Bean的方式
Spring提供了三种装配Bean的方式.
- 隐式的Bean发现机制和自动装配
- Java Config
- Xml Config
Spring可以任意选择三种方式其中的一种或多种组合. 但建议尽量使用自动装配方式以避免产生繁杂的xml配置文件及java代码, 其次是使用类型安全的Java Config, 如果都满足不了需求则最后再考虑xml config.
自动配置
借助于下面两个方面Spring可以实现自动化Bean配置.
- 组件扫描(component scanning): 自动发现上下文种创建的bean
- 自动专配(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)注入的方式有两种, 两种方式各有利弊:
-
<constructor-arg>
或<property>
特点是可以定义集合,数组注入 - 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
不管如何引用, 创建一个根配置会使配置更具层次, 更易于阅读管理.
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
ES6 新特性之 let, const : JavaScript在变量方面的改进。
let : 块级作用域 我们知道,JavaScript是没有块级作用域的,如果在块内使用var声明一个变量,它在代码块外面仍旧是可见的: if (true) { var foo = 3; } console.log(foo); // 3 for (var i = 0; i < 9; i++) { var j = i; } console.log(i); // 9 console.log(j); // 8 可以看到,在上面代码中,我们虽然是在块内声明的变量,但代码块执行完毕后,依然可以访问到相应的变量,说明JavaScript中没有块级作用域的。 而ES6规范给开发者带来了块级作用域(终于跟 C,Java,Kotlin 等语言保持一致了),如果把var换成let命令,我们就可以获得一个块级变量: if (true) { let foo = 3; } console.log(foo); // Uncaught ReferenceError for (let i = 0; i < 9; i++) { let j = i; } console.log(i); // Uncaught...
- 下一篇
分享 — 1
php高性能后端框架——swoole,带协程 alex,轻量级多线程下载工具 wget 命令下载工具 NATAPP 免费的内网穿透
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7设置SWAP分区,小内存服务器的救世主