一、spring类初始化@PostConstruct > InitializingBean > init-method
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的子类,在初始化bean的时候会执行该方法。
示例
<bean id="myInitializingBean" class="com.paic.phssp.springtest.init.MyInitializingBean" init-method="testInit"></bean>
bean
/** * 继承InitializingBean接口的类,在初始化bean的时候会执行该方法 */ //@Component public class MyInitializingBean implements InitializingBean { public MyInitializingBean() { System.out.println("1MyInitializingBean...."); } @Override public void afterPropertiesSet() throws Exception { System.out.println("3ceshi MyInitializingBean>>>>>>>>>>>>>>>>>>>"); } @PostConstruct //功能上近似init-method,但加载时机不同 public void test(){ System.out.println("2PostConstruct >>>>>>>>>>>>"); } public void testInit(){ System.out.println("4ceshi init-method"); } }
结果:
1MyInitializingBean.... 2PostConstruct >>>>>>>>>>>> 3ceshi MyInitializingBean>>>>>>>>>>>>>>>>>>> 4ceshi init-method
说明:
通过上述输出结果,三者的先后顺序:Constructor > @PostConstruct > InitializingBean > init-method
1.1、 InitializingBean > init-method 执行时机
spring初始化bean过程
002-创建型-03-单例模式(Singleton)【7种】、spring单例及原理 spring 单例
通过查看spring的加载bean的源码类(AbstractAutowireCapableBeanFactory)可看出
如使用getBean方式创建:getBean→doGetBean→createBean→doCreateBean→initializeBean→invokeInitMethods
查看AbstractAutowireCapableBeanFactory.invokeInitMethods
protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd) throws Throwable { boolean isInitializingBean = (bean instanceof InitializingBean); if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) { if (logger.isDebugEnabled()) { logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'"); } if (System.getSecurityManager() != null) { try { AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> { ((InitializingBean) bean).afterPropertiesSet(); return null; }, getAccessControlContext()); } catch (PrivilegedActionException pae) { throw pae.getException(); } } else { ((InitializingBean) bean).afterPropertiesSet(); } } if (mbd != null && bean.getClass() != NullBean.class) { String initMethodName = mbd.getInitMethodName(); if (StringUtils.hasLength(initMethodName) && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) && !mbd.isExternallyManagedInitMethod(initMethodName)) { invokeCustomInitMethod(beanName, bean, mbd); } } }