• Spring Annotation(五)


    使用 JSR-250 的注释

    Spring 不但支持自己定义的 @Autowired 的注释,还支持几个由 JSR-250 规范定义的注释,它们分别是@Resource@PostConstruct 以及 @PreDestroy

    @Resource

    @Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面 @Resource 默认按 byName 自动注入罢了。@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。

    Resource 注释类位于 Spring 发布包的 lib/j2ee/common-annotations.jar 类包中,因此在使用之前必须将其加入到项目的类库中。来看一个使用 @Resource 的例子:


    清单 16. 使用 @Resource 注释的 Boss.java

    package com.baobaotao; 
    import javax.annotation.Resource; 
    public class Boss { 

        // 自动注入类型为 Car 的 Bean 
        @Resource 
        private Car car; 

        // 自动注入 bean 名称为 office 的 Bean 
        @Resource(name = "office") 
        private Office office; 
    }

    一般情况下,我们无需使用类似于 @Resource(type=Car.class) 的注释方式,因为 Bean 的类型信息可以通过 Java 反射从代码中获取。

    要让 JSR-250 的注释生效,除了在 Bean 类中标注这些注释外,还需要在 Spring 容器中注册一个负责处理这些注释的 BeanPostProcessor

    <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

    CommonAnnotationBeanPostProcessor 实现了 BeanPostProcessor 接口,它负责扫描使用了 JSR-250 注释的 Bean,并对它们进行相应的操作。

    @PostConstruct 和 @PreDestroy

    Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,您既可以通过实现 InitializingBean/DisposableBean 接口来定制初始化之后 / 销毁之前的操作方法,也可以通过 <bean> 元素的 init-method/destroy-method 属性指定初始化之后 / 销毁之前调用的操作方法。关于 Spring 的生命周期,笔者在《精通 Spring 2.x—企业应用开发精解》第 3 章进行了详细的描述,有兴趣的读者可以查阅。

    JSR-250 为初始化之后/销毁之前方法的指定定义了两个注释类,分别是 @PostConstruct 和 @PreDestroy,这两个注释只能应用于方法上。标注了 @PostConstruct 注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。


    清单 17. 使用 @PostConstruct 和 @PreDestroy 注释的 Boss.java

    package com.baobaotao; 
    import javax.annotation.Resource; 
    import javax.annotation.PostConstruct; 
    import javax.annotation.PreDestroy; 
    public class Boss { 
        @Resource 
        private Car car; 

        @Resource(name = "office") 
        private Office office; 

        @PostConstruct 
        public void postConstruct1(){ 
            System.out.println("postConstruct1"); 
        } 

        @PreDestroy 
        public void preDestroy1(){ 
            System.out.println("preDestroy1"); 
        } 

        … 
    }

    您只需要在方法前标注 @PostConstruct 或 @PreDestroy,这些方 法就会在 Bean 初始化后或销毁之前被 Spring 容器执行了。

    我们知道,不管是通过实现 InitializingBean/DisposableBean 接口,还是通过 <bean> 元素的 init-method/destroy-method 属性进行配置,都只能为 Bean 指定一个初始化 / 销毁的方法。但是使用@PostConstruct 和 @PreDestroy 注释却可以指定多个初始化 / 销毁方法,那些被标注 @PostConstruct 或@PreDestroy 注释的方法都会在初始化 / 销毁时被执行。

    通过以下的测试代码,您将可以看到 Bean 的初始化 / 销毁方法是如何被执行的:


    清单 18. 测试类代码

     
    package com.baobaotao; 
    import org.springframework.context.support.ClassPathXmlApplicationContext; 
    public class AnnoIoCTest { 
        public static void main(String[] args) { 
            String[] locations = {"beans.xml"}; 
            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(locations); 
            Boss boss = (Boss) ctx.getBean("boss"); 
            System.out.println(boss); 
            ctx.destroy();// 关闭 Spring 容器,以触发 Bean 销毁方法的执行 
        } 
    }

    这时,您将看到标注了 @PostConstruct 的 postConstruct1() 方法将在 Spring 容器启动时,创建 Boss Bean 的时候被触发执行,而标注了 @PreDestroy 注释的 preDestroy1() 方法将在 Spring 容器关闭前销毁 BossBean 的时候被触发执行。

    转自:http://jimmychenli.javaeye.com/blog/327498

  • 相关阅读:
    数据库中的大数据字段和二进制大数据字段(图片)
    mysql中的存储过程和事务隔离
    关于数据库的三个范式的详解
    mysql与java的之间的连接
    mysql中的第三范式
    如何设置ssh安全只允许用户从指定的IP登陆
    MySQL 出现 The table is full 的解决方法
    ssh "openssh-daemon is stopped"操作之伤+sftp访问“-bash: /dev/null: Permission denied”
    CentOS 6 用SVN自动提交文件到web服务器
    centos下pg_dump的服务器版本不匹配问题
  • 原文地址:https://www.cnblogs.com/yujy/p/2795216.html
Copyright © 2020-2023  润新知