• Spring注解简介


    使用注解之前要开启自动扫描功能,其中base-package为需要扫描的包(含子包)。

    <context:component-scan base-package="com.jiang"/>

    1、@Component

    是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,不推荐使用。

    Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

    2、@Service

    用于标注业务层组件。

    3、@Controller

    用于标注控制层组件(如struts中的action)。

    4、@Repository

    用于标注数据访问组件,即DAO组件。

    5、@Configuration

    作用类似于配置一个spring-bean.xml中的<beans></beans>标签的作用,主要用于Bean的注入,放置在类上。使用该注解注入Bean后,获取IOC容器的方式不再使用ClassPathXmlApplicationContext或者文件系统路径来获取对应的IOC容器,而是使用AnnotationConfigApplicationContext(AnnotationConfiguration.class)的方式来获取IOC容器(AnnotationConfiguration为自定义的配置类)。

    6、@Scope

    注解是springIoc容器中的一个作用域,在 Spring IoC 容器中具有以下几种作用域:基本作用域singleton(单例)、prototype(多例),Web 作用域(reqeust、session、globalsession),自定义作用域。

    singleton单例模式 -- 全局有且仅有一个实例
    prototype原型模式 -- 每次获取Bean的时候会有一个新的实例
    request -- request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
    session -- session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
    globalsession -- global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义

    几乎90%以上的业务使用singleton单实例就可以,所以spring默认的类型也是singleton,singleton虽然保证了全局是一个实例,对性能有所提高,但是如果实例中有非静态变量时,会导致线程安全问题,共享资源的竞争,当设置为prototype时:每次连接请求,都会生成一个bean实例,也会导致一个问题,当请求数越多,性能会降低,因为创建的实例,导致GC频繁,gc时长增加


    直接在bean对象方法上增加@Scope注解就可以如下:

    /**
    * 定义一个bean对象
    * @return
    */
    @Scope
    @Bean(value="user0",name="user0",initMethod="initUser",destroyMethod="destroyUser")
    public User getUser(){
    System.out.println("创建user实例");
    return new User("张三",26);
    }

    7、@Autowired

    @Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。

    @Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。

    8、@Qualifier(指定注入Bean的名称)

    如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称。

    9、@Resource

    @Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

    @Resource的装配顺序:

    (1)、@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配

    (2)、指定了name或者type则根据指定的类型去匹配bean

    (3)、指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

    然后,区分一下@Autowired和@Resource两个注解的区别:

    (1)、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配

    (2)、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了

    Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

    10、@PostConstruct

    注解在方法上,表示此方法是在Spring实例化该Bean之后马上执行此方法,之后才会去实例化其他Bean,并且一个Bean中@PostConstruct注解的方法可以有多个。

    11、@PreDestroy

    注解在方法上,修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

  • 相关阅读:
    单链表反转
    C++面试题
    堆排序
    1链表:回文链表(leetcode 234)
    深信服社招linux岗面试记录
    腾讯后台开发社招记录(电话面试)
    小米社招ATE岗位记录
    诺基亚社招C++面试记录
    腾讯后台开发社招面试记录
    makefile笔记
  • 原文地址:https://www.cnblogs.com/yyxianren/p/15747537.html
Copyright © 2020-2023  润新知