SpringBoot整合第三方技术


(一)整合Junit

分两个版本 SpringBoot 2.0版本 和1.5版本
SpringBoot2.0版本

案例:zjj_SpringBoot_57ff5965-0995-4672-655c-b89122c2b7f2


注意不要其它的Junit Test之类的注解了.

| <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/>
</parent> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> | | —- |

测试类

| package com.test;
import com.Application;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class) //固定的代码 @SpringBootTest(classes = Application.class) //DemoApplication是你自己编写的启动类 public class Test01 {

} | | —- |

1.5版本
需要注意,项目 pom.xml文件里面不要有别的test,不然会出现异常.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>


@RunWith(SpringRunner.class)

@SpringBootTest(classes = TravelApplication.class)

public class CeuiTest {

(二)整合Listener

案例 zjj_SpringBoot_434ae26b-1137-8f4c-d6fc-4ffa639d2e4f


配置类

| @Configuration
public class Config {
/**

  1. * 注册监听器
  2. * **@return<br />
  3. ***/<br />

@Bean
public ServletListenerRegistrationBean registrationBean() {
ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean(new MyListener());
return servletListenerRegistrationBean;

}
} | | —- |


自定义Listener

| import javax.servlet.;

public class MyListener implements ServletContextListener {
/*

  1. * 项目启动时候会执行这个方法
  2. * **@param ****_sce _**可以获取 ServletContext 上下文<br />
  3. */<br />

@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println(“MyListener.contextInitialized”);
ServletContext servletContext = sce.getServletContext();

}

/**

  1. * 项目销毁的时候会执行这个方法<br />
  2. *<br />
  3. * **@param ****_sce _**可以获取 ServletContext 上下文<br />
  4. */<br />

@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println(“MyListener.contextDestroyed”);
ServletContext servletContext = sce.getServletContext();
} | | —- |


还有匿名内部类的方式

| @SpringBootApplication
public class DemoApplication {

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

/**

  1. * ServletContextListener 匿名内部类<br />
  2. */<br />

@Bean
public ServletListenerRegistrationBean getServletListenerRegistrationBean() {
ServletListenerRegistrationBean bean =
new ServletListenerRegistrationBean<>(new ServletContextListener() {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println(“匿名内部类方式 监听项目启动了SecondListener..init…..”);
}

@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println(“匿名内部类方式 监听项目销毁了………………”);

}
});
return bean;
}
} | | —- |




注解配置

在监听器添加javax.servlet.annotation.WebListener 注解


然后在启动类添加org.springframework.boot.web.servlet.ServletComponentScan 注解, 这个注解是用来扫描WebListener 注解的.


(三)整合Filter

案例代码zjj_SpringBoot_db3b3c65-5edd-3beb-9cdc-a0c64185e874

| @Configuration
public class Config {
@Bean
public FilterRegistrationBean myFilter() {
FilterRegistrationBean filterFilterRegistrationBean =
new FilterRegistrationBean<>();
filterFilterRegistrationBean.setFilter(new MyFilter());//设置Filter
ArrayList url = new ArrayList<>();
url.add(“/hello”);
url.add(“/hello2”);

filterFilterRegistrationBean.setUrlPatterns(url);//设置拦截路径
return filterFilterRegistrationBean;

} | | —- |

| import javax.servlet.;
import java.io.IOException;

public class MyFilter implements javax.servlet.Filter {
/*

  1. * 启动容器的时候 初始化执行这个<br />
  2. *<br />
  3. * **@param ****_filterConfig<br />
  4. _*** **@throws **ServletException<br />
  5. */<br />

@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println(“MyFilter.init”);
}

/**

  1. * 访问接口之前会执行这个方法<br />
  2. *<br />
  3. * **@param ****_servletRequest<br />
  4. _*** **@param ****_servletResponse<br />
  5. _*** **@param ****_filterChain<br />
  6. _*** **@throws **IOException<br />
  7. * **@throws **ServletException<br />
  8. */<br />

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println(“MyFilter.doFilter—-进入了”);//访问目标方法之前会执行
filterChain.doFilter(servletRequest, servletResponse);// 必须要有这个方法才会往下执行,不然就拦截了
System.out.println(“MyFilter.doFilter—-离开了”);//访问目标放结束会执行

}

/

/
@Override
public void destroy() {
System.
out.println(“MyFilter.destroy”**);
}
} | | —- |

(四)整合MySQL


依赖

| <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency> | | —- |


SpringBoot2.1.7.RELEASE版本的

yml
spring:

datasource:

  1. **driver-class-name**: com.mysql.jdbc.Driver
  2. **url**: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
  3. **username**: root
  4. **password**: root<br />

(五)整合druid



项目zjj_SpringBoot_a88935f9-d91c-dcf0-3d14-7897aaef288a





