Spring_Autowiring collaborators
在Spring3.2.2中自动装配类型,分别为:no(default)(不采用自动装配)、byName,byType,constructor下面来分别介绍一下这些是如何自动装配的
<bean id="foo" class="...Foo" autowire="autowire type">
Mode Explanation
no: (Default) No autowiring. Bean references must be defined via a ref element.
Changing the default setting is not recommended for larger deployments,
because specifying collaborators explicitly gives greater control and clarity.
To some extent, it documents the structure of a system.
byName:Autowiring by property name.
Spring looks for a bean with the same name as the property that needs to be autowired.
For example, if a bean definition is set to autowire by name,
and it contains a master property (that is, it has a setMaster(..) method),
Spring looks for a bean definition named master, and uses it to set the property.
byType:Allows a property to be autowired if exactly one bean of the property type exists in the container.
If more than one exists, a fatal exception is thrown,
which indicates that you may not use byType autowiring for that bean.
If there are no matching beans, nothing happens; the property is not set.
constructor:Analogous to byType, but applies to constructor arguments.
If there is not exactly one bean of the constructor argument type in the container, a fatal error is raised
案例分析:
1、创建CumputerBean类
- package www.csdn.spring.autowire.bean;
- public class CumputerBean {
- // 电脑名称
- private String name;
- public void setName(String name) {
- this.name = name;
- }
- }
2、创建DeptBean 类
- package www.csdn.spring.autowire.bean;
- public class DeptBean {
- //部门名称
- private String name;
- public void setName(String name) {
- this.name = name;
- }
- }
3、创建EmployeeBean
- package www.csdn.spring.autowire.bean;
- public class EmployeeBean {
- private DeptBean deptBean;
- private CumputerBean cumputerBean;
- public void setDeptBean(DeptBean deptBean) {
- this.deptBean = deptBean;
- }
- public void setCumputerBean(CumputerBean cumputerBean) {
- this.cumputerBean = cumputerBean;
- }
- @Override
- public String toString() {
- return "EmployeeBean [deptBean=" + deptBean + ", cumputerBean="
- + cumputerBean + "]";
- }
- }
首先分析no、byName、byType的配置都是采用setter方法依赖注入实现的案例
1、no配置(通过ref=””引用需要的bean)
- <?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.xsd">
- <!-- 电脑bean -->
- <bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">
- <property name="name" value="HP6325笔记本" />
- </bean>
- <!-- 部门bean -->
- <bean id="deptBean" class="www.csdn.spring.autowire.bean.DeptBean">
- <property name="name" value="CSDN教育事业部" />
- </bean>
- <!-- 员工bean 根据EmployeeBean中的属性名称通过ref="bean"去匹配-->
- <bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean">
- <property name="cumputerBean" ref="cumputerBean" />
- <property name="deptBean" ref="deptBean" />
- </bean>
- </beans>
2、byName配置(分析:会根据EmployeeBean中属性的名称 自动装配)
- <?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.xsd">
- <!-- 电脑bean -->
- <bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">
- <property name="name" value="HP6325笔记本" />
- </bean>
- <!-- 部门bean -->
- <bean id="deptBean" class="www.csdn.spring.autowire.bean.DeptBean">
- <property name="name" value="CSDN教育事业部" />
- </bean>
- <!-- 员工bean-->
- <bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean" autowire="byName"/>
- </beans>
3、byType配置(分析:会根据EmployeeBean中属性的类型 自动装配)
- <?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.xsd">
- <!-- 电脑bean -->
- <bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">
- <property name="name" value="HP6325笔记本" />
- </bean>
- <!-- 部门bean -->
- <bean id="deptBean" class="www.csdn.spring.autowire.bean.DeptBean">
- <property name="name" value="CSDN教育事业部" />
- </bean>
- <!-- 员工bean 根据EmployeeBean中的属性根据类型匹配-->
- <bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean" autowire="byType"/>
- </beans>
注意:当根据byType类型装配时,当在容器内找到多个匹配的类型时会出现如下bug
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'employeeBean' defined in class path resource [spring-byType.xml]: Unsatisfied dependency expressed through bean property 'deptBean': :
No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] is defined: expected single matching bean but found 2: deptBean,deptBean1;
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] is defined: expected single matching bean but found 2: deptBean,deptBean1
4、Constructor(构造器参数根据byType类型匹配,自动装配)
首先修改EmployeeBean类 修改后代码如下:
- package www.csdn.spring.autowire.bean;
- public class EmployeeBean {
- private DeptBean deptBean;
- private CumputerBean cumputerBean;
- public EmployeeBean(DeptBean deptBean, CumputerBean cumputerBean) {
- super();
- this.deptBean = deptBean;
- this.cumputerBean = cumputerBean;
- }
- @Override
- public String toString() {
- return "EmployeeBean [deptBean=" + deptBean + ", cumputerBean="
- + cumputerBean + "]";
- }
- }
配置文件操作:
- <?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.xsd">
- <!-- 电脑bean -->
- <bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">
- <property name="name" value="HP6325笔记本" />
- </bean>
- <!-- 部门bean -->
- <bean id="deptBean" class="www.csdn.spring.autowire.bean.DeptBean">
- <property name="name" value="CSDN教育事业部" />
- </bean>
- <!-- 员工bean 根据EmployeeBean中的 属性名称 bytype 去匹配 -->
- <bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean"
- autowire="constructor">
- </bean>
- </beans>
说明:
1、当构造器的参数类型在容器中找不全时。
比如:
配置文件中只配置了CumpterBean时
- <?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.xsd">
- <!-- 电脑bean -->
- <bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">
- <property name="name" value="HP6325笔记本" />
- </bean>
- <!-- 员工bean 根据EmployeeBean中的 属性名称 bytype 去匹配 -->
- <bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean"
- autowire="constructor">
- </bean>
- </beans>
会出现如下bug:
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'employeeBean' defined in class path resource [spring-constructors.xml]: Unsatisfied dependency expressed through constructor argument with index 0 of type [www.csdn.spring.autowire.bean.DeptBean]: :
No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] found for dependency:
expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {};
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] found for dependency:
expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
Caused by:
org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] found for dependency:
expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
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.xsd">
- <!-- 电脑bean -->
- <bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">
- <property name="name" value="HP6325笔记本" />
- </bean>
- <!-- 部门bean -->
- <bean id="deptBean" class="www.csdn.spring.autowire.bean.DeptBean">
- <property name="name" value="CSDN教育事业部" />
- </bean>
- <!-- 部门bean -->
- <bean id="deptBean1" class="www.csdn.spring.autowire.bean.DeptBean">
- <property name="name" value="CSDN教育事业部" />
- </bean>
- <!-- 员工bean 根据EmployeeBean中的 属性名称 bytype 去匹配 -->
- <bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean"
- autowire="constructor">
- </bean>
- </beans>
说明:上面配置有两个同样类型的DeptBean但是不会出现bug,原因是在EmployeeBean中构造器接受的参数名称与deptBean一致。
3、当配置文件找到构造器参数的类型有多个的时候比如配置文件如下:
- <?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.xsd">
- <!-- 电脑bean -->
- <bean id="cumputerBean" class="www.csdn.spring.autowire.bean.CumputerBean">
- <property name="name" value="HP6325笔记本" />
- </bean>
- <!-- 部门bean -->
- <bean id="deptBean1" class="www.csdn.spring.autowire.bean.DeptBean">
- <property name="name" value="CSDN教育事业部" />
- </bean>
- <!-- 部门bean -->
- <bean id="deptBean2" class="www.csdn.spring.autowire.bean.DeptBean">
- <property name="name" value="CSDN教育事业部" />
- </bean>
- <!-- 员工bean 根据EmployeeBean中的 属性名称 bytype 去匹配 -->
- <bean id="employeeBean" class="www.csdn.spring.autowire.bean.EmployeeBean"
- autowire="constructor">
- </bean>
- </beans>
会出现如下bug(与byType的bug一致):
- org.springframework.beans.factory.UnsatisfiedDependencyException:
- Error creating bean with name 'employeeBean' defined in class path resource [spring-constructors.xml]:
- Unsatisfied dependency expressed through constructor argument with index 0 of type [www.csdn.spring.autowire.bean.DeptBean]: :
- No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] is defined:
- expected single matching bean but found 2: deptBean1,deptBean2;
- nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException:
- No qualifying bean of type [www.csdn.spring.autowire.bean.DeptBean] is defined:
- expected single matching bean but found 2: deptBean1,deptBean2
相关推荐
3.3.6. 自动装配(autowire)协作者 3.3.6.1. 设置Bean使自动装配失效 3.3.7. 依赖检查 3.3.8. 方法注入 3.3.8.1. Lookup方法注入 3.3.8.2. 自定义方法的替代方案 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. ...
3. **Bean管理**:Spring容器负责创建、初始化、装配和管理Bean。在3.2.2版本中,XML配置和基于注解的配置都有支持。`@Component`、`@Service`、`@Repository`和`@Controller`注解用于标记Bean,`@PostConstruct`和`...
- **容器(Container)**:Spring框架的核心是IoC容器,它负责创建对象并管理其生命周期,包括初始化、配置和装配对象。 2. **模块结构** - **Core Container**:包含Bean工厂和核心接口,如ApplicationContext,...
开发者可以使用XML配置或注解来声明对象及其依赖关系,实现组件的装配。 3. **Spring MVC**:作为Web应用的主干,Spring MVC 提供了一种模型-视图-控制器的设计模式,使得开发RESTful服务和处理HTTP请求变得更加...
此外,Spring Beans支持多种类型的依赖注入,包括构造器注入、设值注入、接口注入等,以及基于类型和基于名称的自动装配。这些机制使得我们的代码更加松耦合,易于测试和维护。 SpringBeans-3.0.2.RELEASE.jar还...
2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean 2.6 小结 第3章 高级Bean装配 3.1 声明父Bean和子Bean ...
- 介绍了自动装配机制,即如何让Spring自动找到合适的bean并注入到其他bean中。 - **3.4.6 Method injection** - 如何通过方法参数进行依赖注入。 - **3.5 Bean作用域** - **3.5.1 单例作用域** - 单例bean在...
5. **spring-beans-3.2.2.RELEASE.jar**:包含Spring Bean容器,负责创建、配置、装配以及管理对象实例。 6. **spring-test-3.2.2.RELEASE.jar**:提供了测试支持,帮助开发者进行单元测试和集成测试,可以与其他...
2.4.2混合使用自动和手动装配 2.4.3何时采用自动装配 2.5控制bean创建 2.5.1bean范围化 2.5.2利用工厂方法来创建bean 2.5.3初始化和销毁bean 2.6小结 第3章高级bean装配 3.1声明父bean和子bean 3.1.1抽象基...
2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean 2.6 小结 第3章 高级Bean装配 3.1 声明父Bean和子Bean ...
2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 2.5.1 配置Spring MVC框架 2.5.2 处理登录请求 2.5.3 JSP视图页面 2.6 运行Web应用 2.7 小结 第2篇 IoC和AOP 第3章 IoC容器概述 3.1 IoC概述 3.1.1 通过...
自动装配是一种方便的特性,允许Spring自动为Bean寻找并注入合适的协作者。 ##### 3.3.6 检查依赖 Spring框架还提供了依赖检查机制,可以在Bean创建过程中检查依赖是否已经正确注入。 #### 3.4 自定义 Bean 的性质...
3.3.6. 自动装配(autowire)协作者 3.3.7. 依赖检查 3.3.8. 方法注入 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. 其他作用域 3.4.4. 自定义作用域 3.5. 定制bean特性 3.5.1...
3.3.5. 自动装配(autowire)协作者 3.3.6. 依赖检查 3.3.7. 方法注入 3.4. Bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. Singleton beans和prototype-bean的依赖 3.4.4. 其他作用域 ...
3.3.5. 自动装配(autowire)协作者 3.3.6. 依赖检查 3.3.7. 方法注入 3.4. Bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. Singleton beans和prototype-bean的依赖 3.4.4. 其他作用域 ...
3.3.6. 自动装配(autowire)协作者 3.3.7. 依赖检查 3.3.8. 方法注入 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. 其他作用域 3.4.4. 自定义作用域 3.5. 定制bean特性 3.5.1...
1.12 用@Autowired和@Resource自动装配Bean 41 1.12.1 问题 41 1.12.2 解决方案 41 1.12.3 工作原理 41 1.13 继承Bean配置 47 1.13.1 问题 47 1.13.2 解决方案 47 1.13.3 工作原理 48 1.14 从...
2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 2.5.1 配置Spring MVC框架 2.5.2 处理登录请求 2.5.3 JSP视图页面 2.6 运行Web应用 2.7 小结 第2篇 IoC和AOP 第3章 IoC容器概述 3.1 IoC概述 3.1.1 通过...