Spring 应用中提供了一种机制,可以按照一定规则自动为对象属性注入值,此机制实现的可以借助Bean标签中的autowire属性进行配置.此属性的值如下几个:
- default : 不执行自动装配(默认)-相当于白写
- byName: 按配置文件中(property)的属性名对应的set方法名进行自动装配
- byType: 按set方法相关参数类型进行自动装配(推荐)
- 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