bean 自定义初始化,销毁的几种方法

        我们都知道bean在声明式定义中可以通过xml文件注入还有@bean,@Component注解来定义bean,不过在spring4以后已经渐渐开始提倡使用注解方式来声明bean了,这里我们就按照注解方式声明来讲了

我们都知道bean的生命周期要经历 获取

        bean名→

        无参实例化→

        依赖注入(属性赋值)→

        (BeanPostProcessor)初始化前→

        初始化→

        (BeanPostProcessor)初始化后→

        aop动态代理→

        使用→

        销毁。

其中我们经常控制操作的步骤就是初始化和销毁,下面就来介绍下怎么自定义设置初始化和销毁方法。

1. @Bean的注解的initMethod、DestroyMethod属性

        这个是我们比较常用的

@Configuration
public class SpringConfig {

    @Bean(name = "cat", initMethod = "init", destroyMethod = "destroy")
    public Cat getCat() {
        return new Cat();
    }
}

@Configuration可以不写,不过我们一般都会写上,上面的name就是bean的名字,initMethod就是bean里定义的初始化方法,destroymethod就是bean里定义的销毁方法,

2. bean实现InitializingBean、DisposableBean接口

        上面那种需要在声明bean的时候指定好方法,那么有没有一种在写bean类的时候就设计好的调用初始化和销毁的方法呢,那么我们就有了下面的

public class Dog implements InitializingBean, DisposableBean {

    public Dog() {
        System.out.println("dog...constructor...");
    }

    // Dog类的初始化方法
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("dog...afterPropertiesSet...");
    }

    // Dog类的销毁方法
    @Override
    public void destroy() throws Exception {
        System.out.println("dog...destroy...");
    }
}

实现InitialzingBean接口的afterPropertiesSet方法,即为bean的初始化方法。

实现DisposableBean接口的destroy方法,即为bean的销毁方法。

这时声明bean的时候只需要@bean(name="dog")了

3. @PostConstruct、@PreDestroy注解

        上面第二种对接口实现也比较麻烦,能不能直接用注解来定义呢? 答案是可以的,我们直接上代码

public class Tiger {

    public Tiger() {
        System.out.println("tiger...constructor");
    }
    
    // 初始化方法
    @PostConstruct
    public void init() {
        System.out.println("tiger...init...");
    }

    // 销毁方法
    @PreDestroy
    public void destroy() {
        System.out.println("tiger...destroy...");
    }
}

同样,只需要@bean(name="dog")声明就好了

根据上面的bean声明周期,我们可以知道bean初始化前后还有一种增加方法,也就是beanPostProcessor

public class MyBeanPostProcessor implements BeanPostProcessor {

    /**
     * 在初始化之前执行
     * @param bean 初始化的bean
     * @param beanName bean的名字
     * @return 初始化的bean或者包装过的bean
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + " ==> " + "postProcessBeforeInitialization...");
        return bean;
    }

    /**
     * 在初始化之后执行
     * @param bean 初始化的bean
     * @param beanName bean的名字
     * @return 初始化的bean或者包装过的bean
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + " ==> " + "postProcessAfterInitialization...");
        return bean;
    }
}

 这个对容器内所有的bean都会执行一遍,

你可能感兴趣的:(java,spring,bean,spring,boot)