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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志框架系列讲解文章日志框架 - 基于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;
        }
    }
}

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
604 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
XML 安全 Java
|
2月前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
79 0
|
2月前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
106 5
|
3月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
68 0
|
20天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
6天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
36 8
|
15天前
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
45 13
|
27天前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
48 5
|
1月前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
69 8