下面要给大家介绍的就是spring三种自动注入方式,对于这个方面你都了解吗?不清楚的小伙伴可以通过下面的文章来进行简单的学习哦。
三种方式分别是@Autowired注解-由spring提供;@Resource注解-由JSR-250提供;@Inject注解-由JSR-330提供;
@Autowired注解的使用方法
@Target( { ElementType.CONSTRUCTOR , ElementType.METHOD , ElementType.PARAMETER , ElementType.FIELD , ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Autowired { /** * Declares whether the annotated dependency is required. * <p>Defaults to {@code true}. */ boolean required() default true; }
@Configuration @ComponentScan(basePackages = { "cn.monolog.service" }) public class AutowiredBeanConfig { @Bean(value = "bookDao1") public BookDao bookDao1() { BookDao bookDao = new BookDao(); bookDao.setLabel("bookDao1"); return bookDao; } @Bean(value = "bookDao2") @Primary public BookDao bookDao2() { BookDao bookDao = new BookDao(); bookDao.setLabel("bookDao2"); return bookDao; } @Bean(value = "bookDao3") public BookDao bookDao3() { BookDao bookDao = new BookDao(); bookDao.setLabel("bookDao3"); return bookDao; } }
自动注入方式:
@Autowired @Qualifier(value = "bookDao1") private BookDao bookDao3;
按照优先级顺序,@Qulifier(bookDao1) > @Primary(bookDao2) > 属性名(bookDao3),最终加载的是名称为bookDao1的组件。
@Resource注解的使用方法
@Resource注解的使用跟@Autowired注解类似。
要注意:
不支持@Primary注解,也不支持reuqired=false,也就是不允许注入null。
这个注解有一个属性name,类似于@Qualified精准匹配,优先级最高。
默认按照属性名跟bean的名称匹配查找,假如,不存在,再按类型匹配查找。
例:
下面这个容器中有两个CarDao组件
@Configuration @ComponentScan(basePackages = { "cn.monolog.service" }) public class ResourceBeanConfig { @Bean(value = "carDao1") public CarDao carDao1() { CarDao carDao = new CarDao(); carDao.setLabel("1"); return carDao; } @Bean(value = "carDao2") public CarDao carDao() { CarDao carDao = new CarDao(); carDao.setLabel("2"); return carDao; } }
自动注入方式如下,会按属性名注入carDao2组件。
//自动注入 @Resource private CarDao carDao2;
但是改为下面这种注入方式:
//自动注入 @Resource(name = "carDao1") private CarDao carDao2;
因为,使用了name精准匹配,会忽略属性名,注入carDao1组件。
@Inject注解的使用方法
@Inject注解的使用方法跟@Autowired也基本相似,但是需要注意
使用之前,需要导入jar包——javax.inject;
支持@Primary注解,而且因为没有精确匹配,@Primary的优先级最高;
不支持required=false,即不能注入null,如果找不到组件肯定报错;
默认按照属性名跟bean的名称匹配查找,如果不存在,再按类型匹配查找。
例如,下面这容器中有一个EmployeeDao组件
@Configuration public class InjectBeanConfig { @Bean(value = "employeeDao1") public EmployeeDao employeeDao1() { EmployeeDao employeeDao = new EmployeeDao(); employeeDao.setLabel("1"); return employeeDao; } }
自动注入的方式如下:
@Inject private EmployeeDao employeeDao3;
spring会先按属性名查找名称为employeDao3的组件,即applicationContext.getBean("employeeDao3"),结果不存在;
然后按照类型查找,即applicationContext.getBean(EmployeDao.class),找到employeDao1组件,成功注入。
假如,容器中有多个同类型组件,例如:
@Configuration public class InjectBeanConfig { @Bean(value = "employeeDao1") public EmployeeDao employeeDao1() { EmployeeDao employeeDao = new EmployeeDao(); employeeDao.setLabel("1"); return employeeDao; } @Bean(value = "employeeDao2") public EmployeeDao employeeDao2() { EmployeeDao employeeDao = new EmployeeDao(); employeeDao.setLabel("2"); return employeeDao; } @Bean(value = "employeeDao3") public EmployeeDao employeeDao3() { EmployeeDao employeeDao = new EmployeeDao(); employeeDao.setLabel("3"); return employeeDao; } }
注入方式:
@Inject private EmployeeDao employeeDao3;
依然会按属性名和bean的名称匹配,即applicationContext.getBean("employeeDao3"),找到employee3,成功注入。
可是,假如,其中某个组件加了@Primary注解,会忽略属性名,优先注入,例如:
@Configuration public class InjectBeanConfig { @Bean(value = "employeeDao1") public EmployeeDao employeeDao1() { EmployeeDao employeeDao = new EmployeeDao(); employeeDao.setLabel("1"); return employeeDao; } @Bean(value = "employeeDao2") @Primary public EmployeeDao employeeDao2() { EmployeeDao employeeDao = new EmployeeDao(); employeeDao.setLabel("2"); return employeeDao; } @Bean(value = "employeeDao3") public EmployeeDao employeeDao3() { EmployeeDao employeeDao = new EmployeeDao(); employeeDao.setLabel("3"); return employeeDao; } }
不管注入的时候使用什么样的属性名,都会注入employeeDao2。
以上内容源于网络,仅供参考。
spring注入方式你都了解了吗?更多相关内容,请继续通过本站的常见问题栏目来了解。
推荐阅读: