当前位置: 首页 > news >正文

@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装配顺序

1、spring先找类型为users的bean
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:有哪不正确的地方。还请指出。




转载于:https://www.cnblogs.com/lytwajue/p/7304990.html

相关文章:

  • ES6--ArrayBuffer
  • HDU 6078 Wavel Sequence
  • java io
  • 1.spring、mybatis、mysql整合需要的包
  • html行内元素和块级元素及其居中问题
  • 贝叶斯来理解高斯混合模型GMM
  • 键盘输入字符、数字,并判断数是否是2的阶次方数
  • [noip2015 d1t2] 信息传递
  • 【模板】一坨数学算法
  • 单词首字母变大写-vue
  • HDU 5402 Travelling Salesman Problem(棋盘染色 构造 多校啊)
  • oracle归档日志增长过快处理方法
  • 对WebSocket技术的学习与探索(二)
  • noip 2016 Day T1 组合数
  • Python装饰器主要用法
  • @angular/forms 源码解析之双向绑定
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 30秒的PHP代码片段(1)数组 - Array
  • C++11: atomic 头文件
  • golang中接口赋值与方法集
  • idea + plantuml 画流程图
  • JavaScript创建对象的四种方式
  • Just for fun——迅速写完快速排序
  • passportjs 源码分析
  • PAT A1092
  • React中的“虫洞”——Context
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • VuePress 静态网站生成
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 欢迎参加第二届中国游戏开发者大会
  • 排序(1):冒泡排序
  • 设计模式(12)迭代器模式(讲解+应用)
  • 收藏好这篇,别再只说“数据劫持”了
  • 探索 JS 中的模块化
  • 一、python与pycharm的安装
  • 智能合约开发环境搭建及Hello World合约
  • linux 淘宝开源监控工具tsar
  • 阿里云ACE认证学习知识点梳理
  • 阿里云重庆大学大数据训练营落地分享
  • 通过调用文摘列表API获取文摘
  • #LLM入门|Prompt#3.3_存储_Memory
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (WSI分类)WSI分类文献小综述 2024
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (排序详解之 堆排序)
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一一四)第九章编程练习
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Linux下编译安装log4cxx
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版