spring原始碼-BeanPostProcessor-3.3 spring原始碼-bean之載入-2
阿新 • • 發佈:2018-11-15
一、BeanPostProcessor這個是spring容器的拓展之一,是用於獲取bean的時候處理對應的物件;
二、常用場景,在獲取bean的時候,重新初始化bean的屬性等。
三、實現方式(加入容器後,呼叫其他bean的時候,通過BeanPostProcessor來進行處理)
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class BeanPostProcessorTest implementsBeanPostProcessor{ /** * 在bean載入之前處理 * @param bean * @param beanName * @return * @throws BeansException */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("before");return bean; } /** * 在bean載入之後處理 * @param bean * @param beanName * @return * @throws BeansException */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("after");return bean; } }
四、原始碼部分
1)容器中的註冊部分為refresh()中的registerBeanPostProcessors()方法,注意這裡只是註冊,實際呼叫在getBean的時候
this.registerBeanPostProcessors(beanFactory);
2)registerBeanPostProcessors
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { //在容器中獲取獲取實現BeanPostProcessor的bean String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; beanFactory.addBeanPostProcessor(new AbstractApplicationContext.BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); //宣告不同BeanPostProcessor型別(priorityOrdered,internal,ordered,non 按照順序,和優先順序執行) List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList(); List<BeanPostProcessor> internalPostProcessors = new ArrayList(); List<String> orderedPostProcessorNames = new ArrayList(); List<String> nonOrderedPostProcessorNames = new ArrayList(); String[] var11 = postProcessorNames; int var10 = postProcessorNames.length; BeanPostProcessor pp; for(int var9 = 0; var9 < var10; ++var9) { String ppName = var11[var9]; //判斷時什麼型別 if (this.isTypeMatch(ppName, PriorityOrdered.class)) { pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp); //此介面存在postProcessMergedBeanDefinition的介面 if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } else if (this.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } //排序 OrderComparator.sort(priorityOrderedPostProcessors); //新增到beanPostProcessors(private final List<BeanPostProcessor> beanPostProcessors = new ArrayList();) this.registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); List<BeanPostProcessor> orderedPostProcessors = new ArrayList(); Iterator var16 = orderedPostProcessorNames.iterator(); while(var16.hasNext()) { String ppName = (String)var16.next(); BeanPostProcessor pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } //排序 OrderComparator.sort(orderedPostProcessors); this.registerBeanPostProcessors(beanFactory, orderedPostProcessors); List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList(); Iterator var19 = nonOrderedPostProcessorNames.iterator(); while(var19.hasNext()) { String ppName = (String)var19.next(); pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } this.registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); OrderComparator.sort(internalPostProcessors); this.registerBeanPostProcessors(beanFactory, internalPostProcessors); beanFactory.addBeanPostProcessor(new AbstractApplicationContext.ApplicationListenerDetector((AbstractApplicationContext.ApplicationListenerDetector)null)); } private void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) { Iterator var4 = postProcessors.iterator(); while(var4.hasNext()) { BeanPostProcessor postProcessor = (BeanPostProcessor)var4.next(); //新增到beanPostProcessors(private final List<BeanPostProcessor> beanPostProcessors = new ArrayList();) beanFactory.addBeanPostProcessor(postProcessor); } }
3)addBeanPostProcessor(DefaultListableBeanFactory,中快取的List<String> beanDefinitionNames = new ArrayList())
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) { Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null"); this.beanPostProcessors.remove(beanPostProcessor); //新增到beanPostProcessors中 this.beanPostProcessors.add(beanPostProcessor); if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) { this.hasInstantiationAwareBeanPostProcessors = true; } if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) { this.hasDestructionAwareBeanPostProcessors = true; } }
五、呼叫方式(在個getBean的時候回自動按照優先順序呼叫BeanPostProcessor)
具體實現見:spring原始碼-bean之載入-2的四、原始碼實現3).d createBean部分