@AutoWired注解:
主要作用是从容器中找到对应的Bean,然后通过注解直接把它注入到类的字段上。
容器:
@Configuration
@ComponentScan({"com.cqvie.controller","com.cqvie.dao","com.cqvie.service"})
public class MainConfigOfAutowired {
这个是第二个类型相同的类
@Primary()//优先使用它
@Bean(name="bookDao2")
public BookDao bookDao() {
BookDao bookDao = new BookDao();
bookDao.setLable("2");
return bookDao;
}
@Bean(name="bookDao2")
public BookDao bookDao0() {
BookDao bookDao = new BookDao();
bookDao.setLable("0");
return bookDao;
}
- 如果name名称相同的处理:
* 在@Configuration定义的类里面,
* 如果name一样,那么就会根据先后顺序来找到指定的bean对象。获取对象为在前面的,后面无法获取
*
* 如果是@ComponentScan扫描的和@Configuration定义类中的先执行类中的,后面无法获取
*/
}
使用AutoWired注解
* 1)、AutoWired:自动注入
* 1、默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);
* BookService{
* @AutoWired
* BookDao bookDao;
* }
service
@Service
public class BookService {
// @Qualifier("bookDao2") //指定id来为字段注入,默认是根据类型,通常和AutoWired一起使用,比较明确。
@Autowired(required=false) //从容器中获取BookDao的类型,如果有多个就会把bookDao作为id去容器中找。
private BookDao bookDao;
public void print() {
System.out.println(bookDao);
}
@Override
public String toString() {
return "BookService [bookDao=" + bookDao + "]";
}
}
被注入的类BookDao
@Repository
public class BookDao {
private String lable="1";
public String getLable() {
return lable;
}
public void setLable(String lable) {
this.lable = lable;
}
@Override
public String toString() {
return "BookDao [lable=" + lable + "]";
}
}
加入@Repository,@service等注解被加入容器中他们的默认id就是类名,首字母小写
不用@Service就可以在容器中这样定义:
@Bean()
public LT lt() {
LT lt = new LTp(); 接口类
System.out.println("LT..creat");
return lt;
}
总结:
- 在实际的springboot项目中,经常使用@Service,把它放在实现接口类的上即可,
@Autowired
private CarService carservice;
- 这个时候要往CarService 注入。
- 它会从容器中找到是@Service注解并且还实现了CarService 它的接口就会把这个实现类注入到这个字段上。
- 如果有多个有@Service并且也实现了CarService 接口就会出现异常。
- 写上@Service但是没有实现接口那么它就是一个普通的Bean对象。
- 补充其他的,在springboot项目中,容器也就是启动类加上的注解
@Autowired还可以放在其他位置使用,但是只能在容器中使用
1、方法位置上,@Bean+方法参数,参数直接从容器中获取,不写@Autowired是一样的效果。
@Autowired 默认在容器中找到word这个Bean对象,然后创建对象注入过来
public void sned(Word word){
syso(word);
}
2、在构造器上:如果只有一个构造器,这个构造器的@Autowired是可以省略的
3、放在参数上。
@Autowired主要流程
1、首先使用这个注解一定是一个Bean对象而且在容器中,
2、然后注入的东西都默认去容器中找,找到就使用这个bean对象
3、使用@Autowired的构造方法会替换默认的构造方法