Bean对象属性值自动装配

Spring 应用中提供了一种机制,可以按照一定规则自动为对象属性注入值,此机制实现的可以借助Bean标签中的autowire属性进行配置.此属性的值如下几个:

  1. default : 不执行自动装配(默认)-相当于白写
  2. byName: 按配置文件中(property)的属性名对应的set方法名进行自动装配
  3. byType: 按set方法相关参数类型进行自动装配(推荐)
  4. constructor:按构造方法参数类型进行自动装配

例如:

<bean id="producer" class="bean.Producer" autowire="byType"/>
<bean id="consumer" class="bean.Consumer" autowire="constructor"/>

此代码中的自动装配是按照Producer类中相关属性类型查找对应参数类型的set方法,然后再依据其类型从spring容器中查找对应类型的bean对象,最后调用对应set方法进行值的注入。
详细例子如下:


项目结构

/spring-pro-con/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.company</groupId>
    <artifactId>spring-pro-con</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.9.RELEASE</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

/spring-pro-con/src/main/resources/spring-configs.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="  
       http://www.springframework.org/schema/beans   
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
       http://www.springframework.org/schema/mvc   
       http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd   
       http://www.springframework.org/schema/tx   
       http://www.springframework.org/schema/tx/spring-tx-4.3.xsd   
       http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
       http://www.springframework.org/schema/util 
       http://www.springframework.org/schema/util/spring-util-4.3.xsd
       http://www.springframework.org/schema/data/jpa 
       http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.3.xsd">
       <bean id="producer" class="bean.Producer" autowire="byType"/>
       <bean id="consumer" class="bean.Consumer" autowire="constructor"/>
       <bean id="container" class="bean.Container"/>
</beans>

/spring-pro-con/src/main/java/bean/Consumer.java

package bean;

public class Consumer {
    private Container container;

    public Consumer(Container container) {
        System.out.println("Consumer.Consumer(Container container)");
        this.container = container;
    }

    public Container getContainer() {
        return container;
    }
    
}

/spring-pro-con/src/main/java/bean/Container.java

package bean;

import java.util.List;

public class Container {
    private List<String>list;
    public Container() {
        System.out.println("Container.Container()");
    }
    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
}

/spring-pro-con/src/main/java/bean/Producer.java

package bean;

public class Producer {
    private Container container;

    public Container getContainer() {
        return container;
    }

    public void setContainer(Container container) {
        System.out.println("Producer.setContainer()");
        this.container = container;
    }
    
}

/spring-pro-con/src/main/java/testauto/TestAutoWire.java

package testauto;

import java.util.ArrayList;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import bean.Consumer;
import bean.Container;
import bean.Producer;

public class TestAutoWire {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ct = new ClassPathXmlApplicationContext("spring-configs.xml");
        Container c=ct.getBean("container",Container.class);
        c.setList(new ArrayList<String>());
        Producer p = ct.getBean("producer",Producer.class);
        p.getContainer().getList().add("cake");
        System.out.println("Producer added cake");
        Consumer consumer = ct.getBean("consumer",Consumer.class);
        String item = consumer.getContainer().getList().get(0);
        System.out.println("Consumer got "+item);
        ct.close();
    }
}

运行结果

Container.Container()
Producer.setContainer()
Consumer.Consumer(Container container)
Producer added cake
Consumer got cake
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。