文档章节

镜子的Spring之旅之自动装配

镜子哥哥
 镜子哥哥
发布于 2016/08/06 17:24
字数 1102
阅读 4
收藏 0

Part 1 Bean的自动装配(autowiring)

Autowiring : Spring 自动识别如何装配Bean的依赖关系,有助于减少 <property> 和<constructor-arg> 元素使用。

4 种自动装配类型 :

  • byName 将与Bean属性具有相同名字(或者ID)的其他Bean自动装配到Bean属性中,无匹配则不装配;

<bean autowire = “byName”/>

  • byType 将与Bean属性具有相同类型的其他Bean自动装配到Bean属性中,无匹配则不装配; autowire = “byType” 如果检测到多个bean与属性类型相同,Spring会抛出异常。解决方法: ①Primary属性标识首选Bean。由于其默认为true,so将设置非首选bean primary = “false”; ②取消对某个bean自动装配的候选资格 autowire-candidate = “false”;

  • constructor 把与构造器入参具有相同类型的其他bean自动装配到bean构造器对应入参中; autowire = “constructor”

  • autodetect 首先尝试用constructor进行自动装配,失败再尝试用byType装配。

默认自动装配

如果需要为spring应用上下文中每一个或者其中大多数bean配置相同的自动装配属性,可在根元素 <beans>属性上加一个 default-autowire属性, 这个默认属性可被<bean>的autowire属性覆盖。

混合使用自动装配和显示装配

为bean选择了自动装配,仍可用显示装配某些属性来覆盖自动装配; 例外:使用constructor时必需让Spring自动装配所以入参,即不能混用constructor自动装配和<constructor-arg>元素。

Part 2 面向注解的Bean装配

Spring容器默认禁用注解装配,最简单的启用方式是使用context:annotation-config/元素。

<?xml version=”1.0” encoding=”UTF-8”>
<beans …>
<context:annotation-config/>
<! - - bean declarations go here - - >
</beans>

@Autowired

@Autowired注解可用来标注任意方法(byType);构造器,即使没有使用<constructor-arg>配置bean;直接标注属性,不会受限于private关键字。

没有bean满足条件

@Autowired具有强契约性,其所注明的属性或参数必须是可装配的,如果没有bean可以装配到它标注的,自动装配就会失败,抛出NoSuchBeanDefinitionException。属性不一定非要装配,Null值也是可以接受的情况下,可设置required属性为false来配置自动装配可选:

@Autowired(required=false)
private Instrument instrument;

使用构造器装配时只有一个required可以为true,其余都为false;标注多个构造器时,Spring会选择满足装配条件的入参最多的构造器。

多个bean满足条件 为了帮助判断,可配合使用@Qualifier,指定beanID,将自动装配由byType转为显示的byName,缩小装配范围。

@Autowired
@Qualifier(“guitar”)
private Instrument instrument;

可在guitar的bean中加qualifier元素

<bean …><qualifier value=””/></bean>

可直接用@Qualifier标注Guitar类

创建自定义限定器(Qualifier)

@Inject

Java依赖注入规范 JSR-330(或称at inject)

@Inject与@Autowired类似,范围大,不过没有required属性,所标注的依赖关系不存在必报错,

可要求@Inject注入Provider,Provider接口可实现bean的延迟注入与注入多个实例等功能。

多个bean满足条件时可用@Named配合(通过bean ID),工作方式非常类似于@Qualifier(默认通过Bean ID)。

自定义限定器Qualifier,除了导入的包不一样,与Spring自定义方式相同。

