Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象。
Spring初始化bean有两种方式:
- 实现InitializingBean接口,实现afterPropertiesSet方法。(比通过反射调用init-method指定的方法效率要高一点)
- 配置文件中通过init-method指定,两种方式可以同时使用。(init-method方式消除了对spring的依赖)
InitializingBean 使用场景:
- 通过外部对类是否是单例进行控制,该类自己无法感知
- 对类的创建之前进行初始化的操作,在afterPropertiesSet()中完成。
执行顺序优先级:
构造方法 > postConstruct >afterPropertiesSet > init方法
如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。
package com.vipsoft.mqtt.pool; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; @Service public class MqttManager implements InitializingBean { public MqttManager() { System.out.println("构造方法执行..."); } @PostConstruct public void postConstruct() { System.out.println("postConstruct方法执行..."); } @Override public void afterPropertiesSet() throws Exception { System.out.println("afterPropertiesSet方法执行..."); } public void init() { System.out.println("init方法执行..."); } @Bean(initMethod = "init") public MqttManager test() { return new MqttManager(); } }
输出
构造方法执行... postConstruct方法执行... afterPropertiesSet方法执行... 构造方法执行... postConstruct方法执行... afterPropertiesSet方法执行... init方法执行...