spring bean流程圖,一個bean實例的加載全過程。示意圖
代碼演示:
package com.mr.li.test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.mr.li.config.AppConfig; import com.mr.li.service.Person; import com.mr.li.service.impl.Man; import lombok.extern.slf4j.Slf4j; @Slf4j public class Test { public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); Person person = ctx.getBean(Man.class); person.behavior(); ctx.close(); } }
bean的加載過程
package com.mr.li.service.impl; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import com.mr.li.service.Animal; import com.mr.li.service.Person; /** * * @describe 實現的這些springframework包下的類可重寫他們的方法去自定義自己的一些實現,使用的IOC必須是實現了ApplicationContext接口的IOC否則不會調用這些方法。 * * @author [email protected] * * @date 2021-8-18 14:46:10 */ @Component public class Man implements Person, BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean{ @Qualifier("cat") @Autowired private Animal animal; @Override public void behavior() { animal.behavior(); } @Override public void destroy() throws Exception { System.out.println("DisposableBean.destroy bean銷燬方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("InitializingBean.afterPropertiesSet bean初始化方法。在設置了所有bean屬性並滿足了BeanFactoryAware、ApplicationContextAware等之後,由包含的BeanFactory調用。"); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("ApplicationContextAware.applicationContext 回調設置ioc對象,不過通常拿到此對象會用此對象初始化一些數據,並不會對此對象本身改變什麼"); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("BeanFactoryAware.setBeanFactory bean工廠對當前對象的回調,提供了beanFactory對象,可利用beanFactory做一些處理 "); } @Override public void setBeanName(String name) { System.out.println("BeanNameAware.setBeanName 在創建當前對象的時候設置當前對象的bean名稱,設置好的名稱是: " + name); } }
前置處理器,和後置處理器回調方法
package com.mr.li.service.impl; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component; @Component public class BeanPostProcessorExample implements BeanPostProcessor { /** * 可通過處理器過濾做些事情,如通過beanName可在加載類的時候過濾出某個類然後對其操作 */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("前置處理器,在加載每個bean之前調用: " + bean.getClass().getSimpleName() + " beanName: " + beanName); return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName); } //注意,這個Bean後置處理器將對所有的Bean有效 @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("後置處理器,在加載每個bean之後調用: " + bean.getClass().getSimpleName() + " beanName: " + beanName); return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName); } }