日志框架 - 基于spring-boot - 实现6 - 自动装配-阿里云开发者社区

开发者社区> 开发与运维> 正文

日志框架 - 基于spring-boot - 实现6 - 自动装配

简介: 日志框架系列讲解文章日志框架 - 基于spring-boot - 使用入门日志框架 - 基于spring-boot - 设计日志框架 - 基于spring-boot - 实现1 - 配置文件日志框架 - 基于spring-boot - 实现2 - 消...

日志框架系列讲解文章
日志框架 - 基于spring-boot - 使用入门
日志框架 - 基于spring-boot - 设计
日志框架 - 基于spring-boot - 实现1 - 配置文件
日志框架 - 基于spring-boot - 实现2 - 消息定义及消息日志打印
日志框架 - 基于spring-boot - 实现3 - 关键字与三种消息解析器
日志框架 - 基于spring-boot - 实现4 - HTTP请求拦截
日志框架 - 基于spring-boot - 实现5 - 线程切换
日志框架 - 基于spring-boot - 实现6 - 自动装配

上一篇我们讲了框架实现的第五部分:如何在线程切换时保留上下文信息。
本篇主要讲框架实现的第六部分:自动装配

自动装配(AutoConfiguration)Spring Boot 框架提供的核心功能。本篇中我们主要使用自动装配实现将之前第一部分到第五部分实现的功能组装到一起。实现对业务代码编程人员无感知。具体实现如下。

/**
 * 日志组件自动装配
 */
@Configuration
@ConditionalOnProperty(
        value = "xpay.framework.logging.enabled",
        havingValue = "true",
        matchIfMissing = true)
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)

public class LoggingAutoConfiguration {
    
    @Value("${xpay.framework.executor.max-pool-size:16}")
    int maxPoolSize;
    
    /**
     * 自定义线程池
     * <p>
     * 用于线程切换时的MDC延续
     */
    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(maxPoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setTaskDecorator(new MDCTaskDecorator());
        executor.setThreadNamePrefix("MDCAdaptTaskExcutor-");
        executor.initialize();
        return executor;
    }
    
    @Bean
    public MessageToLogAspect messageToLogAspect() {
        return new MessageToLogAspect();
    }
    
    @Bean
    public DefaultKeywords defaultKeywords() {
        return new DefaultKeywords();
    }
    
    @Bean
    public MDCSpringMvcHandlerInterceptor mdcSpringMvcHandlerInterceptor() {
        return new MDCSpringMvcHandlerInterceptor();
    }
    
    /**
     * Filter与Interceptor装配
     */
    @Configuration
    protected static class LoggingWebConfiguration extends
            WebMvcConfigurerAdapter {
        
        @Autowired
        MDCSpringMvcHandlerInterceptor mdcSpringMvcHandlerInterceptor;
        
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(mdcSpringMvcHandlerInterceptor);
        }
    }
    
    
    /**
     * Keywords装配
     */
    @Configuration
    @ConditionalOnExpression(
            "'${xpay.framework.logging.keywords}' matches '^([^,]+,)+.*$'")
    protected static class MessageResolveAutoConfiguration {
        
        @Value("${xpay.framework.logging.keywords}")
        String keywordsPropertyString;
        
        @Bean
        public List<Keyword> keywordList() {
            String[] keywordsProStringSplits =
                    keywordsPropertyString.split(",");
            return Stream.of(keywordsProStringSplits)
                         .map(Keyword::new)
                         .collect(Collectors.toList());
        }
        
        @Bean
        @Order(3)
        public JsonMessageResolver jsonMessageResolver(
                List<Keyword> keywordList) {
            return new JsonMessageResolver(keywordList);
        }
        
        @Bean
        @Order(2)
        public XmlMessageResolver xmlMessageResolver(
                List<Keyword> keywordList) {
            return new XmlMessageResolver(keywordList);
        }
        
        @Bean
        @Order(1)
        public KeyValueMessageResolver keyValueMessageResolver(
                List<Keyword> keywordList) {
            return new KeyValueMessageResolver(keywordList);
        }
        
        @Bean
        @Scope(scopeName = SCOPE_PROTOTYPE,
               proxyMode = ScopedProxyMode.TARGET_CLASS)
        public MessageResolverChain messageResolverChain(
                List<MessageResolver> resolvers) {
            return new MessageResolverChainImpl(resolvers);
        }
        
        @Bean
        public RequestReplaceServletFilter requestReplaceServletFilter() {
            return new RequestReplaceServletFilter();
        }
        
        @Bean
        public FilterRegistrationBean requestReplaceFilter
                (RequestReplaceServletFilter requestReplaceFilter) {
            FilterRegistrationBean filterRegistrationBean = new
                    FilterRegistrationBean(requestReplaceFilter);
            filterRegistrationBean.setDispatcherTypes(ASYNC, REQUEST);
//            filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE + 5);
            return filterRegistrationBean;
        }
    }
}

至此,日志框架所有实现都已介绍了。有想法的小伙伴也可以在此基础上进行改进。实现想要的功能。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章