近半年来,项目开发中一直使用Spring Boot、Spring Cloud等框架,开发工具由原来的eclispe转用Idea ,哈哈,感觉自己又高大尚了一下,其中项目一些技术内容,使我们在开发中提高了开发效率。我一直想自己来搭建一套这样的框架,可以工作之余研究技术的时候,当做自己的一个项目进行编写一些内容,来感受和学习技术在实际的项目中的应用。本文主要讲述Spring Boot集成持久层相关的内容。相关的技术的内容,网络上有很多讲解内容,我主要是来把自己搭建的项目的具体代码贴出来,方便大家参考,也能够在本地按我的文章内容进行搭建,主要是在本地能够把搭建的框架跑起来,好了,现在主要来贴一下相关的代码:
首先我们来看一下我的项目目录:
1、pom.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wzz</groupId>
<artifactId>springbootpro</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- Spring Boot的核心启动器,包含了自动配置、日志和YAML -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 支持全栈式Web开发,包括Tomcat和spring-webmvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 支持面向方面的编程即AOP,包括spring-aop和AspectJ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- TkMybatis -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- 支持JDBC数据库 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 支持Redis键值存储数据库,包括spring-redis -->
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>-->
<!-- 微信 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 企业微信 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-cp</artifactId>
<version>3.1.0</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.12</version>
<scope>provided</scope>
</dependency>
<!-- FastJson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<!-- 图形验证码生成工具 -->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
<!-- MySql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.47</version>
</dependency>
<!-- Mybatis分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.1</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/conf/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.5.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
2、application.properties 暂无配置内容
3、application.yml文件配置
#默认使用配置
spring:
profiles:
active: dev
mybatis:
typeAliasesPackage: com.wzz.dao.model
mapperLocations: classpath:com/wzz/dao/mapper/**/*.xml
mapper:
mappers: com.wzz.dao.CommonMapper
not-empty: false
identity: MYSQL
#开发环境
---
spring:
profiles: dev
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/site_web?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
username: admin
password: admin
server:
port: 9081
servlet:
context-path: /
wechat:
openAppId:
openAppSecret:
corpwechat:
corpId:
corpSecret:
agentId:
projecturl:
wechatOpenAuthorize: 0.0.0.0:8080
cpwechatOpenAuthorize:
#测试环境
---
spring:
profiles: test
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/site_web?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
username: admin
password: admin
server:
port: 9081
servlet:
context-path: /
wechat:
openAppId:
openAppSecret:
corpwechat:
corpId:
corpSecret:
agentId:
projecturl:
wechatOpenAuthorize:
cpwechatOpenAuthorize:
4、generatorConfig.xml文件配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 格式化java代码 -->
<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
<!-- 格式化XML代码 -->
<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
<!-- TKmybatis配置 -->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="com.wzz.dao.CommonMapper"/>
</plugin>
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="false"/>
</commentGenerator>
<!-- 数据库链接URL、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://10.3.2.17:3306/site_web"
userId="fof" password="JZ5]96qu8h59"/>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置 -->
<javaModelGenerator targetPackage="com.wzz.dao.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成的映射文件包名和位置 -->
<sqlMapGenerator targetPackage="com.wzz.dao.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成service的包名和位置 -->
<javaClientGenerator targetPackage="com.wzz.dao.mapper" targetProject="src/main/java" type="XMLMAPPER">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的那些表 -->
<table tableName="tb_dictionary">
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
</table>
</context>
</generatorConfiguration>
5、MybatisConfig.java
package com.wzz.config;
import com.github.pagehelper.PageHelper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
/**
* @Author wangzz
* @Date 2019/2/21 18:21
* @Description
*/
@Configuration
public class MybatisConfig {
@Bean
public PageHelper pageHelper(){
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("offsetAsPageNum","true");
properties.setProperty("rowBoundsWithCount","true");
properties.setProperty("reasonable","true");
properties.setProperty("dialect","mysql"); //配置mysql数据库的方言
pageHelper.setProperties(properties);
return pageHelper;
}
}
6、Dao层目录结构
CommonMapper.java
package com.wzz.dao;
import tk.mybatis.mapper.common.*;
/**
* @Author wangzz
* @Date 2019/2/21 16:27
* @Description
*/
public interface CommonMapper<T> extends Mapper<T>, MySqlMapper<T>, IdsMapper<T>,ConditionMapper<T> {
}
我们使用mybatis-generator生成相关的dao层文件,示例如下:
TbDictionary.java
package com.wzz.dao.model;
import javax.persistence.*;
@Table(name = "tb_dictionary")
public class TbDictionary {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
/**
* 字典编码
*/
private String code;
/**
* 名称
*/
private String name;
/**
* 类型
*/
private String type;
/**
* 属性标记
*/
private String field;
/**
* 字典值
*/
private String value;
/**
* 排序号
*/
@Column(name = "sortCode")
private Short sortcode;
/**
* 状态:1可用,非1,不可用
*/
private Byte status;
/**
* 备注
*/
private String remark;
/**
* @return id
*/
public Integer getId() {
return id;
}
/**
* @param id
*/
public void setId(Integer id) {
this.id = id;
}
/**
* 获取字典编码
*
* @return code - 字典编码
*/
public String getCode() {
return code;
}
/**
* 设置字典编码
*
* @param code 字典编码
*/
public void setCode(String code) {
this.code = code;
}
/**
* 获取名称
*
* @return name - 名称
*/
public String getName() {
return name;
}
/**
* 设置名称
*
* @param name 名称
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取类型
*
* @return type - 类型
*/
public String getType() {
return type;
}
/**
* 设置类型
*
* @param type 类型
*/
public void setType(String type) {
this.type = type;
}
/**
* 获取属性标记
*
* @return field - 属性标记
*/
public String getField() {
return field;
}
/**
* 设置属性标记
*
* @param field 属性标记
*/
public void setField(String field) {
this.field = field;
}
/**
* 获取字典值
*
* @return value - 字典值
*/
public String getValue() {
return value;
}
/**
* 设置字典值
*
* @param value 字典值
*/
public void setValue(String value) {
this.value = value;
}
/**
* 获取排序号
*
* @return sortCode - 排序号
*/
public Short getSortcode() {
return sortcode;
}
/**
* 设置排序号
*
* @param sortcode 排序号
*/
public void setSortcode(Short sortcode) {
this.sortcode = sortcode;
}
/**
* 获取状态:1可用,非1,不可用
*
* @return status - 状态:1可用,非1,不可用
*/
public Byte getStatus() {
return status;
}
/**
* 设置状态:1可用,非1,不可用
*
* @param status 状态:1可用,非1,不可用
*/
public void setStatus(Byte status) {
this.status = status;
}
/**
* 获取备注
*
* @return remark - 备注
*/
public String getRemark() {
return remark;
}
/**
* 设置备注
*
* @param remark 备注
*/
public void setRemark(String remark) {
this.remark = remark;
}
}
TbDictionaryMapper.java
package com.wzz.dao.mapper;
import com.wzz.dao.CommonMapper;
import com.wzz.dao.model.TbDictionary;
public interface TbDictionaryMapper extends CommonMapper<TbDictionary> {
}
TbDictionaryMapper.xml
<?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.wzz.dao.mapper.TbDictionaryMapper">
<resultMap id="BaseResultMap" type="com.wzz.dao.model.TbDictionary">
<!--
WARNING - @mbg.generated
-->
<id column="id" jdbcType="INTEGER" property="id" />
<result column="code" jdbcType="VARCHAR" property="code" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="type" jdbcType="VARCHAR" property="type" />
<result column="field" jdbcType="VARCHAR" property="field" />
<result column="value" jdbcType="VARCHAR" property="value" />
<result column="sortCode" jdbcType="SMALLINT" property="sortcode" />
<result column="status" jdbcType="TINYINT" property="status" />
<result column="remark" jdbcType="VARCHAR" property="remark" />
</resultMap>
</mapper>
7、程序进行调用看是否可以运行成功
首先看下启动类
Application.java
package com.wzz;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan("com.wzz.dao.mapper")
@Slf4j
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
log.info("------------------ SpringBoot应用启动完成 ------------------");
}
}
DictionaryService.java
package com.wzz.service;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wzz.dao.mapper.TbDictionaryMapper;
import com.wzz.dao.model.TbDictionary;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @Author wangzz
* @Date 2019/2/21 17:33
* @Description
*/
@Service
@Slf4j
public class DictionaryService {
@Resource
private TbDictionaryMapper tbDictionaryMapper;
public List<TbDictionary> queryList(){
PageHelper.startPage(1,10);
List<TbDictionary> dictList = tbDictionaryMapper.selectAll();
log.info("---查询结果---:{}",JSON.toJSON(dictList).toString());
PageInfo<TbDictionary> pageInfo = new PageInfo<>(dictList);
return pageInfo.getList();
}
}
DictController.java
package com.wzz.controller;
import com.wzz.dao.model.TbDictionary;
import com.wzz.service.DictionaryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @Author wangzz
* @Date 2019/2/21 17:36
* @Description
*/
@RestController
@RequestMapping("/dict")
@Slf4j
public class DictController {
@Autowired
private DictionaryService dictionaryService;
@GetMapping("/queryAll")
@ResponseBody
public List<TbDictionary> queryAll(){
List<TbDictionary> dictList = dictionaryService.queryList();
return dictList;
}
}
启动程序日志如下:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.2.RELEASE)
2019-02-21 18:59:33.163 [main] INFO com.wzz.Application - Starting Application on DESKTOP-U2O7KPS with PID 11076 (F:\promotion\springbootpro\target\classes started by wangzhizhong in F:\promotion\springbootpro)
2019-02-21 18:59:33.163 [main] INFO com.wzz.Application - The following profiles are active: dev
2019-02-21 18:59:33.883 [main] INFO o.s.d.r.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data repositories in DEFAULT mode.
2019-02-21 18:59:33.909 [main] INFO o.s.d.r.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 23ms. Found 0 repository interfaces.
2019-02-21 18:59:34.318 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$2dfc831] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-02-21 18:59:34.666 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 9081 (http)
2019-02-21 18:59:34.688 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-9081"]
2019-02-21 18:59:34.704 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat]
2019-02-21 18:59:34.704 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.14]
2019-02-21 18:59:34.719 [main] INFO org.apache.catalina.core.AprLifecycleListener - The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [D:\Program Files\Java\jdk1.8.0_65\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;D:\Program Files\Java\jdk1.7.0_17\bin;D:\Program Files\Java\jdk1.7.0_17\jre\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;D:\Program Files\IDM Computer Solutions\UltraEdit;D:\Program Files\OpenVPN\bin;D:\apache-maven-3.5.3\bin;D:\Program Files\nodejs\;D:\Program Files\erl10.1\bin;D:\Program Files\TortoiseSVN\bin;D:\Program Files\Python\Python36;C:\Users\wangzhizhong\AppData\Local\Microsoft\WindowsApps;C:\Users\wangzhizhong\AppData\Roaming\npm;D:\Program Files\nodejs\node_global;D:\Program Files\Fiddler;D:\Program Files\Microsoft VS Code Insiders\bin;.]
2019-02-21 18:59:34.936 [main] INFO o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2019-02-21 18:59:34.936 [main] INFO org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 1704 ms
2019-02-21 18:59:35.105 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2019-02-21 18:59:35.437 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
2019-02-21 18:59:35.521 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [
name: default
...]
2019-02-21 18:59:35.622 [main] INFO org.hibernate.Version - HHH000412: Hibernate Core {5.3.7.Final}
2019-02-21 18:59:35.622 [main] INFO org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found
2019-02-21 18:59:35.769 [main] INFO org.hibernate.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
2019-02-21 18:59:35.891 [main] INFO org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2019-02-21 18:59:36.053 [main] INFO o.s.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-02-21 18:59:36.553 [main] INFO com.wzz.service.InitService - -----------PostConstruct执行初始化完成-----------
2019-02-21 18:59:36.753 [main] INFO o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
2019-02-21 18:59:36.791 [main] WARN o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration$JpaWebMvcConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2019-02-21 18:59:36.991 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-9081"]
2019-02-21 18:59:37.022 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 9081 (http) with context path ''
2019-02-21 18:59:37.022 [main] INFO com.wzz.Application - Started Application in 4.307 seconds (JVM running for 5.265)
2019-02-21 18:59:37.091 [main] INFO com.wzz.listener.CacheLoadExtExecutor - ---CacheLoadExtExecutor---:{"sourceArgs":[],"optionNames":[],"nonOptionArgs":[]}
2019-02-21 18:59:37.091 [main] INFO com.wzz.listener.CacheLoadExtExecutor - -----------------ApplicationRunner开始执行初始化任务开始-----------------
2019-02-21 18:59:37.091 [main] INFO com.wzz.listener.CacheLoadExtExecutor - -----------------ApplicationRunner开始执行初始化任务结束-----------------
2019-02-21 18:59:37.091 [main] INFO com.wzz.listener.CacheLoadExecutor - ------------------CommandLineRunner开始执行初始化任务开始-------------------
2019-02-21 18:59:37.091 [main] INFO com.wzz.listener.CacheLoadExecutor - ------------------CommandLineRunner开始执行初始化任务结束-------------------
2019-02-21 18:59:37.091 [main] INFO com.wzz.Application - ------------------ SpringBoot应用启动完成 ------------------
可以用postman进行调用接口,可以成功,接下来介绍点其他的小内容,在项目容器启动完成后,可以进行初始化一些内容,可以借助ApplicationRunner、CommandLineRunner来初始化。 PostConstruct是在Bean初始化完成后就进行执行了,一般使用前两个更好一些。
来看一下代码示例:
CacheLoadExecutor.java
package com.wzz.listener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
/**
* @Author wangzz
* @Date 2019/2/21 9:14
* @Description
*/
@Component
@Slf4j
public class CacheLoadExecutor implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
log.info("------------------CommandLineRunner开始执行初始化任务开始-------------------");
// TimeUnit.SECONDS.sleep(3);
log.info("------------------CommandLineRunner开始执行初始化任务结束-------------------");
}
}
CacheLoadExtExecutor.java
package com.wzz.listener;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
* @Author wangzz
* @Date 2019/2/21 9:28
* @Description
*/
@Component
@Slf4j
public class CacheLoadExtExecutor implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("---CacheLoadExtExecutor---:{}", JSON.toJSON(args));
log.info("-----------------ApplicationRunner开始执行初始化任务开始-----------------");
// TimeUnit.SECONDS.sleep(3);
log.info("-----------------ApplicationRunner开始执行初始化任务结束-----------------");
}
}
package com.wzz.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
/**
* @Author wangzz
* @Date 2019/2/21 9:26
* @Description
*/
@Service
@Slf4j
public class InitService {
@PostConstruct
public void init(){
log.info("-----------PostConstruct执行初始化完成-----------");
}
}
项目中,我们也可以配置一些AOP切面,来做一些打印日志等一些操作,这个根据自己的项目需求来定,技术在此不讲解,主要是贴代码:
package com.wzz.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
/**
* 切面
*/
@Slf4j
@Aspect
@Component
public class AppLogAspect {
// 定义一个切入点表达式,用来确定哪些类需要代理
@Pointcut("execution(* com.wzz.controller..*.*(..))")
public void cutMethod(){}
// 环绕方法,可自定义目标方法执行的时机
@Around("cutMethod()")
public void around(ProceedingJoinPoint joinPoint){
log.info("请求前 @Around :" + joinPoint.getSignature());
try {
joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
log.info("请求后 @Around :" + joinPoint.getSignature());
}
// 前置方法,在目标方法执行前执行
@Before("cutMethod()")
public void before(JoinPoint joinPoint) {
log.info("请求前 @Before :" + joinPoint.getTarget());
}
// 定义通知类型
@AfterReturning("cutMethod()")
public void afterReturning(JoinPoint joinPoint) {
log.info("请求后 @AfterReturning:" + joinPoint.getSignature());
}
}
还有很多技术细节点,我们后面慢慢聊一下,感谢你的阅读,大家一起努力,一起进步。