• SpringBoot 经验书


    目录

    正文

    SpringBoot + Mybatis 日志中打印SQL语句

    第一种

    在 YML 文件中配置日志级别

    logging:
      level:
        xin.nick.admin.dao: DEBUG  # xin.nick.admin.dao 我的mapper(dao层)包,改成你自己的
    

    第二种

    在 YML 文件中配置 MyBatis 日志打印类, log-impl 实现了打印log日志的某个实现类

    mybatis:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    

    SpringBoot 配置端口

    server:
      #端口号
      port: 81
    

    IDEA中设置 SpringBoot 热启动

    首先在pom文件中添加引用

    <!-- 放在 <dependencies> 元素里面 -->
    <!-- 热部署模块 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-devtools</artifactId>
         <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
    </dependency>
    

    再配置构建参数

    <!-- 放在<build> 元素里面 -->
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
    

    SpringBoot 默认的静态目录

    SpringBoot 默认给我们配置了静态目录

    /META-INF/resources/
    /resources/
    /static/
    /public/
    

    优先级:
    /META-INF/resources/>/resources/>/static/>/public/

    编写从容器中取对象的工具类

    @Component
    public class SpringUtil implements ApplicationContextAware {
        private static ApplicationContext applicationContext;
     
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            SpringUtil.applicationContext = applicationContext;
        }
     
        public ApplicationContext getApplicationContext(){
            return applicationContext;
        }
     
        public static Object getBean(String beanName){
            return applicationContext.getBean(beanName);
        }
     
        public static <T> T getBean(Class<T> clazz){
            return (T)applicationContext.getBean(clazz);
        }
    }
    

    Spring Boot 配置拦截器

    先准备拦截器实现类

    // GlobalInterceptor.java
    @Component
    public class GlobalInterceptor implements HandlerInterceptor {
    
        Logger logger = LoggerFactory.getLogger(GlobalInterceptor.class);
    
        /**
         * 预处理回调方法,实现处理器的预处理
         * 返回值:true表示继续流程;false表示流程中断,不会继续调用其他的拦截器或处理器
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            logger.info("开始截获请求:" + request.getRequestURI());
            return true;
        }
    
        /**
         * 后处理回调方法,实现处理器(controller)的后处理,但在渲染视图之前
         * 此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                               ModelAndView modelAndView) throws Exception {
            logger.info(request.getRequestURI() + "请求处理完毕");
        }
        /**
         * 整个请求处理完毕回调方法,即在视图渲染完毕时回调,
         * 如性能监控中我们可以在此记录结束时间并输出消耗时间,
         * 还可以进行一些资源清理,类似于try-catch-finally中的finally,
         * 但仅调用处理器执行链中
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
        }
    }
    

    然后编写配置类,将过滤器配置进去

    // MvcInterceptorConfig.java
    @Configuration
    public class MvcInterceptorConfig extends WebMvcConfigurationSupport {
    
        @Autowired
        private GlobalInterceptor globalInterceptor;
    
        @Override
        protected void addInterceptors(InterceptorRegistry registry) {
            // 多个拦截器组成一个拦截器链
            // addPathPatterns 用于添加拦截规则,/**表示拦截所有请求
            // excludePathPatterns 用户排除拦截
            registry.addInterceptor(globalInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/static/**");
            super.addInterceptors(registry);
        }
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/static/**")
                    .addResourceLocations("classpath:/static/");
        }
    
    }
    

    Springboot 获取 yml 数据

    有几种方式待我细细道来:

    假定我们的 yml 文件中有个这样的配置

    info:
      name: Nick
    

    方式一

    在属性上使用 @Value("${参数名}")
    运行之后,该属性会获取到配置的值 Nick

    // 用于组件的属性字段上
    @Value("${info.name}")
    private String name;
    

    方式二

    创建配置属性对象
    后续使用,只需要使用对象的属性
    就可以获取配置的参数
    例如

    @Component
    @ConfigurationProperties(prefix="info")  // 前缀
    public class info {
          // 里面的参数要和yml文件中的相对应
          private String name;
    }
    

    方式三

    直接使用 Environment 对象

    @Autowired
    private Environment env;
        
    String name = env.getProperty("info.name");
    

    ApplicationContext.getBean 空指针问题解决

    在前面的 SpringUtil 对象进行获取对象的时候,报空指针了
    有时间加载对象的时候顺序不一样,
    所以我要在需要使用 SpringUtil 的类之上添加注解

    @DependsOn("SpringUtil")
    

    表示我需要先引用这个,请先给我准备好

    SpringBoot 定时任务配置

    方式一

    静态:基于注解

    @Configuration      //1.主要用于标记配置类,兼备Component的效果。
    @EnableScheduling   // 2.开启定时任务
    public class SaticScheduleTask {
        //3.添加定时任务
        @Scheduled(cron = "0/5 * * * * ?")
        //或直接指定时间间隔,例如:5秒
        //@Scheduled(fixedRate=5000)
        private void configureTasks() {
            System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
        }
    }
    

    方式二

    动态:基于接口

    @Configuration      //1.主要用于标记配置类,兼备Component的效果。
    @EnableScheduling   // 2.开启定时任务
    public class DynamicScheduleTask implements SchedulingConfigurer {
    
        /**
         * 执行定时任务.
         */
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            taskRegistrar.addTriggerTask(
                    //1.添加任务内容(Runnable)
                    () -> System.out.println("执行动态定时任务: " + LocalDateTime.now().toLocalTime()),
                    //2.设置执行周期(Trigger)
                    triggerContext -> {
                        //2.1 获取执行周期
                        String cron = constant.getSyncCron();
                        //2.2 合法性校验.
                        if (StringUtils.isEmpty(cron)) {
                            // Omitted Code ..
                        }
                        //2.3 返回执行周期(Date)
                        return new CronTrigger(cron).nextExecutionTime(triggerContext);
                    }
            );
        }
    }
    

    SpringBoot 经验书传送地址: https://www.cnblogs.com/inick/p/14389308.html

  • 相关阅读:
    面向对象三大特性
    Redis-基础和应用篇(转载)
    http与https详解
    你认为做好测试计划工作的关键是什么?
    测试结束的标准是什么?
    您是否了解以往所工作的企业的软件开发过程?如果了解,请试述一个完整的开发过程需要完成哪些工作?分别由哪些不同的角色来完成这些工作?您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作?
    MyBatis
    layui
    软件的安全性应从哪几个方面去测试?
    什么是测试用例 什么是测试脚本 两者的关系是什么?
  • 原文地址:https://www.cnblogs.com/inick/p/14389308.html
Copyright © 2020-2023  润新知