Spring提供了四种自动注入的方式,分别是byName,byType,constructor,autodetect。下面我们一一介绍。
首先介绍的是byName方式,试图在容器中寻找和需要自动装配的属性名相同的Bean(或ID)。
下面是一个示例。
我们定义一个接口Description.java:
- package com.spring.di;
- public interface Description {
- public void say();
- }
我们再定义一个接口的具体实现PeopleDescription.java:
- package com.spring.di;
- public class PeopleDescription implements Description{
- public void say() {
- System.out.println("我今年23岁了");
- }
- }
我们再定义一个接口People.java:
- package com.spring.di;
- public interface People {
- public void say();
- }
我们写一个具体实现Jack.java:
- package com.spring.di;
- public class Jack implements People{
- private Description description;
- public void setDescription(Description description) {
- this.description = description;
- }
- public void say() {
- description.say();
- }
- }
我们写一个Spring的配置文件ditest.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"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
- <bean id="description" class="com.spring.di.PeopleDescription"/>
- <bean id="jack" class="com.spring.di.Jack" autowire="byName"/>
- </beans>
我们写一个测试类DiTest.java:
- package com.spring.di;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class DiTest {
- public static void main(String[] args) {
- ApplicationContext ctx=new ClassPathXmlApplicationContext("ditest.xml");
- People p1=(People) ctx.getBean("jack");
- p1.say();
- }
- }
程序输出:
- 我今年23岁了
下面我们介绍byType方式,试图在容器中寻找一个与需要自动注入的属性类型相同的Bean,限制是配置文件中只能有一个符合要求的Bean。
我们修改ditest.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"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
- <bean id="des" class="com.spring.di.PeopleDescription"/>
- <bean id="jack" class="com.spring.di.Jack" autowire="byType"/>
- </beans>
运行结果:
- 我今年23岁了
下面我们介绍constructor,试图在容器中查找与需要自动装配的Bean的构造函数参数一致的一个或多个Bean。
我们修改Jack.java文件如下:
- package com.spring.di;
- public class Jack implements People{
- private Description description;
- public Jack(Description description) {
- this.description = description;
- }
- public void say() {
- description.say();
- }
- }
我们修改ditest.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"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
- <bean id="des" class="com.spring.di.PeopleDescription"/>
- <bean id="jack" class="com.spring.di.Jack" autowire="constructor"/>
- </beans>
运行结果:
- 我今年23岁了
最后一种方式是autodetect,首先尝试使用constructor来自动装配,然后使用byType方式。
这种方式与前面类似,不再演示。