`
javawangli
  • 浏览: 222207 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 中Bean的自动装配六种模式其三及常见异常

阅读更多

    Spring 中Bean的自动装配六种模式其三及常见异常

Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自动让Spring通过检查BeanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean)。autowire一共有种类型。由于autowire可以针对单个bean进行设置,因此可以让有些bean使用autowire,有些bean不采用。autowire的方便之处在减少或者消除属性或构造器参数的设置,这样可以给我们的配置文件减减肥![2xml配置文件中,可以在<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;

}

}

 

 

byTypebytype.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-->
1
7
分享到:
评论

相关推荐

    Spring中文帮助文档

    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-Reference_zh_CN(Spring中文参考手册)

    设置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 API

    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.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Spring常见面试题与答案,IOC AOP等

    Spring 框架是 Java 企业级应用开发中的一种流行的框架,提供了一个强大且灵活的开发平台。下面是 Spring 框架中的一些常见面试题与答案: 1. 使用 Spring 框架的好处是什么? 答案:使用 Spring 框架可以获得许多...

    2022年Spring常见的面试题和答案.docx

    BeanFactory 是工厂模式的一种实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。最常用的 BeanFactory 实现是 XmlBeanFactory 类。 AOP 模块用于提供面向切面编程的功能,支持多种 AOP ...

    Java常见面试题208道.docx

    97.spring 自动装配 bean 有哪些方式? 98.spring 事务实现方式有哪些? 99.说一下 spring 的事务隔离? 100.说一下 spring mvc 运行流程? 101.spring mvc 有哪些组件? 102.@RequestMapping 的作用是什么? 103.@...

    史上最全java面试,103项重点知识,带目录

    97. spring 自动装配 bean 有哪些方式? 59 98. spring 事务实现方式有哪些? 59 99. 说一下 spring 的事务隔离? 59 100. 说一下 spring mvc 运行流程? 60 101. spring mvc 有哪些组件? 61 102. @RequestMapping ...

    webx3框架指南PDF教程附学习Demo

    • 扩展性 —— Webx 3.0对Spring做了扩展,使Spring Bean不再是“bean”,而是升级成“组件”。一个组件可以扩展另一个组件,也可以被其它组件扩展。这种机制造就了Webx的非常好的扩展性,且比未经扩展的Spring更易...

Global site tag (gtag.js) - Google Analytics