@Autowired
private UserDao userDao;
此处byName就是拿变量名 userDao 去匹配IOC容器中 id 为 userDao 的Bean;⽽byType就是拿变量类型 UserDao 去匹配IOC容器中class 为 com.itheima.dao.impl.UserDaoImpl,因为UserDaoImpl是UserDao实现类,所以是匹配成功
@Autowird注解的使⽤
@Autowired实现:
注解驱动配置会向spring容器中注册AutowiredAnnotationBeanPostProcessor
当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有
@Autowired 注释时就到和其匹配(默认按类型匹配)的 Bean,并注⼊到对应的地⽅中去。
步骤:@Autowird默认的注⼊⽅式为byType,也就是根据类型匹配,当有多个实现类时,则通过byNa
me注⼊加以区分,或者可以通过配合@Qualifier注解来显式指定name值,指明要使⽤哪个具体的实现类
例⼦:
如果此时,我们的 service 层如下写法,代码会报错的,
原因:⾸先通过byType注⼊,结果发现 UserDao 类型有两个实现类,⽆法确定具体是哪⼀个,于是通过byName⽅式注
⼊,@Autowired的byName注⼊⽅式的默认Bean就是类型后⾯的变量名,这⾥的变量名为 userDao,IOC容器中的Bean名称为userDao2 和 userDaoImpl2,所以匹配不到,于是报错。
解决⽅案:
⽅法⼆:
配合@Qualifier注解来显式指定name值
@Resource注解的使⽤
@Resource 是JDK1.6⽀持的注解,由J2EE提供,需要导⼊包javax.annotation.Resource。默认按照名称进⾏装配,名称可以通过name属性进⾏指定。也提供按照byType 注⼊。
如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查。
当注解标注在属性的setter⽅法上,即默认取属性名作为bean名称寻依赖对象。
resource和autowired注解的区别当不到与名称匹配的bean时才按照类型进⾏装配。但是需要注意的是,如果name属性⼀旦指定,就只会按照名称进⾏装配。
⽰例:
public class TestServiceImpl {
// 下⾯两种@Resource只要使⽤⼀种即可
@Resource(name="userDao")
private UserDao userDao;// ⽤于字段上
@Resource(name="userDao")
public void setUserDao(UserDao userDao){// ⽤于属性的setter⽅法上
this.userDao = userDao;
}
}
@Resource装配顺序:
①如果同时指定了name和type,则从Spring上下⽂中到唯⼀匹配的bean进⾏装配,不到则抛出异常。
②如果指定了name,则从上下⽂中查名称(id)匹配的bean进⾏装配,不到则抛出异常。
③如果指定了type,则从上下⽂中查类型匹配的bean进⾏装配,不到或是到多个,都会抛出异常。
④如果既没有指定name,⼜没有指定type,则⾃动按照byName⽅式进⾏装配,默认以变量名为Bean的id
总结
如果@Requied或者@Autowired写了set⽅法之上,则程序会⾛到set⽅法内部。但如果写在了field之上,则不会进⼊set⽅法当中。@Autowire + @qualifier("") = @Resource(name="")
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论