自动装配
- @Autowired自动注入(Spring自动装配)
- 优先按照类名注入
- 如果容器中有多个相同的类,则会将属性的名称作为id取容器中查找
- 使用@Qualifier指定要注入的bean的名字
- 可以使用require=false来规定,bean在容器中是否可以不存在
- @Primary 规定首选的bean。其优先级小于@Qualifier
- 可以加在类名,set方法,构造器,参数上
- @Resource(java规范)
- 默认按照属性的名称来装配的
- 没有@Autowired的其他功能
- @Inject注解 (java规范)
- 需要导入“javax.inject”包
- 能使用@Primary, @Qualifier 但是不能使用require = false
实例
- 使用@ComponentScan方式注入BookDao 实例
@Repository
@Primary
public class BookDao {
private String label;
public BookDao() {
this.label = "1";
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
@Override
public String toString() {
return "BookDao{" +
"label='" + label + '\'' +
'}';
}
}
- 使用@Bean方式注入另一个BookDao实例
@Configuration
@ComponentScan(basePackages = {"com.test.tornesol.util.spring.spring_autowire"})
public class MainConfig {
@Bean(name = "bookDao2")
public BookDao bookDao() {
BookDao bookDao = new BookDao();
bookDao.setLabel("2");
return bookDao;
}
}
- 在service类里面注入BookDao
@Service
public class BookService {
@Autowired
@Qualifier("bookDao2")
public BookDao bookDao;
}
- 打印注入的BookDao
public class AutowireDemo {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
BookService bookService = context.getBean(BookService.class);
Arrays.stream(context.getBeanDefinitionNames()).forEach(p -> System.out.println(p));
System.out.println(bookService.bookDao);
}
}
- 输出结果:注入的是bookDao2
BookDao{label='2'}
Note:
- 在注入bean时,被注入bean的class要有无参构造器。
网友评论