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)
(二)整合Listener
案例 zjj_SpringBoot_434ae26b-1137-8f4c-d6fc-4ffa639d2e4f |
---|
配置类
| @Configuration
public class Config {
/**
* 注册监听器
* **@return<br />
***/<br />
@Bean
public ServletListenerRegistrationBean registrationBean() {
ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean(new MyListener());
return servletListenerRegistrationBean;
}
} |
| —- |
自定义Listener
|
import javax.servlet.;
public class MyListener implements ServletContextListener {
/*
* 项目启动时候会执行这个方法
* **@param ****_sce _**可以获取 ServletContext 上下文<br />
*/<br />
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println(“MyListener.contextInitialized”);
ServletContext servletContext = sce.getServletContext();
}
/**
* 项目销毁的时候会执行这个方法<br />
*<br />
* **@param ****_sce _**可以获取 ServletContext 上下文<br />
*/<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);
}
/**
* ServletContextListener 匿名内部类<br />
*/<br />
@Bean
public ServletListenerRegistrationBean
ServletListenerRegistrationBean
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
new FilterRegistrationBean<>();
filterFilterRegistrationBean.setFilter(new MyFilter());//设置Filter
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 {
/*
* 启动容器的时候 初始化执行这个<br />
*<br />
* **@param ****_filterConfig<br />
_*** **@throws **ServletException<br />
*/<br />
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println(“MyFilter.init”);
}
/**
* 访问接口之前会执行这个方法<br />
*<br />
* **@param ****_servletRequest<br />
_*** **@param ****_servletResponse<br />
_*** **@param ****_filterChain<br />
_*** **@throws **IOException<br />
* **@throws **ServletException<br />
*/<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:
**driver-class-name**: com.mysql.jdbc.Driver
**url**: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
**username**: root
**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是指定数据源类型
# 下面的配置在框架内部 DataSourceProperties里面并没有相关的属性<br />
# 需要自己写个配置类去设置它们<br />
**initialSize**: 5<br />
**minIdle**: 5<br />
**maxActive**: 20<br />
**maxWait**: 60000<br />
**timeBetweenEvictionRunsMillis**: 60000<br />
**minEvictableIdleTimeMillis**: 300000<br />
**validationQuery**: SELECT 1 FROM DUAL<br />
**testWhileIdle**: true<br />
**testOnBorrow**: false<br />
**testOnReturn**: false<br />
**poolPreparedStatements**: true<br />
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙<br />
**filters**: stat,wall,log4j<br />
**maxPoolPreparedStatementPerConnectionSize**: 20<br />
**useGlobalDataSourceStat**: true<br />
**connectionProperties**: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 |
| —- |
整合监控中心
代码直接粘贴进去就行了
访问监控中心
输入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
2.如何在拦截器里面使用别的service
因为拦截器加载时间比bean早,所以在执行拦截器的preHandle方法时,方法里面的bean还没有被实例化,此时调用就会出现空指针情况,所以就需要在启动项目适合加载容器的时候就实例化这个bean.
解决思路就是:
在配置类里面 使用 @Bean注解将一个方法的返回值作为bean存入Spring容器里面, 然后在拦截器里面根据bean的name来调用这个bean.
(八)整合SpringDataRedis
| <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> |
| —- |
需要配置yml 如果不配置 默认连接的是本地
注入模版
@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
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 ListfindAll() { out.println(“aaaaaaaaaaa”);
System.
Listlist = 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 ListfindUserByName(String name) { userMapper.findUserByName(name);
*return
}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的其它信息等等
实体类
/
用户实体类
/
@Entity
@Table(name = “user”)
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
…… getset方法
dao层
public interface UserDao extends JpaRepository{ public class UserServiceImpl implements UserService {
service层
@Service
@Autowired
private UserDao userDao;
@Override
public ListfindAll() { this.userDao.findAll();
ListfindAll =
return findAll;
}
controller层
@RestController
@RequestMapping(“/user”)
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(“/findAll”)
public ListqueryUserAll() { this.userService.findAll();
ListfindAll =
return** findAll;
}
}
测试
(十二)多数据源
| 参考 项目:zjj_SpringBoot_82378ebe-39e8-99e0-4943-9d519a3af81e | | —- |
jta+atomikos分布式事务
| <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency> |
| —- |
然后需要两个数据源配置类 ,每个数据源配置类分别对应每一个数据库连接信息,然后两个配置类分别扫描不同的mapper文件.