9_registerBeanPostProcessors

进入PostProcessorRegistrationDelegate的registerBeanPostProcessors

其实这里边主要做的逻辑就是获取所有的处理器,然后根据是否实现PriorityOrdered,Ordered接口进行排序后依次加入到beanFactory的beanPostProcessors属性中。后面使用可以快速取出。再加入的时候有个小细节需要注意

if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {

                            this.hasInstantiationAwareBeanPostProcessors = true;

                   }

                   if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {

                            this.hasDestructionAwareBeanPostProcessors = true;

                   }

设置了两个属性,是否有InstantiationAwareBeanPostProcessor类型的后置处理器,以及是否有DestructionAwareBeanPostProcessor类型的后置处理器。

public static void registerBeanPostProcessors(

                            ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

 

                   String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

 

                  

                   int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;

 //BeanPostProcessorChecker 的作用只是用于日志打印,当有些后置处理器还没有//被注册,但是有些bean就已经初始化了。这时候就会打印相关信息

                   beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

 

                   // Separate between BeanPostProcessors that implement PriorityOrdered,

                   // Ordered, and the rest.

                   List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();

                   List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();

                   List<String> orderedPostProcessorNames = new ArrayList<String>();

                   List<String> nonOrderedPostProcessorNames = new ArrayList<String>();

                   for (String ppName : postProcessorNames) {

                            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {

                                     BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);

                                     priorityOrderedPostProcessors.add(pp);

                                     if (pp instanceof MergedBeanDefinitionPostProcessor) {

                                               internalPostProcessors.add(pp);

                                     }

                            }

                            else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {

                                     orderedPostProcessorNames.add(ppName);

                            }

                            else {

                                     nonOrderedPostProcessorNames.add(ppName);

                            }

                   }

 

                   // First, register the BeanPostProcessors that implement PriorityOrdered.

                   sortPostProcessors(priorityOrderedPostProcessors, beanFactory);

                   registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

 

                   // Next, register the BeanPostProcessors that implement Ordered.

                   List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();

                   for (String ppName : orderedPostProcessorNames) {

                            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);

                            orderedPostProcessors.add(pp);

                            if (pp instanceof MergedBeanDefinitionPostProcessor) {

                                     internalPostProcessors.add(pp);

                            }

                   }

                   sortPostProcessors(orderedPostProcessors, beanFactory);

                   registerBeanPostProcessors(beanFactory, orderedPostProcessors);

 

                   // Now, register all regular BeanPostProcessors.

                   List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();

                   for (String ppName : nonOrderedPostProcessorNames) {

                            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);

                            nonOrderedPostProcessors.add(pp);

                            if (pp instanceof MergedBeanDefinitionPostProcessor) {

                                     internalPostProcessors.add(pp);

                            }

                   }

                   registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

 

                   // Finally, re-register all internal BeanPostProcessors.

                   sortPostProcessors(internalPostProcessors, beanFactory);

                   registerBeanPostProcessors(beanFactory, internalPostProcessors);

 

                   // 注册一个ApplicationListener 探测器

                   beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));

         }

该方法的作用就是对所有的处理器进行排序重新塞入到beanFactory,用于后面的处理

 

initMessageSource方法的作用为资源消息根据local进行国际化处理。

通过在resource目录下创建对应的资源化文件比如

aa.properties   (英文)

aa_zh CN.properties (中文)

application.getMessage("test",params,Local.US);

protected void initMessageSource() {

                   ConfigurableListableBeanFactory beanFactory = getBeanFactory();

         //查看是否自己创建了资源对应的Bean

                   if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {

                            this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);

                            // Make MessageSource aware of parent MessageSource.

                            if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {

                                     HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;

                                     if (hms.getParentMessageSource() == null) {

                                               // Only set parent context as parent MessageSource if no parent MessageSource

                                               // registered already.

                                               hms.setParentMessageSource(getInternalParentMessageSource());

                                     }

                            }

                            if (logger.isDebugEnabled()) {

                                     logger.debug("Using MessageSource [" + this.messageSource + "]");

                            }

                   }

                   else {

                            // Use empty MessageSource to be able to accept getMessage calls.

                            DelegatingMessageSource dms = new DelegatingMessageSource();

                            dms.setParentMessageSource(getInternalParentMessageSource());

                            this.messageSource = dms;

                            beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);

                            if (logger.isDebugEnabled()) {

                                     logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +

                                                        "': using default [" + this.messageSource + "]");

                            }

                   }

         }

