Spring基于注解的配置

Spring 还支持基于 JSR-250 的注解,其中包括 @PostConstruct,@PreDestroy 和 @Resource 注解。虽然这些注解不是真正需要的,因为你已经有其他替代品,但让我们简要了解一下。

@PostConstruct 和@PreDestroy 注解:

  • 要定义一个 bean 的设置和拆卸,我们只需使用 init-method 或 destroy-method 参数声明 bean。init-method 属性指定一个在实例化后立即在 bean 上调用的方法。类似地,destroy-method 指定在 bean 从容器中删除之前调用的方法。
  • 在这里你可以使用 @PostConstruct 注解作为初始化回调和 @PreDestroy 注解的替代,作为销毁回调的替代。下面通过一个例子来说明一下。

创建包 com.shiyanlou.demo.helloworld,然后创建 HelloWorld.java,代码如下:

package com.shiyanlou.demo.helloworld;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class HelloWorld {
    private String messageString;

    public void setMessage(String message){
        this.messageString = message;
    }

    public void getMessage(){
        System.out.println(this.messageString);
    }

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

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

在 SpringBeans.xml 中增加如下代码:

<bean id = "helloWorld" class = "com.shiyanlou.demo.helloworld.HelloWorld">
        <property name = "Message" value = "Hello World!"/>
</bean>

修改 App.java 如下:

package com.shiyanlou.demo;

import com.shiyanlou.demo.helloworld.HelloWorld;
import com.shiyanlou.demo.entity.Dog;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;

public class App {
    // private static ApplicationContext context;

    public static void main(String[] args) {
        // context = new ClassPathXmlApplicationContext("SpringBeans.xml");

        // Dog dog = (Dog) context.getBean("dogBean");
        // System.out.println(dog);

        AbstractApplicationContext abstractApplicationContext = new ClassPathXmlApplicationContext("SpringBeans.xml");

        HelloWorld helloWorld = (HelloWorld)abstractApplicationContext.getBean("helloWorld");
        helloWorld.getMessage();
        abstractApplicationContext.registerShutdownHook();
    }
}

运行:

mvn compile
mvn exec:java -Dexec.mainClass="com.shiyanlou.demo.App"

实验结果如下:

@Resource 注解:

  • 你可以对字段或 setter 方法使用 @Resource 注解,它与 Java EE 5 中的工作方式相同。@Resource 注解采用 “name” 属性,将被解释为要注入的 bean 名称。
  • 如果没有明确指定 “name”,则默认名称是从字段名称或 setter 方法派生的。在一个字段的情况下,它需要字段名称,在 setter 方法的情况下,它将使用 bean 属性名称。

修改 HelloWorld.java:

package com.shiyanlou.demo.helloworld;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

public class HelloWorld {
    private String messageString;

    @Resource(name = "msg")
    public void setMessage(String message){
        this.messageString = message;
    }

    public void getMessage(){
        System.out.println(this.messageString);
    }

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

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

增加 SpringBeans.xml:

    <bean id = "helloWorld" class = "com.shiyanlou.demo.helloworld.HelloWorld">
        <!--<property name = "Message" value = "Hello World!"/>-->
    </bean>

    <bean id = "msg" class = "java.lang.String">
        <constructor-arg index = "0" value = "Hello World!"></constructor-arg>
    </bean>

运行:

mvn compile
mvn exec:java -Dexec.mainClass="com.shiyanlou.demo.App"

实验结果如下:

原文地址:https://www.cnblogs.com/sakura579/p/13951909.html