`

Spring Bean中的自动装配——byName

阅读更多

自动装配(autowire)协作者

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

 

模式 说明
no  
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 id="bean2" class="com.lwf.bean.Bean2">
		<property name="bean3" ref="bean3"/>
		<property name="bean4">
			<ref bean="bean4"/>
		</property>
		<property name="bean5">
			<bean id="bean5" class="com.lwf.bean.Bean5">
				<property name="age" value="30"></property>
			</bean>
		</property>
	</bean>
	

 

<bean id="parentBean" abstract="true">
		<property name="id" value="1"/>
		<property name="name" value="zhang"/>
	</bean>
	
	<bean id="bean3" class="com.lwf.bean.Bean3" parent="parentBean">
		<property name="date" value="2010/05/19"/>
	</bean>
	
	<bean id="bean4" class="com.lwf.bean.Bean4" parent="parentBean"/>
	

 

我们可以看到bean2,bean3,bean4,bean5分别对应的类名为Bean2,Bean3,Bean4,Bean5

而Bean3,Bean4,Bean5分别为Bean2的成员属性,我们把成员属性的名字也定义为bean3,bean4,bean5即与配置文件中id的名字一致。

那么我们就可以使用自动装配来简化配置。

我们使用第一种:byName进行自动装配。在配置文件的beans标签增加属性:default-autowire="byName" 即可。

代码如下(本代码与前面一文中的使用bean继承相似):

package com.lwf.bean;

public class Bean2 {

	private Bean3 bean3;
	private Bean4 bean4;
	private Bean5 bean5;
	
	public Bean3 getBean3() {
		return bean3;
	}
	public void setBean3(Bean3 bean3) {
		this.bean3 = bean3;
	}
	public Bean4 getBean4() {
		return bean4;
	}
	public void setBean4(Bean4 bean4) {
		this.bean4 = bean4;
	}
	public Bean5 getBean5() {
		return bean5;
	}
	public void setBean5(Bean5 bean5) {
		this.bean5 = bean5;
	}
	
}

 

package com.lwf.bean;

import java.util.Date;

public class Bean3 {

	private int id;
	private String name;
	private Date date;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
}

 

package com.lwf.bean;

public class Bean4 {

	private int id;
	private String name;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 

package com.lwf.bean;

public class Bean5 {

	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
}

 

 

两个配置文件:

applicationContext.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"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
default-autowire="byName"			
>
			
			
	<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
		<property name="customEditors">
			<map>
				<entry key="java.util.Date">
					<bean class="com.lwf.bean.UtilDatePropertiesEditor">
						<property name="format" value="yyyy/MM/dd"/>
					</bean>
				</entry>
			</map>
		</property>
	</bean>

	<!-- 
	<bean id="bean2" class="com.lwf.bean.Bean2">
		<property name="bean3" ref="bean3"/>
		<property name="bean4">
			<ref bean="bean4"/>
		</property>
		<property name="bean5">
			<bean id="bean5" class="com.lwf.bean.Bean5">
				<property name="age" value="30"></property>
			</bean>
		</property>
	</bean>
	 -->
	<bean id="bean2" class="com.lwf.bean.Bean2"/>
	<bean id="bean5" class="com.lwf.bean.Bean5">
			<property name="age" value="33"></property>
	</bean>
</beans>

 

applicationContext_1.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"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	<bean id="parentBean" abstract="true">
		<property name="id" value="1"/>
		<property name="name" value="zhang"/>
	</bean>
	
	<bean id="bean3" class="com.lwf.bean.Bean3" parent="parentBean">
		<property name="date" value="2010/05/19"/>
	</bean>
	
	<bean id="bean4" class="com.lwf.bean.Bean4" parent="parentBean"/>
	
</beans>

 

日期转换需要用到的类:

package com.lwf.bean;

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class UtilDatePropertiesEditor extends PropertyEditorSupport {

	private String format="yyyy/MM/dd" ;
	public void setAsText(String text) throws IllegalArgumentException {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		try {
			Date dateVal = sdf.parse(text);
			this.setValue(dateVal);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
	}
	
	public void setFormat(String format){
		this.format = format;
	}

}

 

测试类:

package com.lwf.client;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.lwf.bean.Bean2;

public class Client {
	public static void main(String[] args) {
			
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext*.xml");
		Bean2 bean2 = (Bean2)ctx.getBean("bean2");
		System.out.println(bean2.getBean3().getName());
		System.out.println(bean2.getBean3().getId());
		System.out.println(bean2.getBean3().getDate());
		System.out.println(bean2.getBean4().getId());
		System.out.println(bean2.getBean4().getName());
		System.out.println(bean2.getBean5().getAge());
	}
}

 

输出结果:

2010-05-19 16:32:34,604 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3e86d0: display name [org.springframework.context.support.ClassPathXmlApplicationContext@3e86d0]; startup date [Wed May 19 16:32:34 CST 2010]; root of context hierarchy
2010-05-19 16:32:34,760 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Loading XML bean definitions from file [D:\workdirlocal\spring_start\bin\applicationContext.xml]
2010-05-19 16:32:35,135 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - Loading XML bean definitions from file [D:\workdirlocal\spring_start\bin\applicationContext_1.xml]
2010-05-19 16:32:35,213 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@3e86d0]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1adc30
2010-05-19 16:32:35,369 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1adc30: defining beans [customEditorConfigurer,bean2,bean5,parentBean,bean3,bean4]; root of factory hierarchy
zhang
1
Wed May 19 00:00:00 CST 2010
1
zhang
33

 

名称自动装配注意:

一、类中定义的成员属性与配置文件中的id名称一致;

二、在Beans标签增加default-autowire="byName"属性

自动装配缺点:日后修改比较麻烦,如果实现自动装配日后修改配置文件还需要到类里面一一查看属性名称。

 

分享到:
评论

相关推荐

    spring中的自动装配实例byName、byType

    在这个例子中,`myService`将通过byName自动装配获取`myDataSource`,而`myServiceWithType`则通过byType装配,但这里我们显式指定了依赖,以避免可能的多bean匹配问题。 **优缺点** byName自动装配简单直观,但...

    spring入门教程之bean的继承与自动装配详解

    这里的`autowire="byName"`指示Spring尝试找到一个名为`name`的Bean来自动装配到`Person`类的相应属性上。 Bean的继承是通过`parent`属性实现的,允许一个Bean继承另一个Bean的配置。这样可以重用和覆盖父Bean的...

    Spring实现自动装配

    然而,自动装配简化了这个过程,Spring容器会尝试根据类型或名称自动找到合适的依赖并注入到bean中。 在Spring 4中,自动装配主要有以下几种方式: 1. **无注解自动装配(No Annotation Auto-Wiring)**:在XML...

    spring自动装配例子

    (2)byName:根据属性 名 自动装配,设值注入 &lt;bean id="xxx" class="xxx" &gt;&lt;/bean&gt; (3)byType:根据属性 类型 自动装配,相同类型多个会抛出异常,设值注入 &lt;bean class="xxx" &gt;&lt;/bean&gt; (4)constructor:与 ...

    Spring自动装配解析

    - byName:根据bean的属性名自动装配。如果bean的属性名为其他bean的id,那么Spring会尝试将这个bean注入。 - byType:根据属性的类型自动装配。Spring会查找与该属性类型匹配的bean,并将其注入。 - constructor:...

    spring bean 属性总结

    - `byName`:根据属性名称自动装配。 - `byType`:根据属性类型自动装配。如果有多个匹配,会报错。 - `constructor`:根据构造函数参数类型自动装配。 - `autodetect`:尝试检测并选择`constructor`或`byType`...

    spring自动装配

    标题中的“Spring自动装配”指的是Spring框架中的一个重要特性,它允许开发者在不显式配置Bean依赖的情况下,由Spring容器自动管理Bean之间的依赖关系。这一特性极大地简化了代码,提高了可维护性和可测试性。 在...

    Java注解机制之Spring自动装配实现原理详解

    其中,byName是指根据Bean对象的名称来进行自动装配,byType是指根据Bean对象的类型来进行自动装配,constructor是指使用构造方法来进行自动装配,autodetect是指自动选择byType或constructor的自动装配方式,no是指...

    spring自动装配项目struts2

    Spring提供了多种自动装配方式,如byType、byName等,可以根据配置或注解来实现。在项目中,通过配置Spring的bean定义,或者使用@Autowired注解,我们可以让Spring自动为我们的bean注入所需的依赖,简化了代码并增强...

    Spring的自动装配源代码

    本文将深入探讨Spring中的六种自动装配方式:byType、byName、no、constructor、autodetect和default。 1. byType(按类型装配) 当Spring容器在配置文件中找不到明确的通过`ref`属性指定的依赖时,会尝试通过类型...

    Spring的自动装配Bean的三种方式

    本文将详细讲解Spring中自动装配Bean的三种主要方式:byName、byType以及constructor。这些方法帮助Spring的IoC容器自动识别并连接Bean的依赖,从而减少手动配置的工作量。 首先,我们来看第一种自动装配方式——`...

    spring装配bean实例代码

    在Spring框架中,Bean装配是核心功能之一,它负责初始化、配置和管理应用程序中的对象。本文将深入探讨Spring装配Bean的实例代码,帮助你更好地理解这一关键概念。 首先,Spring装配Bean主要有两种方式:XML配置和...

    Spring 自动装配及其注解

    在Spring框架中,自动装配(Autowiring)是一种机制,它允许Spring容器自动为bean提供其依赖,而无需显式配置。自动装配极大地简化了应用的配置,使得开发者可以更专注于业务逻辑。本文将深入探讨Spring自动装配的...

    第五章 Spring4 自动装配、方法注入

    Spring提供了多种自动装配模式,如byName、byType、constructor、autodetect等。byName是根据属性名匹配bean的id,byType则是根据属性类型匹配bean的类型。constructor和autodetect则分别处理构造函数参数和属性的...

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

    例如,在 User Bean 中有一个属性 myRole,可以使用 byName 自动装配来将名称为 myRole 的 Role Bean 自动装配到 User Bean 中。 2. byType 自动装配 byType 自动装配是指根据 Bean 的类型来自动装配依赖关系。...

    Spring中自动装配的4种方式

    Spring中自动装配的4种方式 在 Spring 框架中,自动装配是指容器可以自动将 Bean 之间的关系装配起来,不需要手动配置,从而简化了 XML 配置文件的编写。下面将详细介绍 Spring 中的 4 种自动装配方式。 byName ...

    spring学习之四“自动装配”

    1. **byName**:基于bean的名称进行自动装配。当Spring容器在bean的属性上发现@Autowired注解时,如果没有指定qualifier,那么Spring会尝试找到一个与该属性名称相同的bean来注入。 2. **byType**:基于bean的类型...

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

    默认情况下,配置文件中需要通过ref装配Bean,但设置了autowire="byName",Spring会在配置文件中自动寻找与属性名字personDao相同的bean,找到后,通过调用setPersonDao(PersonDao personDao)方法将id为personDao的...

    Spring自动装配模式表

    当设置自动装配模式为`byName`时,Spring容器会尝试根据Bean的属性名称来查找具有相同ID或name的其他Bean,并将其作为依赖注入到当前Bean中。这种方式适用于属性名称和依赖Bean的ID或name一致的情况。 **优点**: -...

Global site tag (gtag.js) - Google Analytics