zoukankan      html  css  js  c++  java
  • Spring : @EnableScheduling 的工作原理 找到带某个注解的方法MethodIntrospector.selectMethods进行代理

    Spring : @EnableScheduling 的工作原理

    https://blog.csdn.net/andy_zhang2007/article/details/96612243

    spring task 通过@EnableScheduling启动流程简析

    https://blog.csdn.net/u012881904/article/details/79996826

    import org.springframework.beans.factory.BeanFactoryAware;
    import org.springframework.beans.factory.BeanNameAware;
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.ListableBeanFactory;
    import org.springframework.beans.factory.NoSuchBeanDefinitionException;
    import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
    import org.springframework.beans.factory.SmartInitializingSingleton;
    import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
    import org.springframework.beans.factory.config.ConfigurableBeanFactory;
    import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor;
    import org.springframework.beans.factory.config.NamedBeanHolder;
    import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor;
    import org.springframework.beans.factory.support.RootBeanDefinition;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.EmbeddedValueResolverAware;
    import org.springframework.context.event.ContextRefreshedEvent;
    import org.springframework.core.MethodIntrospector;
    import org.springframework.core.Ordered;
    import org.springframework.core.annotation.AnnotatedElementUtils;
    import org.springframework.core.annotation.AnnotationAwareOrderComparator;
    import org.springframework.core.annotation.AnnotationUtils;
    import org.springframework.lang.Nullable;
    import org.springframework.scheduling.TaskScheduler;
    import org.springframework.scheduling.Trigger;
    import org.springframework.scheduling.config.CronTask;
    import org.springframework.scheduling.config.FixedDelayTask;
    import org.springframework.scheduling.config.FixedRateTask;
    import org.springframework.scheduling.config.ScheduledTask;
    import org.springframework.scheduling.config.ScheduledTaskHolder;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    import org.springframework.scheduling.support.CronTrigger;
    import org.springframework.scheduling.support.ScheduledMethodRunnable;
    import org.springframework.util.Assert;
    import org.springframework.util.StringUtils;
    import org.springframework.util.StringValueResolver;
    
    /**
     * Bean post-processor that registers methods annotated with @{@link Scheduled}
     * to be invoked by a {@link org.springframework.scheduling.TaskScheduler} according
     * to the "fixedRate", "fixedDelay", or "cron" expression provided via the annotation.
     *
     * <p>This post-processor is automatically registered by Spring's
     * {@code <task:annotation-driven>} XML element, and also by the
     * {@link EnableScheduling @EnableScheduling} annotation.
     *
     * <p>Autodetects any {@link SchedulingConfigurer} instances in the container,
     * allowing for customization of the scheduler to be used or for fine-grained
     * control over task registration (e.g. registration of {@link Trigger} tasks.
     * See the @{@link EnableScheduling} javadocs for complete usage details.
     *
     * @author Mark Fisher
     * @author Juergen Hoeller
     * @author Chris Beams
     * @author Elizabeth Chatman
     * @since 3.0
     * @see Scheduled
     * @see EnableScheduling
     * @see SchedulingConfigurer
     * @see org.springframework.scheduling.TaskScheduler
     * @see org.springframework.scheduling.config.ScheduledTaskRegistrar
     * @see AsyncAnnotationBeanPostProcessor
     */
    public class ScheduledAnnotationBeanPostProcessor
            implements ScheduledTaskHolder, MergedBeanDefinitionPostProcessor, DestructionAwareBeanPostProcessor,
            Ordered, EmbeddedValueResolverAware, BeanNameAware, BeanFactoryAware, ApplicationContextAware,
            SmartInitializingSingleton, ApplicationListener<ContextRefreshedEvent>, DisposableBean {
    public Object postProcessAfterInitialization(Object bean, String beanName) {
            if (bean instanceof AopInfrastructureBean || bean instanceof TaskScheduler ||
                    bean instanceof ScheduledExecutorService) {
                // Ignore AOP infrastructure such as scoped proxies.
                return bean;
            }
    
            Class<?> targetClass = AopProxyUtils.ultimateTargetClass(bean);
            if (!this.nonAnnotatedClasses.contains(targetClass) &&
                    AnnotationUtils.isCandidateClass(targetClass, Arrays.asList(Scheduled.class, Schedules.class))) {
                Map<Method, Set<Scheduled>> annotatedMethods = MethodIntrospector.selectMethods(targetClass,
                        (MethodIntrospector.MetadataLookup<Set<Scheduled>>) method -> {
                            Set<Scheduled> scheduledMethods = AnnotatedElementUtils.getMergedRepeatableAnnotations(
                                    method, Scheduled.class, Schedules.class);
                            return (!scheduledMethods.isEmpty() ? scheduledMethods : null);
                        });
                if (annotatedMethods.isEmpty()) {
                    this.nonAnnotatedClasses.add(targetClass);
                    if (logger.isTraceEnabled()) {
                        logger.trace("No @Scheduled annotations found on bean class: " + targetClass);
                    }
                }
                else {
                    // Non-empty set of methods
                    annotatedMethods.forEach((method, scheduledMethods) ->
                            scheduledMethods.forEach(scheduled -> processScheduled(scheduled, method, bean)));
                    if (logger.isTraceEnabled()) {
                        logger.trace(annotatedMethods.size() + " @Scheduled methods processed on bean '" + beanName +
                                "': " + annotatedMethods);
                    }
                }
            }
            return bean;
        }
  • 相关阅读:
    序列化-请求数据校验。。。。。。
    python自动化测试-D5-学习笔记之二(常用模块之加密模块)
    python自动化测试-D5-学习笔记之二(常用模块之os,sys,random,string,time)
    python自动化测试-D5-学习笔记之二(常用模块之json模块)
    python自动化测试-D5-学习笔记之一(argv的使用)
    python自动化测试-D5-学习笔记之一(函数补充,内置函数,map,filter,eval)
    python习题:写一个函数打印两个字典中不一样的key和value
    python习题:用文件方式编写购物车程序,添加,查看和删除
    python习题:时间格式转换
    python习题:双色球
  • 原文地址:https://www.cnblogs.com/tonggc1668/p/13958830.html
Copyright © 2011-2022 走看看