@Autowired和@Resource装配
从Spring2.5開始就能够使用注解自己主动装配Bean的属性。
使用注解自己主动装配与XML中使用autowire属性自己主动装配并没有太大区别。
Spring容器默认禁用注解装配。
所以在基于注解自己主动装配。我们须要在Spring配置中启用它。如:<context:annotation-config/>
<context:annotation-config/>他的作用是向Spring容器注冊
AutowiredAnnotationBeanPostProcessor(@Autowired)
CommonAnnotationBeanPostProcessor(@ Resource 、@ PostConstruct、@ PreDestroy等注解)
PersistenceAnnotationBeanPostProcessor(@PersistenceContext)
RequiredAnnotationBeanPostProcessor (@Required)
这四个BeanPostProcessor。
总是须要依照传统的方式一条一条配置显得有些繁琐和没有必要。于是spring给我们提供<context:annotation-config/>的简化配置方式,自己主动帮你完毕声明。
Spring另一个配置<context:component-scan base-package=”cn.com.xx.xx”/>能替代<context:annotation-config/>,我们后面在说。
@Autowired的使用
使用@Autowired我们得知道它是依照byType自己主动装配的,能够无需写set方法。甚至不会受限于privatekeyword。即使是私有实例变量。它仍然能够被自己主动装配。
是不是感觉@Autowired注解没有不论什么限制?实际上会有两种情况出现异常:
1、假设没有匹配到Bean
能够使用@Autowired(required=false)即时没有匹配到也不会异常,而是将值设置为null。来看看@Autowired注解源代码:
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
/**
* Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;//required默认是true,必须满足依赖否则异常,我们能够将这个值改为fasle改变这一行为
}
2、假设存在多个匹配的Bean
能够使用@Qualifier("users")来注入ID为users的Bean。来看看@Qualifier注解源代码:
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Qualifier {
String value() default "";//默认是空字符串,也就是不指定匹配的Bean ID,必要时我们能够指定value的值(也就是Bean的ID)这时候会依照byName去自己主动装配
}
以下来看下样例:
public class Roles {
private int id;
private String roleName;
@Autowired
private Users users;
//@Autowired(required=false)//即时没匹配到ID为users也不会异常,而是null
//@Qualifier("users")//获得ID为users的Bean
//private Users users;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
//没有users的get,set方法
//重写toString方法,方便測试
@Override
public String toString() {
return "Roles [id=" + id + ", roleName=" + roleName + ", users="
+ users + "]";
}
}
public class Users {
private int id;
private String name;
//省略set get方法
@Override
public String toString() {
return "Users [id=" + id + ", name=" + name + "]";
}
}
<bean id="roles" class="cn.com.ztz.spring.model.Roles">
<property name="id" value="1"/>
<property name="roleName" value="管理员"/>
</bean>
<bean id="users" class="cn.com.ztz.spring.model.Users">
<property name="id" value="2"/>
<property name="name" value="张三"/>
</bean>
<context:annotation-config/>
执行測试方法:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring.xml"})
public class JunitTest {
@Autowired
private Roles roles;
@Test
public void testSpring(){ System.out.println(roles);
}
}
输出结果:
Roles [id=1, roleName=管理员, users=Users [id=2, name=张三]]
@resource跟@Autowired的差别
@resource注解事实上跟@Autowired几乎相同的,他们的差别是:
1、@resource是JDK的。@Autowired是Spring的
2、@resource依照byName自己主动装配,@Autowired依照byType自己主动装配。
@Autowired装配顺序
2、假设存在且唯一,则OK
3、假设不唯一。寻找name为users的bean。
由于bean的name有唯一性,所以,到这里应该能确定是否存在满足要求的bean了
@Autowired也能够手动指定依照byName方式注入,使用@Qualifier标签,比如:
@Autowired()
@Qualifier("users" )
@Resource装配顺序
1. 假设同一时候指定了name和type。则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 假设指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 假设指定了type。则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个。都会抛出异常
4. 假设既没有指定name,又没有指定type,则自己主动依照byName方式进行装配。假设没有匹配。则回退为一个原始类型进行匹配。假设匹配则自己主动装配。
ps:有哪不正确的地方。还请指出。
@Autowired和@Resource装配的更多相关文章
- @autowired和@resource的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自 动注入罢了.@Resource有两个属性是比较重要的, ...
- @Autowired 与@Resource的区别
1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2 @Autowired默认按类型装配(这个注解是属业spring的),默认情况下 ...
- java @Autowired与@Resource的区别
@Autowired与@Resource的区别 1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认 ...
- @Autowired与@Resource的区别
1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...
- Spring 注释 @Autowired 和@Resource
一. @Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上. 二. @Autowired属于Spring的:@Resource为JSR-250标准的注释,属于J ...
- Spring 注释 @Autowired 和@Resource 的区别
Spring 注释 @Autowired 和@Resource 的区别 一. @Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上. 二. @Autowired ...
- Spring注解@Component、@Repository、@Service、@Controller,@Autowired、@Resource用法
一.Spring定义bean,@Component.@Repository.@Service 和 @Controller Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥 ...
- @Autowired与@Resource的差别
1.@Autowired与@Resource都能够用来装配bean. 都能够写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...
- @Autowired与 @Resource
@Autowired, @Resource 1.注解类型: Autowired可用于构造器.属性.方法.注解 @Target({ElementType.CONSTRUCTOR, ElementType ...
随机推荐
- Virtual Treeview 安装以及入门
Virtual Treeview是一套Delphi下优秀的VCL控件,代码质量高,使用灵活.功能强大.性能非常好,可以用于表达Treeview和表格类数据.它的代码现在托管在google code上. ...
- Jquery UI 中Tree组件的json格式,java递归拼接demo
数据库中表数据,如下图: 实现的需求是,如果suporgcode数据为null 的情况下,表示在一级节点 "请选择" 的二级节点,然后是如:3和36 是1的子节点,一步一步的节点延 ...
- Linux 静态库与动态库搜索路径设置详解
转载:http://blog.chinaunix.net/uid-29025972-id-3855495.html 1. 连接和运行时库文件搜索路径的设置 库文件在连接(静态库和共享库)和运行(仅限于 ...
- hibernate将connection放进threadlocal里实现数据库连接池
Why ThreadLocal? 无论如何,要编写一个多线程安全(Thread-safe)的程序是困难的,为了让线程共享资源,必须小心地对共享资源进行同步,同步带来一定的效能延迟,而另一方面,在处理同 ...
- python笔记18-sort和sorted区别
前言 python的排序有两个方法,一个是list对象的sort方法,另外一个是builtin函数里面sorted,主要区别: sort仅针对于list对象排序,无返回值, 会改变原来队列顺序 sor ...
- java通过jacob来读取word转换为htm格式
转自:http://blog.csdn.net/chinapi_hzh/article/details/5798689 因为微软没有公开word源代码,所以直接用java流来读取word的后果是读出来 ...
- C#编程兵书
<C#编程兵书> 基本信息 作者: 张志强 胡君 丛书名: 程序员藏经阁 出版社:电子工业出版社 ISBN:9787121207402 上架时间:2013-8-26 出版日期:2013 年 ...
- 嵌入式mp3播放器
分四部分:按键驱动,声卡驱动,Madplay播放器移植,MP3主播放器处理 按键1:播放,按键2:停止,按键3:上一曲,按键4:下一曲 UA1341内核自带声卡驱动 .解压内核: tar zxvf l ...
- C++内存管理学习堆和栈
来源:http://c.chinaitlab.com/basic/936306_2.html 一 C++内存管理 1.内存分配方式 在讲解内存分配之前,首先,要了解程序在内存中都有什么区域,然后再详细 ...
- Perl & Python编写CGI
近期偶然玩了一下CGI,收集点资料写篇在这里留档. 如今想做HTTP Cache回归測试了,为了模拟不同的响应头及数据大小.就须要一个CGI按须要传回指定的响应头和内容.这是从老外的測试页面学习到的经 ...