美文网首页
Spring的@PostConstruct和@PreDestro

Spring的@PostConstruct和@PreDestro

作者: 大风过岗 | 来源:发表于2020-04-21 17:19 被阅读0次

Spring的PostConstruct和PreDestroy注解

1 介绍

Spring允许我们在bean创建和销毁时,执行自定义的动作。例如,我们可以通过实现InitializingBean 和DisposableBean 接口来实现。
在这篇文章中,我们将使用@PostConstruct和@PreDestroy来完成这一点。

2 @PostConstruct注解

对于Spring来说,它只会在bean初始化之后,对注有@PostConstruct的方法调用一次。需要牢记的是,即使初始化工作啥事也没做,带有@PostConstruct的方法还是会被调用。注有@PostConstruct注解的方法可以是任意的访问级别,但它不能是静态方法。

一个使用@PostConstruct注解的案例就是向数据库中插入初始化数据。在开发时,我们可能需要创建一些默认的用户:

@Component
public class DbInit {

    @Autowired
    private UserRepository userRepository;

    @PostConstruct
    private void postConstruct() {
        User admin = new User("admin", "admin password");
        User normalUser = new User("user", "user password");
        userRepository.save(admin, normalUser);
    }
}

上面的例子,会首先初始化UserRepository ,之后就会执行@PostConstruct 方法。

3.@PreDestroy注解

在spring把我们的bean移出应用上下文之前,带有@PreDestroy注解的方法会被执行一次。和@PostConstruct注解一样,注有@PostConstruct注解的方法可以是任意的访问级别,但它不能是静态方法。

@Component
public class UserRepository {

    private DbConnection dbConnection;
    @PreDestroy
    public void preDestroy() {
        dbConnection.close();
    }
}

此方法的作用是在bean销毁之前,释放资源或者是执行其他的清理任务,例如:关闭数据库连接等。

Java9+

@PostConstruct和 @PreDestroy注解是JavaEE的一部分,而从Java9开始,JavaEE就已经过时了,并从Java11中移除出去了。如果我们想使用这俩个注解,就不得不添加额外的依赖。

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

5、源码

package javax.annotation;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

/**
 * The PostConstruct annotation is used on a method that needs to be executed
 * after dependency injection is done to perform any initialization. This
 * method MUST be invoked before the class is put into service. This
 * annotation MUST be supported on all classes that support dependency
 * injection. The method annotated with PostConstruct MUST be invoked even
 * if the class does not request any resources to be injected. Only one
 * method can be annotated with this annotation. The method on which the
 * PostConstruct annotation is applied MUST fulfill all of the following
 * criteria:
 * <p>
 * <ul>
 * <li>The method MUST NOT have any parameters except in the case of
 * interceptors in which case it takes an InvocationContext object as
 * defined by the Interceptors specification.</li>
 * <li>The method defined on an interceptor class MUST HAVE one of the
 * following signatures:
 * <p>
 * void &#060;METHOD&#062;(InvocationContext)
 * <p>
 * Object &#060;METHOD&#062;(InvocationContext) throws Exception
 * <p>
 * <i>Note: A PostConstruct interceptor method must not throw application
 * exceptions, but it may be declared to throw checked exceptions including
 * the java.lang.Exception if the same interceptor method interposes on
 * business or timeout methods in addition to lifecycle events. If a
 * PostConstruct interceptor method returns a value, it is ignored by
 * the container.</i>
 * </li>
 * <li>The method defined on a non-interceptor class MUST HAVE the
 * following signature:
 * <p>
 * void &#060;METHOD&#062;()
 * </li>
 * <li>The method on which PostConstruct is applied MAY be public, protected,
 * package private or private.</li>
 * <li>The method MUST NOT be static except for the application client.</li>
 * <li>The method MAY be final.</li>
 * <li>If the method throws an unchecked exception the class MUST NOT be put into
 * service except in the case of EJBs where the EJB can handle exceptions and
 * even recover from them.</li></ul>
 * @since Common Annotations 1.0
 * @see javax.annotation.PreDestroy
 * @see javax.annotation.Resource
 */
@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PostConstruct {
}


相关文章

网友评论

      本文标题:Spring的@PostConstruct和@PreDestro

      本文链接:https://www.haomeiwen.com/subject/okdpihtx.html