Spring JSR-250 注解



  • JSR-250 注解

    Spring还支持基于JSR-250的注解,其中包括@PostConstruct,@PreDestroy和@Resource注解。尽管实际上并不需要这些注解,因为您已经有其他替代方法,但是让我们对它们进行简要了解。
  • @PostConstruct和@PreDestroy注解

    要定义bean的设置和拆卸,我们只需声明带有init-method和/或destroy-method参数的<bean> 。init-method属性指定在实例化后立即在Bean上调用的方法。同样,destroy-method指定一种在将bean从容器中删除之前被调用的方法。您可以将@PostConstruct注解用作初始化回调的替代方法,并将@PreDestroy注解用作破坏回调的替代方法,如以下示例中所述。
    1. 创建一个名称为SpringExample的项目,并在创建的项目的src文件夹下创建一个包com.jc2182
    2. 使用“添加外部JAR”选项添加所需的Spring库,如“Spring Hello World示例”一章中所述。
    3. 在com.jc2182包下创建Java类HelloWorld 和 MainApp。
    4. 在src文件夹下创建Beans配置文件Beans.xml。
    5. 最后一步是创建所有Java文件和Bean配置文件的内容,然后按以下说明运行应用程序。
    以下是HelloWorld.java内容。
    package com.jc2182;
    import javax.annotation.*;
    
    public class HelloWorld {
       private String message;
    
       public void setMessage(String message){
          this.message  = message;
       }
       public String getMessage(){
          System.out.println("Your Message : " + message);
          return message;
       }
       
       @PostConstruct
       public void init(){
          System.out.println("Bean is going through init.");
       }
       
       @PreDestroy
       public void destroy(){
          System.out.println("Bean will destroy now.");
       }
    }
    
    以下是MainApp.java文件的内容。在这里,您需要注册一个在AbstractApplicationContext类上声明的关闭钩子registerShutdownHook()方法。这将确保正常关机并调用相关的destroy方法。
    package com.jc2182;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MainApp {
       public static void main(String[] args) {
          ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
    
          Profile profile = (Profile) context.getBean("profile");
          profile.printAge();
          profile.printName();
       }
    }
    
    以下是初始化和销毁​​方法所需的配置文件Beans.xml
    <?xml version = "1.0" encoding = "UTF-8"?>
    
    <beans xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context = "http://www.springframework.org/schema/context"
       xsi:schemaLocation = "http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
       <context:annotation-config/>
       <bean id = "helloWorld" class = "com.jc2182.HelloWorld"
          init-method = "init" destroy-method = "destroy">
          <property name = "message" value = "Hello World!"/>
       </bean>
    
    </beans>
    
    创建完源和Bean配置文件后,让我们运行该应用程序。如果您的应用程序一切正常,这将打印以下消息:
    Bean is going through init.
    Your Message : Hello World!
    Bean will destroy now.
    
  • @Resource注解

    您可以在属性或setter方法上使用@Resource批注,其作用与Java EE 5中的相同。@Resource批注具有“名称”属性,该属性将被解释为要注入的Bean名称。您可以说,它遵循了自动命名的语义,如以下示例所示
    package com.jc2182;
    
    import javax.annotation.Resource;
    
    public class TextEditor {
       private SpellChecker spellChecker;
    
       @Resource(name = "spellChecker")
       public void setSpellChecker( SpellChecker spellChecker ){
          this.spellChecker = spellChecker;
       }
       public SpellChecker getSpellChecker(){
          return spellChecker;
       }
       public void spellCheck(){
          spellChecker.checkSpelling();
       }
    }
    
    如果未明确指定“name”,则默认名称是从属性名称或setter方法派生的。如果是属性,则使用属性名称;在使用setter方法的情况下,它采用bean属性名称。