Spring 中Bean的自动装配六种模式其三及常见异常
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自动让Spring通过检查BeanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean)。autowire一共有六种类型。由于autowire可以针对单个bean进行设置,因此可以让有些bean使用autowire,有些bean不采用。autowire的方便之处在减少或者消除属性或构造器参数的设置,这样可以给我们的配置文件减减肥![2] 在xml配置文件中,可以在<bean/>元素中使用autowire属性指定:
模式
|
说明
|
Bytype
|
如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。
|
下来我们就用案例来证明一下:准备3个类:
public class AddressServiceImpl {
/**住址*/
private String address;
public void setAddress(String address){
this.address=address;
}
}
public class HomeAddressServiceImpl extends AddressServiceImpl {
private String address;
public void setAddress(String address){
this.address=address;
}
public HomeAddressServiceImpl() {
super();
}
public HomeAddressServiceImpl(String address){
this.address=address;
}
}
public class EmpServiceImpl {
/**公司地址*/
private AddressServiceImpl companyAddress;
public void setCompanyAddress(AddressServiceImpl companyAddress){
this.companyAddress=companyAddress;
}
}
byType值bytype.xml配置文件
<?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-2.0.xsd">
<bean id="homeAddressServiceImpl" class="cn.csdn.service.HomeAddressServiceImpl"
scope="singleton">
<property name="address">
<value>北京海淀上地软件园</value>
</property>
</bean>
<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl"
scope="singleton" autowire="byType" />
</beans>
注意异常:
<beanid="addressServiceImpl"class="cn.csdn.service.AddressServiceImpl" scope="singleton"/>
//homeAddressServiceImpl是继承addressServiceImpl,所以他们是同一类型!
<!-- 当有多个相同类型的bean时,会出现bug如下:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'empServiceImpl' defined in file [D:\Workspaces\MyEclipse 8.6\20110419_01\bin\applicationContext.xml]: Unsatisfied dependency expressed through bean property 'companyAddress': : No unique bean of type [cn.csdn.service.AddressServiceImpl] is defined: expected single matching bean but found 2: [homeAddressServiceImpl, addressServiceImpl]; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [cn.csdn.service.AddressServiceImpl] is defined: expected single matching bean but found 2: [homeAddressServiceImpl, addressServiceImpl]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1091)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:982)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
at java.security.AccessController.doPrivileged(Native Method)..........................
-->
测试类:(junit测试)
public class App {
@Test
public void test(){
ApplicationContext ac=new ClassPathXmlApplicationContext("classpath:byName.xml"); EmpServiceImpl emp = (EmpServiceImpl) ac.getBean("empServiceImpl");
}
}
注意:
byType
在使用的过程中必须保证bean能够初始化,否则的话会出现bug
如果有默认的无参数的构造器就不需要多余的配置
如果有带有参数的构造器,那在bean的配置中必须配置器初始化的参数 或者在bean中添加无参数的构造器
<!--EndFragment-->
分享到:
相关推荐
在Spring框架中,自动扫描和管理Bean是一种便捷的方式,它允许开发者无需显式地在配置文件中声明每个Bean,而是让Spring容器自动发现并管理应用中的组件。这一特性极大地简化了Spring应用的配置,提高了开发效率。...
在Spring框架中,Bean的生命周期管理是其核心特性之一,然而有时我们可能会遇到Spring Bean重复执行两次的问题,即实例被构造两次。这个问题可能是由多种原因引起的,涉及到Spring的初始化过程和容器的行为。以下是...
自动装配的二义性实例解析问题是 Spring 框架中的一个常见问题,需要我们认真对待和解决。通过这个例子,我们可以更好地理解自动装配机制和解决二义性实例解析问题的方法。 知识点: * Spring 的自动装配机制 * @...
在该容器中,对象定义(通过配置文件或注解)被创建,并通过依赖注入的方式自动装配依赖项。 IOC容器通过管理对象的创建和它们之间的依赖关系,使得对象之间的耦合度降低。 72、IOC的优点是什么? IOC(控制反转)...
本篇将详细介绍Spring Boot中获取Bean的几种常见方式。 首先,让我们理解什么是Spring Bean。在Spring框架中,Bean是一个由Spring容器管理的对象,通常代表应用中的业务组件或服务。Spring会负责Bean的创建、初始化...
- 用于实现自动装配,即Spring容器会自动将Bean实例注入到标记了此注解的字段或方法参数中。 - 默认情况下,`@Autowired` 是基于类型进行匹配的,如果存在多个相同类型的Bean,则需要配合`@Qualifier`注解进一步...
设置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. Prototype作用域 3.4.3. 其他作用域 3.4.3.1....
Spring框架支持以下几种自动装配模式: - **no**:默认模式,不进行自动装配。 - **byName**:根据Bean的名称进行装配。 - **byType**:根据Bean的类型进行装配。 - **constructor**:使用构造函数进行装配。 - **...
在传统的编程模式中,开发者通常需要手动创建对象并管理它们的生命周期,而在Spring IOC中,对象的创建和管理交给了Spring容器,开发者只需在配置文件中声明对象及其依赖关系。 依赖注入(Dependency Injection,...
- `@Autowired`:Spring的自动装配注解,可以自动将匹配类型的bean注入到字段或方法中。如果存在多个相同类型的bean,Spring会抛出异常,除非使用`@Qualifier`来指定具体哪一个bean。 - `@Qualifier`:当有多个...
11.1.1. 选择一种工作模式 11.1.2. Spring JDBC包结构 11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 ...
在Spring框架中,`@Autowired`和`@Resource`注解是两个常见的依赖注入(DI, Dependency Injection)工具,它们都是用来解决组件之间的耦合问题,使得代码更加灵活和可测试。然而,这两个注解在具体使用时有一些关键性...
### Spring 框架概述及核心特性 #### 第一章 Spring 简介 ##### 一、Spring 是什么? **Spring** 是一个开源框架,它主要用于简化 Java 应用程序的开发过程,尤其是在构建企业级应用程序时。Spring 的设计目标是...
Spring容器可以根据配置文件(如XML或Java配置)自动创建、初始化和销毁Bean,使得开发者无需在代码中进行硬编码依赖关系。 Spring 框架的轻量级特性体现在其小体积上,其核心库的JAR包大小仅1MB多,且它采用了非...
11.1.1. 选择一种工作模式 11.1.2. Spring JDBC包结构 11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 ...
当你声明一个bean并在配置文件中定义其依赖时,Spring会自动创建并装配这些对象,从而降低了代码间的耦合度。 "DI",Dependency Injection,依赖注入,是IOC的一种实现方式。它意味着一个对象的依赖关系不是由对象...
- **自动装配**:Spring能够根据类型或名称自动装配Bean。 - **Bean的定义继承**:一个Bean可以从另一个Bean继承属性和行为。 - **依赖关系检查**:可以配置Spring在启动时或调用方法前检查Bean的依赖是否已经正确...
在Spring框架中,静态方法内部注入Bean导致空指针异常是一个常见的问题,特别是在处理较旧的项目时。这里我们分析两种解决这个问题的方法。 首先,让我们深入理解问题的原因。在Spring中,`@Autowired`注解用于自动...
#### 三、Bean装配详解 - **XML配置**:开发者可以在`beans.xml`文件中明确指定bean的创建方式及其依赖关系。 - **Java配置**:通过在Java类中使用`@Configuration`和`@Bean`注解来定义bean及其配置信息。 - **自动...