`

自动装配(autowire)协作者(转载)

阅读更多
http://www.iteye.com/topic/43165
(转自springframework开发手册和分享java快乐博客)
Autowiring modes

模式 说明
no 不使用自动装配。必须通过ref元素指定依赖,这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰,因此对于较大的部署配置,推荐采用该设置。而且在某种程度上,它也是系统架构的一种文档形式。

byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。

byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。

constructor 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。

----------------------------------------------------------------------------------

理解自动装配的优缺点是很重要的。其中优点包括:

自动装配能显著减少配置的数量。不过,采用bean模板也可以达到同样的目的。

自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。

自动装配的一些缺点:

尽管自动装配比显式装配更神奇,但是,正如上面所提到的,Spring会尽量避免在装配不明确的时候进行猜测,因为装配不明确可能出现难以预料的结果,而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。

对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息。

如果采用by type方式自动装配,那么容器中类型与自动装配bean的属性或者构造函数参数类型一致的bean只能有一个,如果配置可能存在多个这样的bean,那么就要考虑采用显式装配了。

尽管使用autowire没有对错之分,但是能在一个项目中保持一定程度的一致性是最好的做法。例如,通常情况下如果没有使用自动装配,那么仅自动装配一个或两个bean定义可能会引起开发者的混淆。

代码如下
bean.xml
Java代码
<?xml version="1.0" encoding="GBK"?>  
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  
    "http://www.springframework.org/dtd/spring-beans.dtd">  
<beans>  
    <bean id="date" name="myDate" class="java.util.Date"/>  
    <bean id="helloBean" class="javamxj.spring.basic.autowiring.HelloBean"  
        dependency-check="simple">  
        <property name="hello" value="javamxj"/>  
    </bean>  
    <bean id="HelloByName" class="javamxj.spring.basic.autowiring.HelloDate"  
        autowire="byName"/>  
    <bean id="HelloByType" class="javamxj.spring.basic.autowiring.HelloDate"  
        autowire="byType"/>  
    <bean id="HelloConstructor" class="javamxj.spring.basic.autowiring.HelloDate"  
        autowire="constructor"/>  
    <bean id="HelloAutodetect" class="javamxj.spring.basic.autowiring.HelloDate"  
        autowire="autodetect"/>  
    <bean id="helloCheck" class="javamxj.spring.basic.autowiring.HelloDate"  
        autowire="byType" dependency-check="objects">  
        <property name="date2">  
            <bean class="java.util.GregorianCalendar"/>  
        </property>   
        <!-- <property name="date" ref="date"/>-->  
        <!-- <property name="hello" ref="helloBean"/>-->  
    </bean>  
</beans>  

HelloBean.java
Java代码
public class HelloBean {  
    private String hello;  
  
    public String getHello() {  
        return hello;  
    }  
  
    public void setHello(String hello) {  
        this.hello = hello;  
    }  
}  

HelloDate.java
Java代码
public class HelloDate {   
   
    public HelloDate() {  
        System.out.println("defalt Constructor called");  
    }  
  
    public HelloDate(HelloBean hello) {  
        System.out.println("HelloDate(HelloBean) called");  
    }  
  
    public HelloDate(HelloBean hello, Date date) {  
        System.out.println("HelloDate(HelloBean,Date) called");  
    }  
  
    public void setHello(HelloBean hello) {  
        System.out.println("Property hello set");  
    }  
  
    public void setDate(Date date) {  
        System.out.println("Property date set");  
    }  
  
    public void setDate2(GregorianCalendar date) {  
        System.out.println("Property date2 set");  
    }  
  
}  

main.java
Java代码
public class Main {  
    public static void main(String[] args) {  
        BeanFactory bf = new XmlBeanFactory(new ClassPathResource(  
                "javamxj/spring/basic/autowiring/beans.xml"));  
  
        System.out.println("使用 byName:");  
        HelloDate hb = (HelloDate) bf.getBean("HelloByName");  
  
        System.out.println("\n使用 byType:");  
        hb = (HelloDate) bf.getBean("HelloByType");  
  
        System.out.println("\n使用 constructor:");  
        hb = (HelloDate) bf.getBean("HelloConstructor");  
  
        System.out.println("\n使用 autodetect:");  
        hb = (HelloDate) bf.getBean("HelloAutodetect");  
  
        System.out.println("\n使用 dependency-check:");  
        hb = (HelloDate) bf.getBean("helloCheck");  
    }  
}  
分享到:
评论

相关推荐

    spring 帮助文档

    `autowire`属性允许自动装配bean的依赖关系而无需显式指定。这有助于减少配置文件中的重复代码,提高开发效率。 **2.3.2 基于@Required注解加强协作者管理** `@Required`注解用于标记必须设置的依赖项,确保这些...

    Spring-Reference_zh_CN(Spring中文参考手册)

    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. ...

    Spring3_权威开发指南

    - **元素的autowire属性**:定义了不同的自动装配策略。 - **基于@Required注解加强协作者管理**:使用`@Required`注解确保所有必须的依赖都被正确注入。 - **基于@Autowired或@Inject注解的另一Autowiring策略**...

    spring-3.1.0中文版api帮助文档

    **2.3 智能注入协作者** - **Autowiring策略**:通过`&lt;bean/&gt;`元素的`autowire`属性自动匹配和注入依赖。 - **@Required注解加强管理**:使用`@Required`注解确保必需的依赖被正确注入。 - **基于@Autowired或@...

    Spring中文帮助文档

    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. 其他作用域 ...

    Spring API

    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. 其他作用域 ...

    Spring 2.0 开发参考手册

    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...

    spring chm文档

    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...

Global site tag (gtag.js) - Google Analytics