SpringBoot服务整合
1. SpringBoot整合数据源
1.1 SpringBoot整合C3P0 (mysql 8.0.22)
- 添加依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
- 修改本地配置文件
c3p0:
jdbcUrl: jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driverClass: com.mysql.cj.jdbc.Driver
user: root
password: 123456
maxPoolSize: 200
minPoolSize: 10
initialPoolSize: 10
acquireIncrement: 5
idleConnectionTestPeriod: 28000
maxIdleTime: 28000
- 建立连接池配置类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class C3P0DatasourceConfig {
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "c3p0")
public DataSource dataSource(){
return DataSourceBuilder.create().type(com.mchange.v2.c3p0.ComboPooledDataSource.class).build();
}
}
- 测试类
@SpringBootTest
@WebAppConfiguration
class SpringbootfeaturesApplicationTests {
@Autowired
private DataSource dataSource;
@Test
void contextLoads() throws SQLException {
System.out.println(dataSource.getConnection());
}
}
1.2 SpringBoot 整合Druid数据可以连接池
Druid是阿里巴巴推出的一款数据库连接池组件(可以理解为C3P0的下一代产品),也是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,可搞笑处理大规模的数据快速查询和分析。
- 导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
- 配置文件
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
password: 123456
username: root
url: jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
dbcp2:
min-idle: 1 # 数据库连接池的最小维持连接数
initial-size: 1 # 初始化提供的连接数
max-total: 1 # 最大连接数
max-wait-millis: 300 # 等待链接获取的最大超时时间
2. SpringBoot 整合ORM开发框架
2.1 整合mybatis
- 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
- vo类
package com.stevia.mybatis.vo;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Dept implements Serializable {
private Long deptno;
private String dname;
public Long getDeptno() {
return deptno;
}
public void setDeptno(Long deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
}
- 在resources里面创建myatis的配置文件mybatis.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis.cfg.xml 该配置文件主要用于:配置数据库的相关连接信息 -->
<configuration>
<!-- 将外部文件链接到mybatis.cfg.xml中 -->
<!-- <properties resource="mysql.properties"></properties>-->
<settings>
<!-- 开启懒加载的功能 -->
<!-- <setting name="lazyLoadingEnabled" value="true"/>-->
<!-- 将积极主动的关联对象加载方式,修改为消极按需的懒加载方式 -->
<!-- <setting name="aggressiveLazyLoading" value="false"/>-->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
- application.yaml里面添加Mybatis配置
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml #Mybatis配置文件所在路径
type-aliases-package: com.stevia.mybatis.vo # 定义所有操作类所在的包
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
password: 123456
username: root
url: jdbc:mysql://localhost:3306/mldn?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
dbcp2:
min-idle: 1 # 数据库连接池的最小维持连接数
initial-size: 1 # 初始化提供的连接数
max-total: 1 # 最大连接数
max-wait-millis: 300 # 等待链接获取的最大超时时间
- dao接口
package com.stevia.mybatis.dao;
import com.stevia.mybatis.vo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface IDeptDao {
@Select("SELECT deptno,dname FROM dept")
public List<Dept> findAll();
}
- service层接口
package com.stevia.mybatis.service;
import com.stevia.mybatis.vo.Dept;
import java.util.List;
public interface IDeptService {
public List<Dept> list();
}
- service层实现类
package com.stevia.mybatis.service.impl;
import com.stevia.mybatis.dao.IDeptDao;
import com.stevia.mybatis.service.IDeptService;
import com.stevia.mybatis.vo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class DeptServiceImpl implements IDeptService {
@Autowired
private IDeptDao deptDao;
@Override
public List<Dept> list() {
return this.deptDao.findAll();
}
}
- 测试类
package com.stevia.mybatis.test;
import com.stevia.mybatis.Springboot03MybatisApplication;
import com.stevia.mybatis.service.IDeptService;
import com.stevia.mybatis.vo.Dept;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import java.util.List;
@SpringBootTest(classes = Springboot03MybatisApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestDeptService {
@Autowired
private IDeptService deptService;
@Test
public void testList(){
List<Dept> allDepts=this.deptService.list();
for (Dept dept : allDepts) {
System.out.println("部门编号:"+dept.getDeptno()+"、部门名称:"+dept.getDname());
}
}
}
- 测试结果:
2.2 整合JPA
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
</dependency>
- 建立持久化类
package com.stevia.JPA.po;
import javax.persistence.*;
import java.io.Serializable;
@SuppressWarnings("serial")
@Cacheable(true)
@Entity
public class Dept implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 根据名称应用配置主键生成器
private Long deptno; // 字段的映射(属性名称=字段名称)
private String dname;
public Long getDeptno() {
return deptno;
}
public void setDeptno(Long deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
}
- 同样地,定义Dao接口
package com.stevia.JPA.dao;
import com.stevia.JPA.po.Dept;
import org.springframework.data.jpa.repository.JpaRepository;
public interface IDeptDAO extends JpaRepository<Dept,Long> { //包含全部基础的crud支持
}
- 业务层接口
package com.stevia.JPA.service;
import com.stevia.JPA.po.Dept;
import java.util.List;
public interface IDeptService {
public List<Dept> list();
}
- 业务层实现类
package com.stevia.JPA.service.impl;
import com.stevia.JPA.dao.IDeptDAO;
import com.stevia.JPA.po.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class IDeptService implements com.stevia.JPA.service.IDeptService {
@Autowired
private IDeptDAO deptDAO;
@Override
public List<Dept> list() {
return this.deptDAO.findAll();
}
}
- 测试类
package com.stevia.JPA.test;
import com.stevia.JPA.Springboot04JpaApplication;
import com.stevia.JPA.po.Dept;
import com.stevia.JPA.service.IDeptService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import java.util.List;
@SpringBootTest(classes = Springboot04JpaApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestDeptService {
@Autowired
private IDeptService deptService;// 注入接口对象
@Test
public void testList(){
List<Dept> allDepts=this.deptService.list();
for (Dept allDept : allDepts) {
System.out.println("部门编号: "+allDept.getDeptno()+"、 部门名称"+allDept.getDname());
}
}
}
(注意 :需要在主启动类里追加Repository扫描配置)
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rX04ClId-1613226891412)(SpringBoot服务整合.assets/image-20210209152251528.png)]
2.3 整合PlatformTransactionManager
SpringBoot中可以使用PlatformTransactionManager接口来实现事物的同一控制,而进行控制的 时候也可以采用注解或者AOP切片配置的形式来完成
- 配置类
package com.stevia.PTM.config;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource;
import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute;
import org.springframework.transaction.interceptor.TransactionAttribute;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import java.util.HashMap;
import java.util.Map;
@Configuration
@Aspect
public class TransactionConfig {
private static final int TRANSACTION_METHOD_TIMEOUT=5; //事务超时时间为5s
private static final String AOP_POINTCUT_EXPRESSION="execution(* com.stevia.PTM.service.IDeptService.list())"; //定义切面表达式
@Autowired
private PlatformTransactionManager transactionManager;
@Bean("txAdvice")
public TransactionInterceptor transactionConfig(){
//定义只读事务控制,该事务不需要启动事务支持
RuleBasedTransactionAttribute readOnly=new RuleBasedTransactionAttribute();
readOnly.setReadOnly(true);
readOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
// 定义更新事务 同时设置事务操作的超时时间
RuleBasedTransactionAttribute required=new RuleBasedTransactionAttribute();
required.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
required.setTimeout(TRANSACTION_METHOD_TIMEOUT);
Map<String, TransactionAttribute> transactionMap=new HashMap<>(); //定义业务切面
transactionMap.put("add*",required);
transactionMap.put("edit*",required);
transactionMap.put("delete*",required);
transactionMap.put("list*",required);
NameMatchTransactionAttributeSource source=new NameMatchTransactionAttributeSource();
source.setNameMap(transactionMap);
TransactionInterceptor transactionInterceptor=new TransactionInterceptor(transactionManager,source);
return transactionInterceptor;
}
@Bean
public Advisor transactionAdviceAdvisor(){
AspectJExpressionPointcut pointcut=new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION); //定义切面
return new DefaultPointcutAdvisor(pointcut,transactionConfig());
}
}
3 SpringBoot整合消息服务组件
在进行分布式系统设计时,经常会使用消息服务组件进行系统整合与异步通信服务,预期基本结构为生产者与消费者处理。常用的消息组件包括两类:JMS标准(ActiveMQ)、AMQP标准(RabbitMQ、Kafka)
3.1 SpringBoot整合ActiveMQ消息组件
- 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
- 配置文件
spring:
jms:
pub-sub-domain: false # 配置消息类型,true 表示为topic消息 false表示为Queue消息
activemq:
user: steiva
password: 123456
broker-url: tcp://activemq-server:61616
- consumer监听类
package com.stevia.springboot06activemq.consumer;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;
@Service
public class MessageConsumer {
@JmsListener(destination = "stevia.msg.queue") //定义消息监听队列
public void receiveMessage(String text){ // 进行消息接收处理
System.err.println("[***接收消息***]"+text);
}
}
- 生产者业务接口
package com.stevia.springboot06activemq.consumer;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;
@Service
public class MessageConsumer {
@JmsListener(destination = "stevia.msg.queue") //定义消息监听队列
public void receiveMessage(String text){ // 进行消息接收处理
System.err.println("[***接收消息***]"+text);
}
}
- 生产者实现类
package com.stevia.springboot06activemq.producer.impl;
import com.stevia.springboot06activemq.producer.IMessageProducer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import javax.jms.Destination;
import javax.jms.Queue;
public class MessageProducerImpl implements IMessageProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate; //消息发送模板
@Autowired
private Queue queue; // 注入队列
@Override
public void send(String msg) {
this.jmsMessagingTemplate.convertAndSend( this.queue,msg); //消息发送
}
}
- JMS消息发送配置类
package com.stevia.config;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import javax.jms.Queue;
@Configuration
@EnableJms
public class ActiveMQConfig {
@Bean
public Queue queue(){
return new ActiveMQQueue("stevia.msg.queue"); //定义对应名称
}
}
3.2 SpringBoot整合RabbitMQ消息组件
除了配置类区别比较大 其他的区别不大
后续有时间再补充
3.3 SpringBoot 整合Kafka
yml配置区别比较大 其余也没有太大区别
后续有时间再补充