@Value 装配String类型的参数(表达式),他的计算结果可以是任意类型,搭配SpEL表达式,可动态求值。 @Value(””) @Value(”#( )”)

Part 3 Bean 的自动检测(autodiscovery)

Autodiscovery : Spring 自动识别哪些类需要装配成Bean,减少<bean>元素使用。

context:component-scan 除了完成context:annotation-config一样的工作(注解),还允许Spring自动检测和定义Bean,base-package属性标识了所扫描的包。

<beans …>
<context:component-scan base-package=””/>
</beans>

自动检测Bean的标注

@Component——通用构造型(stereotype)注解,标识该类为Spring组件;

@Controller——标识该类为Spring MVC controller;

@Repository——数据仓库;

@Service——服务;

使用@Component标注的任意自定义注解。

过滤组件 context:include-filter 定义需要,context:exclude-filter定义不需要。 type与expression属性组合定义组件扫描策略。

Part 4 基于Java 的Spring 配置

@Configuration 等价于XML中的beans元素。表明这个类中将包含一个或多个Bean定义, 这些bean定义是指由@Bean注解所标注的方法。

@Configuration
public class BeanConfig {
        @Bean
        public Performer Bean() 
               return new BeanClass();
        }
}

© 著作权归作者所有

共有 人打赏支持
镜子哥哥
粉丝 1
博文 19
码字总数 14425
作品 0
广州
私信 提问
Spring中Beans的自动装配概述

以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-autowiring.html: 在之前的做法上会参照这样的顺序:1、使用元素声明bean,2、并使用XML配置文件中的和元素注入。但现在可...

easonjim
2017/05/22
0
0
Spring_总结_03_装配Bean之自动装配

一、前言 本文承接上一节:Spring总结02_依赖注入 在上一节我们了解到依赖注入的实质就是装配。 这一节我们来学习下装配Bean的相关知识。 二、Bean的装配机制 1.三种装配机制 Spring提供了三...

shirayner
07/27
0
0
《Spring5学习》 01 装配Bean之自动化装配

Spring的自动化装配就便利性方面远远优于其他装配方法,这也是业界目前主要采用的Bean装配机制。Spring基于组建扫描和自动装配实现自动化装配,能将用户的显示配置降到最低。以下通过一段代码...

老韭菜
08/05
0
0
spring自动装配优先级处理

spring版本5.0.4 spring的自动装配 我们一般通过加注解的方式来实现,@Resource 或者@Autowired。处理自动装配的类为DefaultListableBeanFactory,部分源码如下: @Nullablepublic Object doR...

额去看看
10/11
0
0
Spring实战3-最小化Spring XML配置

显式装配 自动装配Bean属性 一共有四种自动装配类型(需要在Bean配置里添加autowire属性来指定用哪种类型) byName-把与Bean的属性具有相同名字或ID的其他Bean自动装配到Bean的对应属性中。如...

huntering
2015/08/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker搞个wordpress

1.先把wordpress的镜像下载下来 docker pull wordpress 2.下载mysql docker pull mysql:lastest 3.启动mysql docker run --name blog -e root -d mysql:5.7 docker run --name some-mysql -e......

无极之岚
5分钟前
0
0
【宇润日常疯测-005】PHP 中的 clone 和 new 性能比较

clone和new本不应该放在一起比较,它们的作用是不同的。但可能有一些场景下,可以用clone也可以用new,那么这时候我们选哪个呢? 我编写了两个测试,第一个是声明一个空类,第二个是带构造方...

宇润
6分钟前
0
1
点击按钮弹出类似IOS 底部 dialog

implementation 'com.baoyz.actionsheet:library:1.1.7' 然后设置按钮点击监听,,调用下列代码即可 ActionSheet.createBuilder(this, getSupportFragmentManager()) ......

lanyu96
9分钟前
1
0
专访阿里云专有云马劲,一个理性的理想主义者

“我的故事都是和团队技术相关的,自己还真没有什么引人入胜的故事。”当马劲被问到能不能多分享些个人经历故事时他笑着说,我们就干脆怀着好奇聊了聊他和阿里云专有云一路走来的故事。 马劲...

阿里云官方博客
41分钟前
1
0
java环形缓冲区

import java.util.ArrayList;import java.util.List;/** * * 环形缓冲区<br/> * 一. 写数据:<br/> * 1. push: 当数据已写满时返回false,否则可以正常写入返回true<br/>......

whoisliang
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部