@Autowired自定注入
@Autowired自定注入是规则如下:
- 默认按照类型去容器中找对应的组件
- 自动装配默认容器中不能为null,如果允许为null的话需要指定@Autowired的required属性赋值成false
- 如果存在多个相同类型的实例,就按照属性名称作为id去容器中查找
- 如果容器中存在多个Bean实例,可以使用@Qualifier注解指定被注入的属性名
- 如果容器中存在多个Bean实例,可以在需要注入的类实例上使用@Primary注解,让其成为首选注入的实例Bean
- @Qualifier和@Primary同时存在的话,@Qualifier的优先级大于@Primary
@Autowired能标注的地方:
- 构造器(如果当前类只有一个有参构造器,那么@Autowired可以省略,对应的参数还是会自动从Spring的IOC容器中获取并注入)
- 参数(@Bean标注的参数,@Autowired也可以省略,对应的属性也能从Spring的IOC容器中获取并注入)
@Configuration//告诉Spring这里是一个配置文件 public class SpringConfig12 { @Bean(name = "car") public Car getCar() { return new Car(); } @Bean public Boss boss(Car car) { //用@Bean标注,这里的Car前面的@Autowired可以省略 return new Boss(car); } }
- 属性
- 方法(标注在方法上的时候,Spring容器在实例化当前对象的时候就会调用该方法,自动注入)
@Resource和@Inject
@Resource是java规范(JSR250)中的注解,也能实现自动装配,默认是按照属性名称进行装配的,但是不支持@Primary和@Autowired(required =false)
@Inject是java中的规范(JSR330),需要导入依赖。然后也能实现自动装配的功能,但是没有@Autowired注解那么强大
<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Aware接口
如果我们自定义的Bean需要使用到Spring容器底层的对象,例如:ApplicationContext、BeanFactory、Environment、ClassLoader等等我们只需要实现对应的xxxxAware接口,然后实现接口中的setxxxx方法就好了
拿ApplicationContextAware举例子
public class Boss implements ApplicationContextAware {
private Car car;
private ApplicationContext context;
public Boss(Car car) {
this.car = car;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
@Override
public String toString() {
return "Boss{" +
"car=" + car +
'}';
}
}