@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;
}
* 在@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;
}
总结:
@Autowired
private CarService carservice;
@Autowired还可以放在其他位置使用,但是只能在容器中使用
1、方法位置上,@Bean+方法参数,参数直接从容器中获取,不写@Autowired是一样的效果。
@Autowired 默认在容器中找到word这个Bean对象,然后创建对象注入过来
public void sned(Word word){
syso(word);
}
2、在构造器上:如果只有一个构造器,这个构造器的@Autowired是可以省略的
3、放在参数上。
@Autowired主要流程
1、首先使用这个注解一定是一个Bean对象而且在容器中,
2、然后注入的东西都默认去容器中找,找到就使用这个bean对象
3、使用@Autowired的构造方法会替换默认的构造方法