天天看点

Spring之自动装配

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、QQ技术交流群(183198395)。

Spring之自动装配
Spring之自动装配
Spring之自动装配

<bean>元素的autowire属性负责自动装配<bean>标签定义的JavaBean的属性。这样代码显得简洁美观,负面影响是自动装配之后,无法从配置文件中读懂JavaBean需要什么属性。

一、按名称装配

通过byname属性以属性名区分自动装配。在容器中寻找与JavaBean属性名相同的JavaBean,并将其自动装配到JavaBean中。

示例如下:

User对象,引用上一文的:

package com.home.web.dto;

public class User {

    private String name;

    private Integer age;

    private String sex;

    public User() {
        super();
    }

    public User(String name, Integer age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

}
           

定义PrintInfo类,将User注入到PrintInfo对象中,并提供操作方法:

PrintInfo:

package com.home.web.dto;

public class PrintInfo {

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public void printUser() {
        System.out.println("PrintInfo打印User属性");
        System.out.println("------------------");
        System.out.println("用户姓名:" + user.getName());
        System.out.println("用户年龄:" + user.getAge());
        System.out.println("用户性别:" + user.getSex());
    }

}
           

applicationContextx.xml中相关配置:

<!-- User Bean -->
	<bean name="user" class="com.home.web.dto.User">
		<constructor-arg index="0" type="String">
			<value>小明</value>
		</constructor-arg >
		<constructor-arg index="1" type="Integer">
			<value>25</value>
		</constructor-arg >
		<constructor-arg index="2" type="String">
			<value>男</value>
		</constructor-arg>
	</bean>
	<!-- PrintInfo Bean  -->
	<bean autowire="byName" id="printinfo" class="com.home.web.dto.PrintInfo"/>
           

下面是Manger类:

package com.home.web.manager;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import com.home.web.dto.PrintInfo;

public class Manager {

    public static void main(String[] args) {
        Resource resource = new ClassPathResource("applicationContext.xml");
        BeanFactory factory = new XmlBeanFactory(resource);
        PrintInfo printInfo = (PrintInfo) factory.getBean("printinfo");
        printInfo.printUser();
    }

}
           

运行结果如下:

Spring之自动装配

二、按bean类型装配:

Spring以bean类型区分自动装配,这次容器匹配的不再是bean的名称。容器会自动找寻与JavaBean的属性类型相同的JavaBean的定义,并将其注入到需要自动装配的JavaBean中。

配置:

<!-- PrintInfo Bean  -->
	<bean autowire="byType" id="printinfo" class="com.home.web.dto.PrintInfo"/>
           

其他地方跟前面一样。

三、其他方式

1、no属性

这是autowire采用的默认值,它采用自动装配。必须使用ref直接引用其他bean。这样可以增加代码可读性,并且不易出错。

2、constructor属性

通过构造方法的参数类型自动装配。会自动寻找构造方法参数类型相同的bean进行装配,它与byType类型存在相同的无法识别自动装配的情况。

3、autodetect属性

它首先是要构造器方式自动装配,然后是要byType方式。同样存在他们相同的异常情况,建议把容易出现问题的JavaBean使用手动装配注入依赖属性。

四、自动装配优点和缺点:

1、优点

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

自动装配可以使用配置与Java代码同步更新。推荐在开发过程中采用自动装配,而在系统趋于稳定时改为显示装配的方式。

2、缺点

Spring会尽量避免在装配不明确时进行猜测,因为可能出现难以预料的结果。而且 Spring所管理的对象之间的关联关系也不再能清晰地进行文档化。

如果采用byType方式,那么容器中类型与自动装配的bean的属性或构造方法参数一致的bean只能有一个。如果存在多个就要考虑显示装配。