SpringBoot服务整合

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());
        }
    }
}
  • 测试结果:

image-20210209145542616

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配置区别比较大 其余也没有太大区别

后续有时间再补充

4 SpringBoot整合Redis

5 SpringBoot整合安全框架

5.1 SpringBoot整合Shiro

5.2 SpringBoot给予Shiro整合OAuth统一认证

6 SpringBoot整合邮件服务器

7 定时调度

8 Actuator监控

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值