@Autowired & @Resource 区别 & 解读@Bean
一样
Autowired & @Resource 都可以用来Bean的注入,可以写在属性(字段)上、也可以写在setter方法上
不一样
1.来源不一样
@Autowired 由Spring提供
@Resource 由J2EE提供
2.注入方式不一样
@Autowired 默认ByType(按类型注入),若需按名字,则配合使用@Qualifier,默认依赖对象必须存在,若允许不存在,需指定required=false
@Resource 默认ByName(按名字注入),若找不到对应的Bean,会继续按类型去找;但一旦指定了name,那么只会按名字去找Bean
3.不重要的不一样
@Autowired 使用属性(字段)注入的话,有的编译器要警告,建议使用构造方法注入;@Resource 则不会,然而,@Resource不能使用构造方法注入
如果使用属性(字段)注入的话,则容易出现NullPointerException;如果使用setter方法注入,则属性不能设置为final
争论:
有人说使用@Resource可以解耦(个人不太认同,为什么呢?)
首先,使用注解进行对Bean的注入,但是,我们得需要一个机制(一些处理类<解析器>)来对这些使用了@Autowired & @Resource 进行解析,比如:
然而以上这些解析类都是由Spring提供的,所以说,不太能解耦啊(我是这样理解的,欢迎指正)
我们会在applicationContext.xml 中配置 <context:annotation-config/> ----这句话的作用就是:激活那些已经在spring容器里注册过的bean,@Autowired 、@Resource注解本身不能做任何事情,我们需要一些工具来处理这些,而这句配置就是来加载这里工具(如上面的四个Processor)
@Configuration
public class BeanConfig {
@Bean
public Student student() {
return new Student();
} @Bean
public Course course() {
return new Course(student());
}
}
@Component
public class BeanConfig {
@Bean
public Student student() {
return new Student();
} @Bean
public Course course() {
return new Course(student());
}
}
- 扫描(@ComponentScan)+ 组件使用注解类(@Controller、@Service、@Repository、@Configuration、@Component);
- 用@Bean注解;
- 用@Import
注解注解;- @Import快速注册;For Example:@Import(value = {BeanConfig.class, UserVO.class}),UserVO可以使用@Component,也可以不使用
- 实现ImportSelector接口
- 实现ImportBeanDefinitionRegistrar接口
- 用FactoryBean接口;
基本作用域(singleton、prototype),Web 作用域(reqeust、session、globalsession),自定义作用域。Spring默认使用singleton作用域
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效
@Autowired & @Resource 区别 & 解读@Bean的更多相关文章
- @Autowired @Resource @Qualifier的区别
参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/det ...
- Autowired和Resource区别
@Autowired和@Resource熟悉吧?是不是经常复制粘贴顺手就来,两者都是用来给成员变量自动装载,可是它俩到底有啥区别呢? 1.@Autowired与@Resource都可以用来装配bean ...
- 【Java面试】@Resource 和 @Autowired 的区别
Hi,大家好,我是Mic. 一个工作2年的粉丝,问我一个Spring里面的问题. 希望我能从不同的视角去分析,然后碾压面试官. 这个问题是: "@Resource和@Autowired&qu ...
- Spring通过注解@Autowired/@Resource获取bean实例时为什么可以直接获取接口而不是注入的类
问: 这个问题困扰了我好久,一直疑问这个接口的bean是怎么注入进去的?因为只看到使用@Service注入了实现类serviceImpl,使用时怎么却获取的接口,而且还能调用到实现类的方法,难道这个接 ...
- @Required @Autowired @Resource注解详解
一.@Required注解用于检查特定的属性是否设置 1.RequiredAnnotationBeanPostProcessor 为该注解的处理器,即bean后置处理器,检查所有带有该解的bean属性 ...
- @Resource和@Autowired的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...
- spring @Resource和@Autowired的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...
- Spring注解@Resource和@Autowired的区别
@Resource和@Autowired都是用来做bean的依赖注入的,两者都可以写在字段和setter方法上. java为我们提供了 javax.annotation.Resource这个注解. s ...
- spring中@Autowired与 @Resource区别
@Autowired 与@Resource的区别: 1. @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2. @Autowired默认 ...
随机推荐
- 51nod-1179-最大的gcd(数学)
1179 最大的最大公约数 题目来源: SGU 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 给出N个正整数,找出N个数两两之间最大公约数的最大 ...
- nyoj——5字符串STL复习
Binary String Matching 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose alp ...
- Python内置函数详解-总结篇
参考链接:http://www.cnblogs.com/sesshoumaru/p/6140987.html
- Linux命令 ls -l 输出内容含义详解
Linux命令 ls -l s输出内容含义详解 1. ls 只显示文件名或者文件目录 2. ls -l(这个参数是字母L的小写,不是数字1) 用来查看详细的文件资料 在某个目录下键入ls -l可 ...
- 004-对象——public protected private PHP封装的实例
<?php /** *public protected private PHP封装的实例 */ /*class tv { private $shengyin; function __constr ...
- 【2018多校第一场】hdu6308-Time Zone(日期)
Problem Description Chiaki often participates in international competitive programming contests. The ...
- html5 圆角ie8
http://files.cnblogs.com/files/panmy/%E5%9C%86%E8%A7%92.rar
- C++设计模式之-工厂模式的总结
工厂模式分为3种,即简单工厂模式.工厂方法模式.抽象工厂模式,其实大同小异,总结下来就是: 简单工厂模式:一个工厂,多个产品.产品需要有一个虚基类.通过传入参数,生成具体产品对象,并利用基类指针指向此 ...
- functools 和 itertools
functools 补充 1 wraps 在编写装饰器时,在实现前加入 @functools.wraps(func) 可以保证装饰器不会对被装饰函数造成影响.wraps 保存被装饰函数的原信息 def ...
- Python3 flask nginx uwsgi 环境搭建
配置项目的时候一般使用虚拟环境,是各个项目的环境独立起来,更多方便管理.至于如何使用搜索即可,并不难 1.安装python3 yum -y install zlib-devel bzip2-devel ...