需要注意,Druid内部记录日志是用的log4j,所以需要引入log4j依赖.否则会报错

| <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.8</version>
</dependency> | | —- |


配置类

| /**

  • 配置类
    /
    @Configuration
    public class DruidConfig {

    @ConfigurationProperties(prefix = “spring.datasource”) //绑定yml的属性,以yml配置文件的spring.datasource前缀的配置都绑定上
    @Bean
    public DataSource druid() {
    *return new
    DruidDataSource();
    }
    } | | —- |


    yml配置文件

| spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/test
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource # type是指定数据源类型

  1. # 下面的配置在框架内部 DataSourceProperties里面并没有相关的属性<br />
  2. # 需要自己写个配置类去设置它们<br />
  3. **initialSize**: 5<br />
  4. **minIdle**: 5<br />
  5. **maxActive**: 20<br />
  6. **maxWait**: 60000<br />
  7. **timeBetweenEvictionRunsMillis**: 60000<br />
  8. **minEvictableIdleTimeMillis**: 300000<br />
  9. **validationQuery**: SELECT 1 FROM DUAL<br />
  10. **testWhileIdle**: true<br />
  11. **testOnBorrow**: false<br />
  12. **testOnReturn**: false<br />
  13. **poolPreparedStatements**: true<br />
  14. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙<br />
  15. **filters**: stat,wall,log4j<br />
  16. **maxPoolPreparedStatementPerConnectionSize**: 20<br />
  17. **useGlobalDataSourceStat**: true<br />
  18. **connectionProperties**: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 |

| —- |




整合监控中心

代码直接粘贴进去就行了

SpringBoot整合第三方技术 - 图1


访问监控中心

输入ip加端口加/druid/index.html 进入输入用户名和密码就访问控制中心了
http://localhost:8888/druid/index.html
用户名密码是 druid配置类里面的StatViewServlet()的ServletRegistrationBean 那里的initParams初始化Map里面设置的,具体参考代码.

(六)整合Mybatis和PageHelper

项目地址
zjj_SpringBoot_716d9aff-116c-6c5f-d7a1-6ce758f2ec87


mybatis和pageHelper

| <dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency> | | —- |


yaml扫描mapper文件
mybatis:

mapper-locations: classpath:mapping/*.xml

dao接口添加@Mapper注解

@Mapper

public interface TestDao {

然后创建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=”整合Mybatis全家桶.dao.TestDao”>
<select id=”findAll” resultType=”Map”>
SELECT _ _FROM user
</select>
</*mapper
>


(七)整合拦截器

项目地址
zjj_SpringBoot_7de90299-6677-a541-394a-6d08f46f6d9e

1.API

preHandle()方法在业务处理器处理请求之前被调用:
如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller 然后进入拦截器链, 从最后一个拦截器往回执行所有的postHandle() 接着再从最后一个拦截器往回执行所有的afterCompletion() ;

postHandle()在业务处理器处理请求执行完成后,生成视图之前执行的动作 可在modelAndView中加入数据,比如当前时间 ;

afterCompletion()方法在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 ,当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion() 。

Spring拦截器
HandlerInterceptorAdapter需要继承,HandlerInterceptor需要实现
可以作为日志记录和登录校验来使用
建议使用HandlerInterceptorAdapter,因为可以按需进行方法的覆盖。



执行顺序: preHandle —> 被拦截的方法—>postHandle—> afterCompletion




SpringBoot整合第三方技术 - 图2

2.如何在拦截器里面使用别的service

因为拦截器加载时间比bean早,所以在执行拦截器的preHandle方法时,方法里面的bean还没有被实例化,此时调用就会出现空指针情况,所以就需要在启动项目适合加载容器的时候就实例化这个bean.

解决思路就是:

在配置类里面 使用 @Bean注解将一个方法的返回值作为bean存入Spring容器里面, 然后在拦截器里面根据bean的name来调用这个bean.

SpringBoot整合第三方技术 - 图3

(八)整合SpringDataRedis

| <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> | | —- |



需要配置yml 如果不配置 默认连接的是本地
SpringBoot整合第三方技术 - 图4


注入模版
@Autowired

private RedisTemplate redisTemplate;

| /**

  • 根据ID查询实体
  • @param **id
    * @return
    */
    public Article findById(String id) {
    //1.判断缓存中是否有文章(注意一定要强转,不然Autowired会注入不进去)
    Article article = (Article)
    redisTemplate.opsForValue().get(“article+id);
    if(article == null){
    System.
    _out
    .println(“去数据库获取的”);
    //2.去数据库查询
    article =
    articleDao.findById(id).get();
    //3.存入redis
    redisTemplate.opsForValue().set(“article+id,article,30, TimeUnit._SECONDS);
    }
    else{
    //只是用于演示
    System.
    out.println(“从缓存获取的”);
    }

    return **article;
    } | | —- |


    (九)整合Redis



    org.springframework.boot
    spring-boot-starter-redis
    1.3.8.RELEASE

    在引导类上面添加支持缓存的注解
    @EnableCaching
    SpringBoot整合第三方技术 - 图5
    pojo需要序列化
    implements Serializable

    service层


    /
    添加缓存
    @Cacheable(value=”findAll”,key=”‘user.findAll2’”)
    属性
    value就是指定redis的key
    key 就是redis 的value 注意key的值要在双引号里面用单引号括起来
    !!!! 注意,不要直接return 需要要变量接收再return ,否则redis会失效

    /
    @Cacheable(value = “findAll”, key = “‘user.findAll2’”)
    public List findAll() {
    System.
    out.println(“aaaaaaaaaaa”);
    List list = userDao.findAll();
    return list;
    }

    什么时候需要删除缓存:
    在你修改添加删除的时候就需要清除缓存,否则当你查询的时候,你查询的还是你原来的缓存
    /

    删除缓存@CacheEvict
    属性:
    value就是指定redis的key
    key 就是redis 的value 注意key的值要在双引号里面用单引号括起来
    allEntries = true 就是删除指定的key里面的所有的value
    !!!! 注意,不要直接return 需要要变量接收再return ,否则redis会失效

    UserServiceImpl.class
    /
    @CacheEvict(value = “findAll”, key = “‘user.findAll’”, allEntries = true)
    public List findUserByName(String name) {
    *return
    userMapper.findUserByName(name);
    }

    1.缓存注解

    其实我感觉没什么用.
    https://www.cnblogs.com/OnlyCT/p/7845660.html#t2

    (十)整合ActiveMQ

    1.添加起步依赖

    org.springframework.boot
    spring-boot-starter-activemq

    2. 编写生产者和消费者

    生产者

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jms.core.JmsMessagingTemplate;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    /
    发消息
    /
    @RestController
    public class ProducerController {

    @Autowired
    private JmsMessagingTemplate jmsTemplate;

    /

    activeMQ生成消息 生产者
    1.注入模板类JmsMessagingTemplate 这个比JmsTemplate模版简单
    2.调用方法convertAndSend
    3.在别的类里面写一个消费者接收消息
    /
    @RequestMapping(“/sendMsg”)
    public void sendMsg(String msg) {
    //参数一:消息名称 参数二;消息内容
    jmsTemplate.convertAndSend(“itcast-msg”, msg);
    }
    }
    //**

    消费者
    package cn.itcast.springboot.consumer;

    import org.springframework.jms.annotation.JmsListener;
    import org.springframework.stereotype.Component;
    /
    消费者接收消息
    /
    @Component //受Spring管理的注解
    public class Consumser{

    /

    监听消息
    基于@JmsListener实现监听操作(更简单了,有了这个注解,这个类就不需要实现MessageListener了)
    @JmsListener(destination=”itcast-msg”)的参数xxxxx写生产者jmsTemplate.convertAndSend(“itcast-msg”, msg);的第一个参数
    /
    @JmsListener(destination=”itcast-msg”)
    public void getMsg(String msg) {
    System.out.println(msg);
    }

    }

    (十一)整合SpringDataJPA

    依赖

    org.springframework.boot
    spring-boot-starter-parent
    2.0.0.RELEASE


    com.
    SpringBootDemo
    0.0.1-SNAPSHOT



    org.springframework.boot
    spring-boot-starter-web


    mysql
    mysql-connector-java
    5.1.6


    org.springframework.boot
    spring-boot-starter-data-jpa






    org.springframework.boot
    spring-boot-devtools


    org.springframework
    springloaded
    1.2.9



    配置文件
    application.properties 注意名字不能改变

    里面有修改连接池信息和SpringJPA的其它信息等等

    SpringBoot整合第三方技术 - 图6

    实体类
    /
    用户实体类
    /
    @Entity
    @Table(name = “user”)
    public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.
    IDENTITY)
    private Long id;
    …… getset方法
    dao层
    public interface UserDao extends JpaRepository {
    service层
    @Service
    public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public List findAll() {
    List findAll =
    this.userDao.findAll();
    return findAll;
    }

    controller层

    @RestController
    @RequestMapping(“/user”)
    public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(“/findAll”)
    public List queryUserAll() {
    List findAll =
    this.userService.findAll();
    return** findAll;
    }
    }
    测试
    SpringBoot整合第三方技术 - 图7


    (十二)多数据源

    | 参考 项目:zjj_SpringBoot_82378ebe-39e8-99e0-4943-9d519a3af81e | | —- |

jta+atomikos分布式事务

| <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency> | | —- |


然后需要两个数据源配置类 ,每个数据源配置类分别对应每一个数据库连接信息,然后两个配置类分别扫描不同的mapper文件.