设为首页 加入收藏

TOP

详细分析@Autowired注解与@resource注解的区别
2019-01-25 14:09:28 】 浏览:102
Tags:详细 分析 @Autowired 注解 @resource 区别

背景:


今天下班路上看到一个大货车,于是想到了装配,然后脑海里跳出了一个注解@Autowired(自动装配),于是又想到最近工作项目用的都是@Resource注解来进行装配。于是本着学什么东西都要一钻到底才能从菜鸟变大神的精神!!我就认真研究了一下,在此总结一波。以下内容先分别解释一下两个注解,再进行共同点与不同点的总结。


@Autowired


@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired。


@Autowired采取的策略为按照类型注入。


public class UserService {
    @Autowired
    private UserDao userDao;
}


如上代码所示,这样装配回去spring容器中找到类型为UserDao的类,然后将其注入进来。这样会产生一个问题,当一个类型有多个bean值的时候,会造成无法选择具体注入哪一个的情况,这个时候我们需要配合着@Qualifier使用。


@Qualifier告诉spring具体去装配哪个对象。


public class UserService {
    @Autowired
    @Qualifier(name="userDao1")   
    private UserDao userDao;
}


这个时候我们就可以通过类型和名称定位到我们想注入的对象。


@Resource


@Resource注解由J2EE提供,需要导入包javax.annotation.Resource。


@Resource默认按照ByName自动注入。


public class UserService {
    @Resource 
    private UserDao userDao;
    @Resource(name="studentDao") 
    private StudentDao studentDao;
    @Resource(type="TeacherDao") 
    private TeacherDao teacherDao;
    @Resource(name="manDao",type="ManDao") 
    private ManDao manDao;
}   


①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。


②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。


③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。


④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。


总结:


Spring属于第三方的,J2EE是Java自己的东西。使用@Resource可以减少代码和Spring之间的耦合。


两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。


当存在多个类型,却又没有指定的时候,会报如下的错误:


严重: Exception sendingcontext initialized event to listener instance of classorg.springframework.web.context.ContextLoaderListenerorg.springframework.beans.factory.BeanCreationException: Error creating beanwith name 'sequenceServiceImpl': Injection of resource dependencies failed;nested exception isorg.springframework.beans.factory.NoUniqueBeanDefinitionException: Noqualifying bean of type


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言谜语博士的难题代码及解析 下一篇C语言委派任务问题代码及解析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目