初识SpringBoot---知识点整合

 

 

Spring Boot 启动

  1. 运行启动类的main方法

  2. mvn spring-boot:run

  3. java -jar x.jar


Spring Boot 不同环境配置

对于日常使用来说,免不了有开发、测试、生产等各种环境,如果重复修改同一个文件会显得很麻烦,解决:

1.根据不同的环境配置不同的文件:

2.在application.yml文件中如下定义:

spring:
  profiles:
    active: dev

3.启动方式

  • spring-boot:run -Drun.profiles=prod
  • java -jar xx.jar --spring.profiles.active=prod
  • idea中启动项目配置里可以修改,这里不赘述

Spring Boot Runner启动器

在项目刚运行的时候,如果你想完成一些初始化工作,你可以实现接口 ApplicationRunner

public interface ApplicationRunner {
    void run(ApplicationArguments args) throws Exception;
}

或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法。

public interface CommandLineRunner {
    void run(String... args) throws Exception;
}

简单使用:

@Component
public class SystemInit implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        
    }
}

如果你需要初始化的有很多,而他们又有一定的执行顺序,不妨添加@Order,此注释包含一个属性“value”,它接受像1,2等整数值,最低值具有更高的优先级。 

@Component
@Order(value = 1)
public class SystemInit implements CommandLineRunner {

    private final static Logger logger = LoggerFactory.getLogger(PocaoApplication.class);

    @Override
    public void run(String... args) throws Exception {
        logger.info("=================init1===================");
    }
}
@Component
@Order(value = 2)
public class SystemInit2 implements CommandLineRunner {

    private final static Logger logger = LoggerFactory.getLogger(PocaoApplication.class);
    @Override
    public void run(String... args) throws Exception {
        logger.info("=================init2===================");
    }
}


Spring Boot 中定时任务的简单运用

  • 在启动类上加上@EnableScheduling,开启定时任务
  • 在需要作为定时任务的方法上加上@Scheduled
@Component
public class Task {
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static final Logger logger = LoggerFactory.getLogger(Task.class);

    @Scheduled(fixedRate = 10000)
    public void reportCurrentTime(){
        logger.info("现在时间:{}",sdf.format(new Date()));
    }
}
2018-10-27 17:03:34.490  INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:03:34
2018-10-27 17:03:44.490  INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:03:44
2018-10-27 17:03:54.491  INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:03:54
2018-10-27 17:04:04.491  INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:04:04
2018-10-27 17:04:14.491  INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:04:14
2018-10-27 17:04:24.492  INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:04:24
2018-10-27 17:04:34.491  INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:04:34
2018-10-27 17:04:44.492  INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:04:44
2018-10-27 17:04:54.491  INFO 15288 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:04:54
  • 定时任务可以使用cron表达式 
  • 需要注意的是:cron表达式只支持6位 如果你这样写:
    @Scheduled(cron = "10-13 * * * * ? *")
    会报这样的一个错误:
    Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'reportCurrentTime': Cron expression must consist of 6 fields (found 7 in "10-13 * * * * ? *")
    最后一位往往指的是年,所以可以忽略
    @Scheduled(cron = "10-13 * * * * ?")
    public void reportCurrentTime(){
        logger.info("现在时间:{}",sdf.format(new Date()));
    }

 

2018-10-27 17:16:10.001  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:16:10
2018-10-27 17:16:11.001  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:16:11
2018-10-27 17:16:12.001  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:16:12
2018-10-27 17:16:13.001  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:16:13
2018-10-27 17:17:10.003  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:17:10
2018-10-27 17:17:11.001  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:17:11
2018-10-27 17:17:12.001  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:17:12
2018-10-27 17:17:13.001  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:17:13
2018-10-27 17:18:10.002  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:18:10
2018-10-27 17:18:11.001  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:18:11
2018-10-27 17:18:12.001  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:18:12
2018-10-27 17:18:13.001  INFO 15168 --- [pool-1-thread-1] com.brilliant.pocao.tasks.Task           : 现在时间:2018-10-27 17:18:13

Spring Boot 异步任务的简单运用

  • 在启动类上加上@EnableAsync,开启定时任务
  • 在需要作为异步任务的方法上加上@Async
@Component
public class AsyncTask {

    private final static Logger logger = LoggerFactory.getLogger(AsyncTask.class);

    @Async
    public Future<Boolean> doTask1() throws Exception {
        long start = System.currentTimeMillis();
        Thread.sleep(1000);
        long end = System.currentTimeMillis();
        logger.info("任务1耗时:{}毫秒",end - start);
        return new AsyncResult<>(true);
    }

    @Async
    public Future<Boolean> doTask2() throws Exception {
        long start = System.currentTimeMillis();
        Thread.sleep(700);
        long end = System.currentTimeMillis();
        logger.info("任务1耗时:{}毫秒",end - start);
        return new AsyncResult<>(true);
    }

    @Async
    public Future<Boolean> doTask3() throws Exception {
        long start = System.currentTimeMillis();
        Thread.sleep(600);
        long end = System.currentTimeMillis();
        logger.info("任务1耗时:{}毫秒",end - start);
        return new AsyncResult<>(true);
    }
}

测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
public class AsyncTaskTest {

    @Autowired
    private AsyncTask asyncTask;

    private final static Logger logger = LoggerFactory.getLogger(AsyncTaskTest.class);


    @Test
    public void test() throws Exception {
        long start = System.currentTimeMillis();

        Future<Boolean> a = asyncTask.doTask1();
        Future<Boolean> b = asyncTask.doTask2();
        Future<Boolean> c = asyncTask.doTask3();

        while (!a.isDone() || !b.isDone() || !c.isDone()) {
            if (a.isDone() && b.isDone() && c.isDone()) {
                break;
            }
        }

        long end = System.currentTimeMillis();
        logger.info("任务全部完成,总耗时{}毫秒",end - start);
    }

}

结果:

2018-10-29 09:11:59.596  INFO 6896 --- [cTaskExecutor-3] com.brilliant.pocao.tasks.AsyncTask      : 任务1耗时:600毫秒
2018-10-29 09:11:59.687  INFO 6896 --- [cTaskExecutor-2] com.brilliant.pocao.tasks.AsyncTask      : 任务1耗时:700毫秒
2018-10-29 09:12:00.009  INFO 6896 --- [cTaskExecutor-1] com.brilliant.pocao.tasks.AsyncTask      : 任务1耗时:1021毫秒
2018-10-29 09:12:00.010  INFO 6896 --- [           main] com.brilliant.pocao.tasks.AsyncTaskTest  : 任务全部完成,总耗时1065毫秒

运用场景:发送短信、发送邮件等消息推送


Spring Boot 个人踩坑

  1. 初始创建项目后,直接运行看看,结果就报了datasource的错误,查阅发现项目启动会自动装载这个类,而我又没有配置数据库的相关信息,处理结果就是先忽略掉这个类,等配置好数据库后再删掉就行了。。。
    @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})

                                                                                                                                   -------------------持续更新中------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值