一样    

  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 进行解析,比如:

    AutowiredAnnotationBeanPostProcessor
    CommonAnnotationBeanPostProcessor
    PersistenceAnnotationBeanPostProcessor
    RequiredAnnotationBeanPostProcessor

  然而以上这些解析类都是由Spring提供的,所以说,不太能解耦啊(我是这样理解的,欢迎指正)

 
引申:
  我们会在applicationContext.xml 中配置 <context:annotation-config/> ----这句话的作用就是:激活那些已经在spring容器里注册过的bean,@Autowired 、@Resource注解本身不能做任何事情,我们需要一些工具来处理这些,而这句配置就是来加载这里工具(如上面的四个Processor)
   另外,上述这句配置并不能够注册Bean到Spring容器中(也就是说不能去处理@Component、@Service等这样的注解,那什么能处理这些注解呢?<如何将Bean注册到Spring容器中,不要跟我说xml配置的那种过时的方式哈^_^>)
 
  由上述就会引出这一个配置项:<context:component-scan base-package="com.xxx"/>
   这个配置的作用:
    a>.就是扫面base-package指定的包路径下的类,并将使用了@Component、@Service等这样的注解的类,注册到Spring容器中去
    b>.同时兼备 <context:annotation-config/>这个配置的功能,激活处理@Autowired 、@Resource的工具类
 
 另外的话:
   在使用applicationContext.xml配置的时候,在SpringBoot项目中,可使用@ImportResource(value={"classpath:applicationContext.xml"})进行加载配置文件
   如果在applicationContext.xml中指定了扫描指定包路径下的Bean,<context:component-scan base-package="com.xxx"/>
   这个时候并没什么卵用,SpringBoot项目会默认扫描ApplicationMain启动类所在的包路径及子包路径
   但是,如果同时使用了@ImportResource & @ComponentScan 的话,就只会扫描这applicationContext.xml及@ComponentScan中指定的包路径下的Bean
 
关于@Bean:
   关于为什么会有@Bean的存在,我的理解,可能Spring为了OO,而有了@Bean,进而取代了xml中bean,从而减少了配置文件
  @Bean 使用在方法上,并且一般是搭配@Configuration一起使用,与@Component一起使用的时候是有区别的
  以下两段代码中,代码1中,Student只会实例化一次(使用了CGLib),但在代码2中,Student会实例化两次
至于CGLIB代理的流程,参考:https://my.oschina.net/guangshan/blog/1807721
@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());
}
}
在Spring中注册Bean
  1. 扫描(@ComponentScan)+ 组件使用注解类(@Controller、@Service、@Repository、@Configuration、@Component);
  2. 用@Bean注解;
  3. 用@Import注解注解;
    • @Import快速注册;For Example:@Import(value = {BeanConfig.class, UserVO.class}),UserVO可以使用@Component,也可以不使用
    • 实现ImportSelector接口
    • 实现ImportBeanDefinitionRegistrar接口
  4. 用FactoryBean接口;
提及到Bean,就不得不说说@Scope了--作用域

  基本作用域(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时,该作用域才有效

 
 https://www.cnblogs.com/leiOOlei/p/3713989.html

@Autowired & @Resource 区别 & 解读@Bean的更多相关文章

  1. @Autowired @Resource @Qualifier的区别

    参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/det ...

  2. Autowired和Resource区别

    @Autowired和@Resource熟悉吧?是不是经常复制粘贴顺手就来,两者都是用来给成员变量自动装载,可是它俩到底有啥区别呢? 1.@Autowired与@Resource都可以用来装配bean ...

  3. 【Java面试】@Resource 和 @Autowired 的区别

    Hi,大家好,我是Mic. 一个工作2年的粉丝,问我一个Spring里面的问题. 希望我能从不同的视角去分析,然后碾压面试官. 这个问题是: "@Resource和@Autowired&qu ...

  4. Spring通过注解@Autowired/@Resource获取bean实例时为什么可以直接获取接口而不是注入的类

    问: 这个问题困扰了我好久,一直疑问这个接口的bean是怎么注入进去的?因为只看到使用@Service注入了实现类serviceImpl,使用时怎么却获取的接口,而且还能调用到实现类的方法,难道这个接 ...

  5. @Required @Autowired @Resource注解详解

    一.@Required注解用于检查特定的属性是否设置 1.RequiredAnnotationBeanPostProcessor 为该注解的处理器,即bean后置处理器,检查所有带有该解的bean属性 ...

  6. @Resource和@Autowired的区别

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...

  7. spring @Resource和@Autowired的区别

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...

  8. Spring注解@Resource和@Autowired的区别

    @Resource和@Autowired都是用来做bean的依赖注入的,两者都可以写在字段和setter方法上. java为我们提供了 javax.annotation.Resource这个注解. s ...

  9. spring中@Autowired与 @Resource区别

    @Autowired 与@Resource的区别: 1. @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2. @Autowired默认 ...

随机推荐

  1. layui弹窗宽度固定高度自适应界面

    //默认上下15px的边距高度,可根据需要修改function layuiDialogFitScreen(){ var layui_title_height=$(window.parent.docum ...

  2. CodeForces - 91B单调队列

    有一个数列,对于每一个数,求比它小的在他右边距离他最远的那个数和他的距离 用单调队列做,维护单调队列时可采用如下方法,对于每一个数,如果队列中没有数,则加入队列,如果队列头的数比当前数大,则舍弃该数 ...

  3. 1-23-shell脚本之-if流程控制语句和for循环语句的使用

    大纲: 1.逻辑判断 2.if流程控制语句 3.for循环控制语句   ---------------------------------------------- 在开始之前,先了解一下逻辑判断符号 ...

  4. 河南省多校联盟二-A

    1279: 简单的背包问题 时间限制: 1 秒  内存限制: 32 MB提交: 361  解决: 20 题目描述 相信大家都学过背包问题了吧,那么现在我就考大家一个问题.有n个物品,每个物品有它的重量 ...

  5. Java截取图片的一部分并保存为40*40的图片

    @Test public void testImag() { try { String path = "E:/flower2.jpg"; int x = 11, y = 20, c ...

  6. Ubuntu 下Python 环境问题

    问题描述: 原先使用Anaconda环境,若卸载后仍不能恢复到系统默认的Python环境. 解决方案: shell 寻找缓存路径,python的扩展/home/tom/anaconda/bin/pyt ...

  7. 创建自定义JSR303的验证约束(Creating custom constraints)

    转载:http://clongjava.iteye.com/blog/1317649 由于输入验证在软件开发中是必须的一件事情,特别是与用户交互的软件产品,验证用户的潜在输入错误是必不可少的一件事情, ...

  8. $.ajaxComplete()

    https://www.cnblogs.com/RachelChen/p/5433881.html 全局ajax事件   必须当页面上存在任何ajax请求的时候都将触发这些特定的全局ajax处理函数. ...

  9. 027——VUE中事件修饰符:stop prevent self capture

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 利用 LINQ的skip和Take 方法对List实现分页效果

    var testList=new List<string>(); )).Take(pageSize); //skip是跳过的条数,pageSize*(pageIndex-),Take 是返 ...