`
dzgwt2004
  • 浏览: 167385 次
  • 来自: 浙江杭州
社区版块
存档分类
最新评论

学习笔记:自动装配(autowire)协作者

阅读更多
(转自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
<?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
public class HelloBean {
    private String hello;

    public String getHello() {
        return hello;
    }

    public void setHello(String hello) {
        this.hello = hello;
    }
}

HelloDate.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
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");
    }
}

分享到:
评论
2 楼 wensky222 2007-04-18  
spring自身有没有定义bean的配置文件
如果有
autowire是不是也能自动装载spring自身定义的bean呢?
1 楼 magice 2007-01-07  
一直没有考虑过使用autowire,现在可以试着在某些情况下使用一下了

相关推荐

    自动装配 AutoWire

    **自动装配(Autowired)是Spring框架中的一个重要特性,它允许我们自动将依赖注入到bean中,而无需显式地在配置文件中指定依赖关系。在本文中,我们将深入探讨Autowired的工作原理、使用方式以及它如何简化Java应用的...

    Spring实现自动装配

    在学习自动装配的过程中,建议先从简单的基于类型的自动装配开始,然后逐步掌握基于注解的自动装配。理解每个bean如何被创建、初始化和装配,以及Spring如何处理这些过程,对于深入理解Spring框架至关重要。 本项目...

    Spring自动装配解析

    在Spring的XML配置文件中,可以通过`&lt;beans&gt;`标签的`autowire`属性来全局设置自动装配策略,或者在单个`&lt;bean&gt;`标签中通过`autowire`属性指定某一个bean的自动装配方式。 4. 使用注解进行自动装配 Spring 2.5引入了...

    autowire自动导入句柄

    在Spring框架中,`autowire`是一种自动装配bean依赖的方式,它极大地简化了bean之间的依赖注入过程。本文将深入探讨`autowire`自动导入句柄及其在实际开发中的应用。 ### 1. `autowire`简介 `autowire`是Spring...

    springboot-autowire:学习springboot自动装配原理

    #学习springboot自动装配 ##一,手动装配 ### 1,模式注解装配 @Component注解,或者@Component注解的扩展,@ Controller,@ Service,存储库,@ Configruation等, ### 2. @ Configuration启动容器+ @ Bean注册...

    pring自动装配方式介绍共2页.pdf.zip

    在Spring框架中,自动装配(Auto-Wiring)是一种简化依赖注入(Dependency Injection,简称DI)的方式,它允许Spring容器自动管理Bean之间的依赖关系,而无需显式地在配置文件中指定。Spring提供了多种自动装配模式...

    spring自动装配

    在压缩包文件名称“spring_0700_IOC_Autowire”中,“IOC”代表“Inversion of Control”,即控制反转,它是Spring的核心概念之一,自动装配是IOC的一种实现方式。这个文件可能包含了关于Spring自动装配的教程材料,...

    Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

    通过`&lt;bean&gt;`标签的`autowire`属性,我们可以开启自动装配功能。例如: ```xml &lt;bean id="myClient" class="com.example.MyClient" autowire="byType"&gt; &lt;!-- 这里不再需要显式定义myService的引用 --&gt; ``` ...

    Spring自动装配模式表

    ### Spring自动装配模式详解 #### 一、引言 在Spring框架中,自动装配是一种非常实用的功能,可以简化Bean的依赖注入过程。Spring提供了多种自动装配模式,每种模式都有其适用场景。本文将详细介绍Spring框架中的...

    Autowire是Python的轻量级和简单的依赖注入库

    **Autowire:Python中的轻量级依赖注入库** 在Python开发中,依赖注入(Dependency Injection,简称DI)是一种设计模式,它可以帮助我们编写更灵活、可测试和可维护的代码。Autowire是一个专为Python设计的轻量级且...

    Spring的自动装配源代码

    在Spring框架中,自动装配(Auto-Wiring)是一种简化配置的方式,它允许Spring容器自动为Bean提供依赖。这种特性使得开发者无需显式地在XML配置文件中声明Bean之间的依赖关系,从而减少了配置工作量,提高了代码的可...

    spring学习笔记1

    ### Spring学习笔记1 #### 一、Spring框架简介与IOC概念 **Spring**是一个开源的Java平台框架,它提供了一种全面的编程模型,并通过一系列的功能模块支持企业级应用程序开发。Spring的核心特性包括依赖注入...

    Spring自动装配Bean实现过程详解

    在Spring中,自动装配是通过bean元素的autowire属性来实现的。autowire属性有五个值:byName、byType、constructor、autodetect和no。 * byName:根据Property的名称自动装配,如果一个Bean的名称和另一个Bean中的...

    spring-autowire.zip

    《Spring自动装配详解——基于IDEA 2020的小实例》 在Java开发领域,Spring框架以其强大的功能和灵活性,成为了企业级应用开发的首选。其中,Spring的自动装配特性(Autowired)是其核心特性之一,极大地简化了依赖...

    Spring中自动装配的4种方式

    byName 自动装配是指通过设置 property 标签的 autowire 属性为 byName,Spring 将自动寻找一个与该属性名称相同或 id 相同的 Bean,注入进来。例如: ```xml &lt;property name="url" value="jdbc:mysql://...

    spring-autowire-demo.zip

    本示例"spring-autowire-demo.zip"是基于Spring 5.3.6版本,通过多个示例展示了自动装配的不同方式:default、byName、byType和constructor,帮助我们更深入理解这个功能。 首先,让我们了解什么是自动装配。自动...

    彻底搞明白Spring中的自动装配和Autowired注解的使用

    在 Spring 中,自动装配是通过 AutowireCapableBeanFactory 接口来实现的,该接口定义了四种自动装配策略:byName、byType、constructor 和 AUTOWIRE_AUTODETECT(已被弃用)。 1. byName 自动装配 byName 自动...

    Spring自动装配的方式

    Spring自动装配的方式和举例、以及@Qualifier、@Autowire、@Resource的使用。

Global site tag (gtag.js) - Google Analytics