• spring中afterPropertiesSet方法与init-method配置描述


    1. InitializingBean.afterPropertiesSet()
    Spring中InitializingBean接口类为bean提供了定义初始化方法的方式,它仅仅包含一个方法:afterPropertiesSet()。
    Bean实现这个接口,在afterPropertiesSet()中编写初始化代码:

    public class EventEngineImpl implements EventEngine, InitializingBean {
    
        private static final Map<String, List<SubscribeRule>> EVENT_RULE_MAP = new HashMap<String, List<SubscribeRule>>();
    
        /**
         * 规则列表
         */
        protected List<SubscribeRule> listEventRule;
    
        public void publishEvent(Event event) {
            ...
        }
    
        public void afterPropertiesSet() throws Exception {
            ...
        }
    
        public void setListEventRule(List<SubscribeRule> listEventRule) {
            this.listEventRule = listEventRule;
        }
    }

    在xml配置文件中并不需要对bean进行特殊的配置,Spring在在配置文件完成该bean的所有赋值后,会检查该bean是否实现了InitializingBean接口,如果实现就调用bean的afterPropertiesSet方法。

    2. init-method配置
    Spring虽然可以通过InitializingBean完成一个bean初始化后调用这个bean自定义方法,但是这种方式要求bean实现InitializingBean接口。一但bean实现了InitializingBean接口,那么这个bean的代码就和Spring耦合到一起了。可以使用Spring提供的init-method的功能来执行一个bean自定义的初始化方法。
    以下代码中,类MonitorKafka不实现任何Spring的接口,定义一个没有参数的方法monitorKafkaMsg()。

    public class MonitorKafka {
    
        private String topic;
    
        public MonitorKafka() {
        }
    
        public void monitorKafkaMsg() {
            ...
        }
    
        protected void destroy() {
            try {
                if (null != consumerConnector) {
                    consumerConnector.shutdown();
                    logger.debug("[kafka通用组件]停止消费线程组");
                }
                if (null != executor) {
                    executor.shutdownNow();
                    logger.debug("[kafka通用组件]停止线程池");
                }
            } catch (RuntimeException e) {
                logger.error("[kafka通用组件]停止消费线程或停止线程池组异常.{}", e);
            }
        }
    
        public void setTopic(String topic) {
            this.topic = topic;
        }
    
        public String getTopic() {
            return topic;
        }
    }
        <bean id="monitorPaymentKafka" class="com.xxx.xxx.kafka.MonitorKafka" scope="singleton" init-method="monitorKafkaMsg" destroy-method="destroy">
            <property name="topic" value="test" />
        </bean>

    注:destroy-method是该bean销毁前调用指定的方法。
    init-method配置中的monitorKafkaMsg()方法将会在该bean初始化完成后被调用,Spring要求init-method是一个无参数的方法,否则会抛出异常,Spring将中止这个Bean的后续处理,并且抛出一个 org.springframework.beans.factory.BeanCreationException异常。

    总结:
    1. InitializingBean和init-method可以一起使用,Spring会先处理InitializingBean再处理init-method。init-method是通过反射执行的,而afterPropertiesSet是直接执行的,所以 afterPropertiesSet的执行效率比init-method要高,不过init-method消除了bean对Spring依赖,推荐使用init-method。
    2. 如果一个bean被定义为非单例的,那么afterPropertiesSet和init-method在bean的每一个实例被创建时都会执行。单例bean的afterPropertiesSet和init-method只在bean第一次被实例时调用一次。一般情况下afterPropertiesSet和init-method都应用在单例的bean上。
    3. @PostConstruct和@PreDestory可以通过在类方法上注解方式实现类似的功能。

  • 相关阅读:
    初级安全入门——安全漏洞的检测与利用
    Gazebo11的安装与启动
    ROS入门(四)——Gazebo的基本使用
    ROS入门(二)——服务和全局参数
    ROS入门(一)——基本概念和话题
    数据结构与算法(三+)——列表的Java实现
    Java EE入门(二十)——Maven基础
    Java EE入门(十九)——Redis基础
    Java EE入门(十八)——Ajax&JSON基础
    npm中如何更新自己已经发布的1.0.0的模块包?
  • 原文地址:https://www.cnblogs.com/atai/p/7058562.html
Copyright © 2020-2023  润新知