Spring系列七:Spring 自动装配
相思相见知何日?此时此夜难为情。
概述
在Spring
框架中,在配置文件中声明bean
的依赖关系是一个很好的做法,因为Spring
容器能够自动装配协作bean
之间的关系。这称为spring
自动装配。
自动装配功能具有四种模式。分别是 no
,byName
,byType
和constructor
。
已弃用另一种自动连线模式自动检测。
Docs
说autodetect
选项提供了太多的magic
,最好使用更明确的声明。
XML
配置中的默认自动装配模式为no
。Java
配置中的默认自动装配模式是byType
。
自动装配模式
no
该选项是spring
框架的默认选项,表示自动装配为关闭状态OFF
。我们必须在bean
定义中使用<property>
标签显式设置依赖项。byName
此选项启用基于bean
名称的依赖项注入。在Bean
中自动装配属性时,属性名称用于在配置文件中搜索匹配的Bean
定义。如果找到这样的bean
,则将其注入属性。如果找不到这样的bean
,则会引发错误。byType
此选项支持基于bean
类型的依赖项注入。在bean
中自动装配属性时,属性的类类型用于在配置文件中搜索匹配的bean
定义。如果找到这样的bean
,就在属性中注入它。如果没有找到这样的bean
,就会引发一个错误。constructor
通过构造函数自动装配与byType
相似,仅适用于构造函数参数。在启用了自动装配的bean
中,它将查找构造函数参数的类类型,然后对所有构造函数参数执行自动装配类型。请注意,如果容器中没有一个完全属于构造函数参数类型的bean
,则会引发致命错误。
@Autowired
注解
除了bean
配置文件中提供的自动装配模式之外,还可以使用@Autowired
注解在bean
类中指定自动装配。要在bean
类中使用@Autowired
自动注入,必须首先使用以下配置在spring
应用程序中启用自动注入。
启用注解配置
<context:annotation-config />
使用配置文件中的AutowiredAnnotationBeanPostProcessor
bean
定义可以实现相同的目的。
<bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
使用@Autowired
注解
现在,启用注解配置后,可以随意使用@Autowired
自动连接bean
依赖项。这可以通过三种方式完成:
@Autowired
属性
在属性上使用@Autowired
时,等效于在配置文件中通过byType
自动注入
public class EmployeeBean
{
@Autowired
private DepartmentBean departmentBean;
public DepartmentBean getDepartmentBean() {
return departmentBean;
}
public void setDepartmentBean(DepartmentBean departmentBean) {
this.departmentBean = departmentBean;
}
//More code
}
@Autowired
在属性setter
方法上
在属性的setter
方法上使用@Autowired
时,它也等效于在配置文件中通过byType
进行自动装配。
public class EmployeeBean
{
private DepartmentBean departmentBean;
public DepartmentBean getDepartmentBean() {
return departmentBean;
}
@Autowired
public void setDepartmentBean(DepartmentBean departmentBean) {
this.departmentBean = departmentBean;
}
//More code
}
@Autowired
在构造函数上
在bean
的构造函数上使用@Autowired
时,它也等同于在配置文件中通过 constructor
进行自动装配。
package cn.howtodoinjava.autowire.constructor;
public class EmployeeBean
{
@Autowired
public EmployeeBean(DepartmentBean departmentBean)
{
this.departmentBean = departmentBean;
}
private DepartmentBean departmentBean;
public DepartmentBean getDepartmentBean() {
return departmentBean;
}
public void setDepartmentBean(DepartmentBean departmentBean) {
this.departmentBean = departmentBean;
}
//More code
}
@Qualifier
解决冲突
我们了解到,如果我们在byType
模式下使用自动装配,容器会在属性类类型中查找依赖项。如果找不到这样的类型,则会引发错误。但是,如果有两个或多个相同类类型的bean
,该怎么办?
在这种情况下,spring
将无法选择正确的bean
来注入属性,因此你将需要使用@Qualifier
注解来帮助容器。
要解析特定的bean
,我们需要使用@Qualifier
注解以及@Autowired
注解,并将bean
名称传递到注解参数中。看看下面的例子:
public class EmployeeBean{
@Autowired
@Qualifier("finance")
private DepartmentBean departmentBean;
public DepartmentBean getDepartmentBean() {
return departmentBean;
}
public void setDepartmentBean(DepartmentBean departmentBean) {
this.departmentBean = departmentBean;
}
//More code
}
其中重复的bean
配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<context:annotation-config />
<bean id="employee" class="cn.howtodoinjava.autowire.constructor.EmployeeBean" autowire="constructor">
<property name="fullName" value="Lokesh Gupta"/>
</bean>
<!--First bean of type DepartmentBean-->
<bean id="humanResource" class="cn.howtodoinjava.autowire.constructor.DepartmentBean" >
<property name="name" value="Human Resource" />
</bean>
<!--Second bean of type DepartmentBean-->
<bean id="finance" class="cn.howtodoinjava.autowire.constructor.DepartmentBean" >
<property name="name" value="Finance" />
</bean>
</beans>
使用required = false
进行错误安全的自动装配
即使在自动装配Bean
依赖项时已格外小心,仍然可能会发现奇怪的查找失败。因此,要解决此问题,您将需要使自动装配成为可选的,以便在未找到依赖项的情况下,应用程序不应引发任何异常,而自动装配应被忽略。
这可以通过两种方式完成:
- 如果要使特定的
bean
属性的非强制性的特定bean
自动装配,可以在@Autowired
注解中使用required =“ false”
属性。@Autowired (required=false)
@Qualifier ("finance")
private DepartmentBean departmentBean;`
- 如果要在全局级别(即对所有
bean
中的所有属性)应用可选的自动装配;使用以下配置设置。<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">
<property name="requiredParameterValue" value="false" />
</bean>
从自动装配中排除bean
默认情况下,自动装配扫描并匹配范围内的所有bean
定义。如果您想排除一些bean
定义,这样它们就不能通过自动装配模式被注入,可以使用设置为false
的autowire-candidate
来做到这一点。
- 使用
autowire-candidate
作为false
完全将bean
排除在自动装配候选之外。它将特定的bean
定义完全排除在自动装配基础结构之外。<?xml version="1.0" encoding="UTF-8"?>
<beans>
<context:annotation-config /> <bean id="employee" class="cn.howtodoinjava.autowire.constructor.EmployeeBean" autowire="constructor">
<property name="fullName" value="Lokesh Gupta"/>
</bean>
<!--Will be available for autowiring-->
<bean id="humanResource" class="cn.howtodoinjava.autowire.constructor.DepartmentBean" >
<property name="name" value="Human Resource" />
</bean> <!--Will not participate in autowiring-->
<bean id="finance" class="cn.howtodoinjava.autowire.constructor.DepartmentBean" autowire-candidate="false">
<property name="name" value="Finance" />
</bean>
</beans> - 另一种方法是根据
bean
名称的模式匹配来限制自动装配候选对象。顶级<beans/>
元素在其default-autowire-candidate
属性中接受一个或多个属性。
例如,要将自动装配候选状态限制为名称以Impl
结尾的任何bean
,请提供值* Impl
。要提供多种模式,请在以逗号分隔的列表中定义它们。<?xml version="1.0" encoding="UTF-8"?>
<beans default-autowire-candidates="*Impl,*Dao">
<context:annotation-config /> <bean id="employee" class="com.howtodoinjava.autowire.constructor.EmployeeBean" autowire="constructor">
<property name="fullName" value="Lokesh Gupta"/>
</bean>
<!--Will be available for autowiring-->
<bean id="humanResource" class="com.howtodoinjava.autowire.constructor.DepartmentBean" >
<property name="name" value="Human Resource" />
</bean> <!--Will not participate in autowiring-->
<bean id="finance" class="com.howtodoinjava.autowire.constructor.DepartmentBean" autowire-candidate="false">
<property name="name" value="Finance" />
</bean>
</beans>
请注意,bean
定义的autowire-candidate
属性的值true
或false
始终优先,而对于此类bean
,模式匹配规则将不适用。
这就是Spring
bean
自动装配的全部内容。
Spring系列七:Spring 自动装配的更多相关文章
- Spring系列(七) Spring MVC 异常处理
Servlet传统异常处理 Servlet规范规定了当web应用发生异常时必须能够指明, 并确定了该如何处理, 规定了错误信息应该包含的内容和展示页面的方式.(详细可以参考servlet规范文档) 处 ...
- [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring学习(六)-----Spring使用@Autowired注解自动装配
Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...
- Spring系列之Spring常用注解总结 转载
Spring系列之Spring常用注解总结 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.x ...
- spring(4)——自动装配
set注入和构造注入有时在做配置时比较麻烦.所以框架为了提高开发效率,提供自动装配功能,简化配置.spring框架式默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean ...
- Spring@Autowired注解与自动装配
1 配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss ...
- 【转】Spring@Autowired注解与自动装配
1 配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss ...
- Spring@Autowired注解与自动装配(转发)
1 配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss ...
- Spring基于的注解自动装配和依赖注入(***)
#自动装配的小Demo: package com.gyf.annotation; //DAO层 public interface UserDao { public void save(); } pac ...
随机推荐
- C语言实现简单的哈希表
这是一个简单的哈希表的实现,用c语言做的. 哈希表原理 这里不讲高深理论,只说直观感受.哈希表的目的就是为了根据数据的部分内容(关键字),直接计算出存放完整数据的内存地址. 试想一下,如果从链表中根据 ...
- sudo 问题:sorry, you must have a tty to run sudo
写定时任务时候遇到 如下问题 To start backup... -- :: sudo: sorry, you must have a tty to run sudo The backup to c ...
- 7. 使用Hystrix实现微服务的容错处理
使用Hystrix实现微服务的容错处理 7.1. 实现容错的手段 7.1.1. 雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整 ...
- ARP输入 之 arp_process
概述 arp_process为ARP输入包的核心处理流程: 若输入为ARP请求且查路由成功,则进行如下判断:输入到本地,则进行应答:否则,允许转发,则转发,本文代码不包含转发流程: 若输入为ARP应答 ...
- JS高级_数据类型
1.分类: a.基本(值)类型: * String :任意字符串 * Number :任意数字 * boolean : true/false * undefined :undefined * null ...
- oracle存储过程中进行分页
create or replace procedure APP_BUSSINESS_CARD_LIST(p_in_str in varchar2,p_out_str out varchar2) is ...
- aop备忘
https://www.iflym.com/index.php/code/use-java-develop-compile-annotated-aspectj-programe.htmlspringb ...
- .SpringIOC容器
创建对象 SpringIOC容器,是spring核心内容. 作用: 创建对象 & 处理对象的依赖关系 IOC容器创建对象: 创建对象, 有几种方式: 1) 调用无参数构造器 2) 带参数构造器 ...
- manifest节点
xmlns:android属性——定义命名空间 这个属性定义了这个XML文件所使用的命名空间.如果需要指定特殊的命名空间,就需要手动编写代码,在Android Studio基本格式如下: xmlns: ...
- Flask+uwsgi+Nginx+Ubuntu部署教程
学习 Flask,写完一个 Flask 应用需要部署的时候,就想着折腾自己的服务器.根据搜索的教程照做,对于原理一知半解,磕磕碰碰,只要运行起来了,谢天谢地然后不再折腾了,到下一次还需要部署时,这样的 ...