对应的applicationContext中的getMessage函数,获取到对应的MessageSource,然后根据messageSource进行解析。

public String getMessage(String code, Object args[], Locale locale) throws NoSuchMessageException {

                   return getMessageSource().getMessage(code, args, locale);

         }

initApplicationEventMulticaster:初始化spring事件监听器。

在spring中的事件监听通过定义一个Listener

public class TestListenner implements ApplicationListener {

    @Override

    public void onApplicationEvent(ApplicationEvent event) {

            if(event instanceof TestEvenet){

                TestEvenet testEvenet =(TestEvenet)event;

                System.out.println(testEvenet.getMsg());

            }

    }

}

通过如下代码会触发事件的响应

TestEvenet testEvenet = new TestEvenet("123");

        applicationnContext.publishEvent(testEvenet);

首先我们在看实现之前应该想一下,当前的设计是怎么做到的。其实典型的监听者模式就可以做到。监听者监听每一个事件的发生。然后通过对事件进行判断。选择自己需要的处理。下面我们看下spring的监听器

initApplicationEventMulticaster  初始化事件传播器。

首先判断是否自定义了事件传播器。如果没有,系统自动生成一个。SimpleApplicationEventMulticaster

protected void initApplicationEventMulticaster() {

                   ConfigurableListableBeanFactory beanFactory = getBeanFactory();

                   if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {

                            this.applicationEventMulticaster =

                                              beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);

                            if (logger.isDebugEnabled()) {

                                     logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");

                            }

                   }

                   else {

                            this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);

                            beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);

                            if (logger.isDebugEnabled()) {

                                     logger.debug("Unable to locate ApplicationEventMulticaster with name '" +

                                                        APPLICATION_EVENT_MULTICASTER_BEAN_NAME +

                                                        "': using default [" + this.applicationEventMulticaster + "]");

                            }

                   }

         }

下面分析下通过applicationContext.publish做了什么操作了

protected void publishEvent(Object event, ResolvableType eventType) {

                   Assert.notNull(event, "Event must not be null");

                   if (logger.isTraceEnabled()) {

                            logger.trace("Publishing event in " + getDisplayName() + ": " + event);

                   }

 

                   // Decorate event as an ApplicationEvent if necessary

                   ApplicationEvent applicationEvent;

                   if (event instanceof ApplicationEvent) {

                            applicationEvent = (ApplicationEvent) event;

                   }

                   else {

                            applicationEvent = new PayloadApplicationEvent<Object>(this, event);

                            if (eventType == null) {

                                     eventType = ((PayloadApplicationEvent)applicationEvent).getResolvableType();

                            }

                   }

 

                   // Multicast right now if possible - or lazily once the multicaster is initialized

                   if (this.earlyApplicationEvents != null) {

                            this.earlyApplicationEvents.add(applicationEvent);

                   }

                   else {

                            getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);

                   }

 

                   // Publish event via parent context as well...

                   if (this.parent != null) {

                            if (this.parent instanceof AbstractApplicationContext) {

                                     ((AbstractApplicationContext) this.parent).publishEvent(event, eventType);

                            }

                            else {

                                     this.parent.publishEvent(event);

                            }

                   }

         }

主要核心代码就是通过获取当前的事件传播器。进行传播。再看下

@Override

         public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) {

                   ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));

                   for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {

                            Executor executor = getTaskExecutor();

                            if (executor != null) {

                                     executor.execute(new Runnable() {

                                               @Override

                                               public void run() {

                                                        invokeListener(listener, event);

                                               }

                                     });

                            }

                            else {

                                     invokeListener(listener, event);

                            }

                   }

         }

//根据envent获取对应的listener。然后调用listenner的方法

紧接着的registerListeners();就是把当前的所有的ApplicationListenner放入到事件传播器中。

protected void registerListeners() {

                   // Register statically specified listeners first.

                   for (ApplicationListener<?> listener : getApplicationListeners()) {

                            getApplicationEventMulticaster().addApplicationListener(listener);

                   }

 

                   // Do not initialize FactoryBeans here: We need to leave all regular beans

                   // uninitialized to let post-processors apply to them!

                   String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);

                   for (String listenerBeanName : listenerBeanNames) {

                            getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);

                   }

 

                   // Publish early application events now that we finally have a multicaster...

                   Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;

                   this.earlyApplicationEvents = null;

                   if (earlyEventsToProcess != null) {

                            for (ApplicationEvent earlyEvent : earlyEventsToProcess) {

                                     getApplicationEventMulticaster().multicastEvent(earlyEvent);

                            }

                   }

         }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值