@PostConstruct和@PreDestroy不是Spring的注解,是java的Servlet的注解。有servlet容器的时候才会识别这个注解,然后执行。但是Spring框架的InitDestroyAnnotationBeanPostProcessor也对这两个注解进行了特殊处理。也能够处理这两个注解。
ReflectionUtils.doWithLocalMethods(targetClass, method -> {
if (this.initAnnotationType != null && method.isAnnotationPresent(this.initAnnotationType)) {
LifecycleElement element = new LifecycleElement(method);
currInitMethods.add(element);
if (debug) {
logger.debug("Found init method on class [" + clazz.getName() + "]: " + method);
}
}
if (this.destroyAnnotationType != null && method.isAnnotationPresent(this.destroyAnnotationType)) {
currDestroyMethods.add(new LifecycleElement(method));
if (debug) {
logger.debug("Found destroy method on class [" + clazz.getName() + "]: " + method);
}
}
});
@Bean(destroyMethod = “”,initMethod = “”)指定init-method和destory-menthod是Spring的特性。
同时实现InitializingBean接口和添加@PostConstruct注解和添加initMethod,
执行顺序从先到后为:@PostConstruct>InitializingBean接口>initMethod
同时实现DisposableBean接口和添加@PreDestroy注解和添加destoryMethod,
执行顺序从先到后为:@PreDestroy>DisposableBean接口>destoryMethod
尽量不要实现Spring的接口方式,耦合Spring。而要用注解或者xml的方式。