SpringBoot总结2

16.springboot集成mybatis-2
17.springBoot实现任务调度
1.定时任务的实现方式
2.方式三spring Task的使用
18.springBoot定时任务升级(动态修改cron参数)
19.springboot+quartz-cronTrigger
20.springBoot+quartz+simpleTrigger
21.springBoot+quartz+simpleTrigger2
22.添加拦截器
23.使用springboot开发小项目

16.springboot集成mybatis-2
16.1 整合mybatis
实现步骤:
1.添加依赖包

<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!-- 阿里巴巴的Druid数据库连接池 -->
<dependency>
 <groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
  <version>1.1.9</version>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
 <version>1.2.10</version>
</dependency>
 <dependency>
  	<groupId>com.alibaba</groupId>
  	<artifactId>druid</artifactId>
  	<version>1.1.10</version>
 </dependency>

2.修改配置文件 application.yml
spring:
datasource:
name: dataSource
type: com.alibaba.druid.pool.DruidDataSource
#druid相关配置
druid:
#监控统计拦截的filters
filters: stat
driver-class-name: com.mysql.jdbc.Driver
#基本属性
url: jdbc:mysql://localhost:3306/chaoshi
username: root
password: 123456
#配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.qf.bean

3.创建实体类
public class Users {
private int userid;
private String username;
private String password;
private Date birthday;
private String address;
}

4.创建接口
public interface UsersDao{
public List findall();
}

5.创建mappper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.qf.dao.UsersDao" >
 <select id="findall" resultType="users">
 select * from  users
</select>
</mapper>

5.创建service

@Service
public class UsersServiceImpl implements UsersService {

@Resource
private UsersDao usersDao;
@Override
public List<Users> getall(int index,int size) {
    PageHelper.startPage(index,size);
    return usersDao.findall();
}
}

6.创建Controller

@Controller //等价于:@Controller+@ResponseBody
public class UserController2 {
@Resource
private UsersService usersService;

@RequestMapping("/getusers")
public String test3(ModelMap map){
    List<Users> users = usersService.getall(1,4);
    for (Users user : users) {
        System.out.println(user.getUsername());
    }
    return "success";
}
}

7.测试(注意要扫dao包)

@SpringBootApplication
@MapperScan("com.qf.dao")
public class Test1  {
public static void main(String[] args) {
    SpringApplication.run(Test1.class,args);
}
}

注意:如果报service层中dao层对象没有赋值,说明mapper没有扫描,这可能是jar包引入的问题,需要重新下载依赖包

17.springBoot实现任务调度
1.定时任务的实现方式
(1)java自带的java.util.Timer类,这个类允许你调取一个java.util.TimerTask任务,使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行,一般用得较少

public class TestTimer {

public static void main(String args[]){
        System.out.println("程序启动");
        new Reminder(3);
}

public static class Reminder{
    Timer timer;
    public Reminder(int sec){
        timer = new Timer();

        //schedule(任务对象,延期时间,间隔时间);
        timer.schedule(new TimerTask(){
            public void run(){
                System.out.println("执行任务:"+new Date());
                //timer.cancel();//取消任务
            }
        }, sec*1000,5000);
    }
}
}

(2)使用Quartz,这是一个功能比较强大的调度器,可以让你的程序在指定时间执行,可以按照某一个频度执行,配置起来稍显复杂,
(3)spring3.0以后自带task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多
2.方式三spring Task的使用
实现步骤:
(1)新建maven项目
(2)需要在pom.xml文件中引入spring-boot的依赖包
按照执行的例子添加就可以
jdk版本,springboot-parent,springboot-web
(3)编写启动类
(4)编写定时任务类

 @EnableSheduling的作用主要是注册通过	@import(SchedulingConfiguration.class)注册   ShedulingConfiguration.class
@Configuration
@EnableScheduling
public class MyTask {
@Scheduled(cron="0/10 * * * * *")
public void tast1(){
    System.out.println("我的任务:"+new Date());
}
}    

(5)测试:
public static void main(String[] args) {
SpringApplication.run(Demo2.class,args);
}

注意:spring Task在计算时间的时候,是根据当前服务器的系统时间进行计算的,如果是每10秒执行一次的话,那么它是从系统时间的0,10,20秒进行计算的,如果是每1分钟执行一次的话,那么它是从系统时间的一分钟,2分钟计算的。
     如果这样,那么我会碰到这种情况,就是当我们刚刚启动程序的时候,我们的时间刚好是9:38:55秒,那么就会出现5秒后执行1次输出语句

需要掌握:cron表达式,可以参考之前将Quartz的知识点

18.springBoot定时任务升级(动态修改cron参数)
/** 思路:
* 1.新建一个task class
* 2.在class上添加注解@EnableScheduling
* 3.让class实现接口SchedulingConfigurer
* 4.实现SchedudingConfigurer中的方法
*/

@RestController
@EnableScheduling
public class MyTask2 implements SchedulingConfigurer {

private  String cron="0/10 * * * * ?";

 @Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
  //1.创建Runnable对象
    Runnable runnable=new Runnable() {
        @Override
        public void run() {
            System.out.println("运行任务:"+new Date());
        }
    };
   //2.创建触发器
    Trigger trigger=new Trigger() {
        @Override
        public Date nextExecutionTime(TriggerContext triggerContext) {
            CronTrigger cronTrigger=new CronTrigger(cron);
            return cronTrigger.nextExecutionTime(triggerContext);
        }
    };
     //3.注册任务
    scheduledTaskRegistrar.addTriggerTask(runnable,trigger);
}

