- 可以将@Autowired注解为“传统”的setter方法
package com.mypackage; import org.springframework.beans.factory.annotation.Autowired; public class SimpleMovieLister { private MovieFinder movieFinder; @Autowired public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } //..... }
- 可用于构造器或成员变量
package com.mypackage; import org.springframework.beans.factory.annotation.Autowired; public class SimpleMovieLister { @Autowired private BeanAnnotation beanAnnotation; private MovieFinder movieFinder; @Autowired public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } //..... }
- 默认情况下,如果因找不到合适的bean将会导致autowiring失败抛出异常,可以通过下面的方式避免
package com.mypackage; import org.springframework.beans.factory.annotation.Autowired; public class SimpleMovieLister { private MovieFinder movieFinder; @Autowired(required=false) public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } //..... }
- 每个类只能有一个构造器被标记为required=true
- @Autowired的必要属性,建议会用@Required注解
例子:
先新建两个接口(InjectionService、InjectionDAO),及实现类
package com.mypackage; public interface InjectionDAO { public void save(String args); }
package com.mypackage; import org.springframework.stereotype.Repository; @Repository public class InjectionDAOImpl implements InjectionDAO { public void save(String args) { //模拟数据库操作 System.out.println("DAO保存数据:" + args); } }
package com.mypackage; public interface InjectionService { public void save(String args); }
package com.mypackage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class InjectionServiceImpl implements InjectionService{ @Autowired private InjectionDAO injectionDAO; public void save(String s){ //模拟业务操作 System.out.println("Service接收参数:"+s); s=s+":"+this.hashCode(); injectionDAO.save(s); } }
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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <context:component-scan base-package="com.mypackage"> </context:component-scan> </beans>
单元测试:
package com.mypackage; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UnitTest { @Test public void testAutoWired(){ ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-beanannotation.xml"); InjectionService service=(InjectionService)context.getBean("injectionServiceImpl"); service.save("this is autowired");; } }
结果:
2015-7-6 15:52:26 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1342a80d: startup date [Mon Jul 06 15:52:26 CST 2015]; root of context hierarchy
2015-7-6 15:52:26 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring-beanannotation.xml]
Service接收参数:this is autowired
DAO保存数据:this is autowired:1811560891
@Autowired也可应用于构造器
修改InjectionServiceImpl实现类(添加setter)
package com.mypackage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class InjectionServiceImpl implements InjectionService{ private InjectionDAO injectionDAO; @Autowired public void setInjectionDAO(InjectionDAO injectionDAO) { this.injectionDAO = injectionDAO; } public void save(String s){ //模拟业务操作 System.out.println("Service接收参数:"+s); s=s+":"+this.hashCode(); injectionDAO.save(s); } }
测试结果:
2015-7-6 15:55:23 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@939b78e: startup date [Mon Jul 06 15:55:23 CST 2015]; root of context hierarchy
2015-7-6 15:55:23 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [spring-beanannotation.xml]
Service接收参数:this is autowired
DAO保存数据:this is autowired:1860295362