结论: 这个就是在bean配置完成之后对bean进行初始化的;我们可以用来给bean的某些属性进行特殊赋值

  1. @Slf4j
  2. @Service
  3. public class CIBService implements InitializingBean {
  4. private OkHttpClient client = null;
  5. @Autowired
  6. private IRedisService redisService;
  7. /**
  8. *重写的是InitializingBean 接口的方法;
  9. * 实现的作用是给 client赋值了;在调用getRetrofitInstance()方法的时候就能用client了
  10. * 用static也能实现类似的工作;
  11. */
  12. @Override
  13. public void afterPropertiesSet() throws Exception {
  14. OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
  15. client = httpBuilder.readTimeout(60, TimeUnit.SECONDS)
  16. .connectTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS)
  17. .addInterceptor((new HttpLoggingInterceptor()
  18. .setLevel(HttpLoggingInterceptor.Level.BODY))) //设置超时
  19. .build();
  20. }
  21. private Retrofit getRetrofitInstance(String url) {
  22. return new Retrofit.Builder()
  23. .baseUrl(url)
  24. .addConverterFactory(SimpleXmlConverterFactory.create())
  25. .client(client)
  26. .build();
  27. }
  28. }

1. InitializingBean.afterPropertiesSet()

Spring中InitializingBean接口类为bean提供了定义初始化方法的方式,它仅仅包含一个方法:afterPropertiesSet()。
Bean实现这个接口,在afterPropertiesSet()中编写初始化代码;在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异常。