基于注解注入对象
自动装配注解就是为了让我们在IoC容器运行的过程中,自动的为某个属性注入数据自动装配注解就是为依赖注入存在的
两类自动装配注解。
按类型装配和按名称装配
按名称注入。例ref="beanId"
注解又提供了一种选择:按类型装配。不推荐使用
推荐使用按名称装配@Named和@Inject要匹配使用
@Resource是这几个中最强大的注解
s07
MVC是采用分层的方式一次的逐级进行调用也就是controller依赖于service,service依赖于dao
service依赖于dao代码上的体现,在service类中添加一个UserDao类型的属性,然后用@Autowired按类型注解
初始化IoC容器发现setService中输出语句未执行
public void setUdao(UserDao udao) {
System.out.println("setUdao:" + udao);
this.udao = udao;
}
装配注解放在不同位置上
如果装配注解放在set方法上,则自动按类型/名称对set方法参数进行注入
如果放在属性上,不再执行set方法。Spring IoC容器会自动通过反射技术将private修饰符自动改为public,直接进行赋值。
如果基于注解完成依赖注入的话,通常是不用加set方法的,多数情况下,直接在属性上装配注解
@Autowired基于类型装配工作中不建议使用
例:给dao加个IUserDao接口,让UserDao去实现这个接口。与此同时,因为我们有了接口了,作为UserService中按照面向对象编程的理念属性的类型就应该从具体的类变成接口了。
比如原有的UserDao是基于mysql数据库进行的开发,但是随着公司技术转型,可能要迁移数据。这时基于接口再创建一个实现类即可。
然后初始化IoC容器会抛出NoUniqueBeanDefinitionException异常,不是唯一的bean定义。发现两个bean,userDao和userOracleDao。出现这个错误是因为采用了按类型注入。
解决办法:1.去掉UserDao的@Repository注解
2.对于已经出现重复的两个类来说,通过引入额外的一个注解@Primary,如果在IoC容器中出现多个相同的对象的话默认去采用@Primary描述的类。
究其根本就是在我们容器中,可能会出现多个相同类型的对象,为了尽量避免这个问题,通常在实际项目中采用按名称进行注入,因为名称在项目中都是唯一的。
private UserDao udao;
// 实现接口以后
private IUserDao udao;