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

1. InitializingBean.afterPropertiesSet()
Spirng中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是该销毁前调用指定的方法。
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上。

时间: 2024-08-03 04:58:27

spring中afterPropertiesSet方法与init-method配置描述的相关文章

spring中使用parent属性来减少配置

在基于spring框架开发的项目中,如果有多个bean都是一个类的实力,如配置多个数据源时,大部分配置的属性都一样,只有少部分不一样,经常是copy上一个的定义,然后修改不一样的地方.其实spring bean定义也可以和对象一样进行继承. 示例如下:  <bean id="testBeanParent"  abstract="true"  class="com.wanzheng90.bean.TestBean">         &

关于spring中使用多个quatz配置文件配置计划任务时,只有其中一个文件的任务有效的问题

关于spring中使用多个quatz配置文件配置计划任务时,只有其中一个文件的任务有效的问题 问题描述 工作中用到了spring与quatz来实现定时器触发一些计划任务,原本都写在一个配置文件里.后来将不同业务逻辑拆分成两个文件后,发现每次spring容器启动后,只有其中一个文件中配置的计划任务有再执行,另一个则没有. 解决方案 通过google在stackoverflow上找到了解决方案,其实原因很简单.在spring容器中配置了多个Scheduler的情况下,必须给每个Scheduler指定

Spring中的AOP注解方式和配置方式

今天学习了下spring中的切面编程:结合之前看过的视频.整合一下思路: 基本类: 接口: public interface ArithmeticCalculator { int add(int i, int j); int sub(int i, int j); int mul(int i, int j); int div(int i, int j); } 接口的实现: import org.springframework.stereotype.Component; @Component("ar

spring 中常用的两种事务配置方式以及事务的传播性、隔离级别

转载:http://blog.csdn.net/qh_java/article/details/51811533 一.注解式事务 1.注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo. 2.事务配置实例 (1).spring+mybatis 事务配置 [html] view plain copy <!-- 定义事务管理器 --> <bean id="transactionManager" class="

《Java虚拟机原理图解》1.5、 class文件中的方法表集合--method方法在class文件中是怎样组织的

0. 前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的. 感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成<Java虚拟机原理图解> 这个系列,以图解的形式,将抽象的JVM虚拟机的知识具体化,希望能够对想了解Java虚拟机原理的的Java程序员 提供点帮助.

《Java虚拟机原理图解》6、 class文件中的方法表集合--method方法在class文件中是怎样组织的

0. 前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的. 感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成<Java虚拟机原理图解> 这个系列,以图解的形式,将抽象的JVM虚拟机的知识具体化,希望能够对想了解Java虚拟机原理的的Java程序员 提供点帮助.

Spring中依赖注入的使用和配置

使用方法1: //在执行此实例化的时候就会完成所有注入 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserService service = (UserService)ctx.getBean("userService"); 使用方法2: public class SocketRequest { /** * 默认实例 */ private

Spring中Quartz的最精简的配置

<bean id="parserJob4Pos" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <!-- 这里的myQuartzJobBean需要继承QuartzJobBean --> <value>com.bejson.com.myQuartzJobBean</v

java代码中init method和destroy method的三种使用方式

在java的实际开发过程中,我们可能常常需要使用到init method和destroy method,比如初始化一个对象(bean)后立即初始化(加载)一些数据,在销毁一个对象之前进行垃圾回收等等. 周末对这两个方法进行了一点学习和整理,倒也不是专门为了这两个方法,而是在巩固spring相关知识的时候提到了,然后感觉自己并不是很熟悉这个,便好好的了解一下. 根据特意的去了解后,发现实际上可以有三种方式来实现init method和destroy method. 要用这两个方法,自然先要知道这两