zoukankan      html  css  js  c++  java
  • @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 进行解析,比如:

        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
  • 相关阅读:
    asp.net点击按钮下载图片而不是打开图片
    在事务中调用WebService一定程度上实现数据同步
    C#自定义Attribute的定义和获取简例
    开发ASP.NET下的MP3小偷程序
    Ajax 中XmlHttp 乱码 的解决方法 (UTF8,GB2312 编码 解码)
    MasterPage 类
    怎样成为优秀的软件测试员
    标准日本语动词大全
    什么是WSDL?
    ASP.NET程序中常用的三十三种代码
  • 原文地址:https://www.cnblogs.com/swugogo/p/9951772.html
Copyright © 2011-2022 走看看