@RequestMapping("/changecron")
public String change(String cron){
    this.cron="0/5 * * * * ?";
    return "success";
}  
}

19.springboot+quartz-cronTrigger
1.添加依赖包

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
  <groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
 <version>2.2.3</version>
</dependency>

2.创建任务类

@Component
public class JobQuartz {
 //任务内容
public void myjob(){
    System.out.println("开始执行任务,date="+new Date());
}
}

3.创建配置类

@Configuration
public class QuartzConfig {
//1.创建JobDetail,参数是自定义的任务类对象
//注意:这里参数可能会显示红线报错,但是不影响使用
@Bean  
public MethodInvokingJobDetailFactoryBean fb(JobQuartz jobQuartz){
    MethodInvokingJobDetailFactoryBean bean=
            new MethodInvokingJobDetailFactoryBean();
    //设置任务类对象
    bean.setTargetObject(jobQuartz);
    //指定任务类的方法
    bean.setTargetMethod("myjob");
    return bean;
}
//2.创建Trigger
@Bean
public CronTriggerFactoryBean ctfb(MethodInvokingJobDetailFactoryBean jobDetailFactoryBean){
    CronTriggerFactoryBean factoryBean=new CronTriggerFactoryBean();
    factoryBean.setJobDetail(jobDetailFactoryBean.getObject());
    factoryBean.setCronExpression("0/10 * * * * ?");
    return factoryBean;
}
//3.创建调度器
@Bean
public SchedulerFactoryBean ssf(CronTriggerFactoryBean cronTriggerFactoryBean){
    SchedulerFactoryBean factory=new SchedulerFactoryBean();
    factory.setTriggers(cronTriggerFactoryBean.getObject());
    return factory;
}
}

4.添加测试类

@SpringBootApplication
public class Demo2 {
public static void main(String[] args) {
    SpringApplication.run(Demo2.class,args);
}
}

20.springBoot+quartz+simpleTrigger
1.添加依赖(注意版本,不要随意更换我现在使用的版本)

<dependency>
<groupId>org.springframework</groupId>
 <artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>

2.创建调度器工厂类

@Configuration
public class QuartzAdvanced {
//1.创建调度器工厂
@Bean
public SchedulerFactoryBean ssf(){
SchedulerFactoryBean factory=new SchedulerFactoryBean();
return factory;
}
//2.创建调度器
@Bean
public Scheduler sch(){
System.out.println(ssf().getObject());
return ssf().getObject();
}
}

3.创建任务类
public class JobAdvanced implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println(“高级任务,date=”+new Date());
}
}

4.创建触发器和调度器关系

@Service
public class MyTaskAdvanced {
@Autowired
@Qualifier("sch") //这里的sch是步骤2中的方法的名称
private Scheduler scheduler;

@PostConstruct //等同于init-method,指定初始化方法
public void begin(){
    try {
        //1.创建JobDetail
        JobDetail jobDetail=
                JobBuilder.newJob(JobAdvanced.class)
                        .withIdentity("job1","group1").build();
        //2.先创建简单调度器对象,再创建简单触发器 设置5秒重复一次
        SimpleScheduleBuilder builder=
                SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(5).repeatForever();
        Trigger trigger=TriggerBuilder.newTrigger()
                .withIdentity("trigger1","triggergroup1")
                .startNow().withSchedule(builder).build();
        //3.指定调度器
        scheduler.scheduleJob(jobDetail,trigger);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

5.测试类:

@SpringBootApplication
public class Demo2 {
public static void main(String[] args) {
    SpringApplication.run(Demo2.class,args);
}
}

21.springBoot+quartz+simpleTrigger2
修改任务类:

public class JobAdvanced implements Job {
@Autowired
private UserService userService;   //这行执行过程中会报空指针异常

@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    System.out.println("高级任务,date="+new Date());
    userService.test1();
}
}

原因:quartz中的job是由Quartz框架通过反射动态创建的,这里使用spring的对象时是无法使用的。
Job类,不是spring bean对象
解决方案:使用AutowireCapableBeanFactory进行自动注入job
步骤1:创建一个类

@Component
public class SpringJobBean extends AdaptableJobFactory {

@Autowired
private AutowireCapableBeanFactory capableBeanFactory;

@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
    Object object=super.createJobInstance(bundle);
    capableBeanFactory.autowireBean(object);
    return object;
}
}

步骤2:修改原来的工厂类

@Configuration
public class QuartzAdvanced {
@Autowired
private SpringJobBean jobBean;//新增代码,SpringJobBean是步骤1自定义的类

//1.创建调度器工厂
@Bean
public SchedulerFactoryBean ssf(){
    SchedulerFactoryBean factory=new SchedulerFactoryBean();
    //把job交给spring来管理
    factory.setJobFactory(jobBean);//新增代码
    return factory;
}
}

22.添加拦截器
1.创建类,并实现HandlerInterceptor接口

public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println(“之前”); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println(“之后”); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println(“最终”); }}
2.创建类,继承WebMvcConfigureAdapter类,覆盖其addInterceptors接口,注册我们自定义的拦截器:
@Configurationpublic class LoginInter extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { //注册自定义拦截器,添加拦截路径和排除拦截路径 registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/") .excludePathPatterns("/login"); }}
3.拦截器栈
@Configurationpublic class LoginInter extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { //注册自定义拦截器,添加拦截路径和排除拦截路径 registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/
") .excludePathPatterns("/tologin"); registry.addInterceptor(new MyInterceptor2()) .addPathPatterns("/**") .excludePathPatterns("/login"); }}
23.使用springboot开发小项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值