springboot分析——与其他组件的整合(druid/mybatis)

springboot本身提供了许多自动配置,帮助开发者提供开发效率,当然如果我们有一些个性化的需求,springboot

也提供了良好的扩展,只需要配置starter依赖或者简单的properties配置即可实现功能,下面我们分析几种和其他组件

整合的案例。

一:与Druid数据源的整合

druid是alibaba提供的一种数据源框架,内置了许多监控的功能,如果想使用可以很方便和springboot整合。

1:添加依赖和配置

java;gutter:true; com.alibaba druid-spring-boot-starter 1.1.21</p> <pre><code> com.alibaba druid 1.0.26 </code></pre> <pre><code> ;gutter:true;
#连接池的配置信息
## 初始化大小,最小,最大
spring.datasource.druid.url=jdbc:mysql://localhost:3306/study
spring.datasource.druid.username=root
spring.datasource.druid.password=root
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initialSize=2
spring.datasource.druid.minIdle=2
spring.datasource.druid.maxActive=2
## 配置获取连接等待超时的时间
spring.datasource.druid.maxWait=60000
配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
配置监控统计拦截的filters,去掉后监控界面sql无法统计,’wall’用于防火墙
spring.datasource.druid.filters=stat,wallWWW
通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

#mybatis sql配置文件
mybatis.mapperLocations=classpath:com/mapper/*.xml

2:配置druid监控

java;gutter:true; @Data @Configuration //@ConfigurationProperties(prefix = "spring.druid",ignoreInvalidFields = true) public class DruidConfig {</p> <pre><code>//因为Springboot内置了servlet容器,所以没有web.xml,替代方法就是将ServletRegistrationBean注册进去 //加入后台监控 //这里其实就相当于servlet的web.xml @Bean public ServletRegistrationBean statViewServlet() { ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); //后台需要有人登录,进行配置 //bean.addUrlMappings(); 这个可以添加映射,我们在构造里已经写了 //设置一些初始化参数 Map initParas = new HashMap(); initParas.put("loginUsername", "admin");//它这个账户密码是固定的 initParas.put("loginPassword", "123456"); //允许谁能防伪 initParas.put("allow", "");//这个值为空或没有就允许所有人访问,ip白名单 //initParas.put("allow","localhost");//只允许本机访问,多个ip用逗号,隔开 //initParas.put("deny","");//ip黑名单,拒绝谁访问 deny和allow同时存在优先deny initParas.put("resetEnable", "false");//禁用HTML页面的Reset按钮 bean.setInitParameters(initParas); return bean; } //再配置一个过滤器,Servlet按上面的方式注册Filter也只能这样 @Bean public FilterRegistrationBean webStatFilter() { FilterRegistrationBean bean = new FilterRegistrationBean(); //可以设置也可以获取,设置一个阿里巴巴的过滤器 bean.setFilter(new WebStatFilter()); bean.addUrlPatterns("/*"); //可以过滤和排除哪些东西 Map initParams = new HashMap(); //把不需要监控的过滤掉,这些不进行统计 initParams.put("exclusions", "*.js,*.css,/druid/*"); bean.setInitParameters(initParams); return bean; } </code></pre> <p>}</p> <pre><code> 测试代码: ;gutter:true;
@Controller
public class DemoController {

@Value("${study.enable}")
private String env;

@Autowired
private DataSource dataSource;

@RequestMapping("/hello")
@ResponseBody
public String hello(){
try{
Connection connection = dataSource.getConnection();
String sql = "select * from user";
PreparedStatement ps = connection.prepareStatement(sql);
ResultSet resultSet = ps.executeQuery();
List list = new ArrayList<>();
while(resultSet.next()){
String name = resultSet.getString("name");
String age = resultSet.getString("age");
User user = new User();
user.setAge(age);
user.setName(name);
list.add(user);
}
return JSON.toJSONString(list);
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}

运行结果:

springboot分析——与其他组件的整合(druid/mybatis)

看一下监控平台:

springboot分析——与其他组件的整合(druid/mybatis)

springboot分析——与其他组件的整合(druid/mybatis)

指标监控正常,说明springboot整合druid数据源成功!,简单看一下源码,从配置启动依赖starter开始看

springboot的自动配置 是基于SPI机制,在spring容器启动的时候,会加载META-INF 下的spring.factories 目录的文件,解析里面的配置项

springboot分析——与其他组件的整合(druid/mybatis)

springboot分析——与其他组件的整合(druid/mybatis)

看一下DruidDataSourceAutoConfigure类:

springboot分析——与其他组件的整合(druid/mybatis)

springboot分析——与其他组件的整合(druid/mybatis)

springboot分析——与其他组件的整合(druid/mybatis)

最后把DruidDataSource这个对象缓存到spring容器中。

二:与mybatis的整合

操作数据库用的最多的还是mybatis框架,作为比较优秀的orm框架,深得程序员的喜欢,下面我们来看一下怎么整合?

1:添加依赖和配置

java;gutter:true; org.mybatis.spring.boot mybatis-spring-boot-starter RELEASE</p> <pre><code> ;gutter:true;
#mybatis sql配置文件
mybatis.mapperLocations=classpath:com/mapper/*.xml

在@Configuration配置项上加入@MapperScan注解,配置扫描包路径

springboot分析——与其他组件的整合(druid/mybatis)

在dao目录新建一个UserMapper类

java;gutter:true; public interface UserMapper { List listUsers(); }</p> <pre><code> 在mapper目录新建一个UserMapper.xml文件 ;gutter:true;
select * from user

测试类改为:

java;gutter:true; @Controller public class DemoController {</p> <pre><code>@Value("${study.enable}") private String env; </code></pre> <p>// @Autowired // private DataSource dataSource;</p> <pre><code>@Autowired private UserMapper mapper; @RequestMapping("/hello") @ResponseBody public String hello(){ try{ /* Connection connection = dataSource.getConnection(); String sql = "select * from user"; PreparedStatement ps = connection.prepareStatement(sql); ResultSet resultSet = ps.executeQuery(); List list = new ArrayList<>(); while(resultSet.next()){ String name = resultSet.getString("name"); String age = resultSet.getString("age"); User user = new User(); user.setAge(age); user.setName(name); list.add(user); }*/ List list = mapper.listUsers(); return JSON.toJSONString(list); }catch (Exception e){ e.printStackTrace(); return null; } } </code></pre> <p>}

运行结果:

springboot分析——与其他组件的整合(druid/mybatis)

springboot整合mybatis成功!

下面看一下源码如何实现的?从mybatis的starter启动类开始看

mybatis-spring-boot-starter是一个父类工程,pom文件,依赖引入了上面的jar包

springboot分析——与其他组件的整合(druid/mybatis)

mybatis-spring-boot-autoconfigure中有spring.factories文件:

springboot分析——与其他组件的整合(druid/mybatis)

springboot分析——与其他组件的整合(druid/mybatis)

看一下这个类里面的方法,在这个方法中会解析mybatis-config.xml ,以及mapper.xml文件,完成MapperStatement的解析缓存以及命名空间的解析,

全限定名id与MapperProxyFactory的映射缓存。

springboot分析——与其他组件的整合(druid/mybatis)

@MapperScan注解扫描会在ConfigurationClassPostProcessor中进行,由于这个注解扫描比较复杂,后面再进行分析,主要工作是:

扫描包路径,创建MapperFactoryBean,然后代理通过beanName调用会getObject,调到sqlSession.getMapper,返回动态代理。

Original: https://www.cnblogs.com/warrior4236/p/13275255.html
Author: warrior1234
Title: springboot分析——与其他组件的整合(druid/mybatis)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541108/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【java基础】JAVA使用Arrays.sort()升序和降序

    java中对数组进行排序 使用Array.sort() 这个默认是升序 如果想降序怎么办呢? 使用:Arrays.sort(scores,Collections.reverseOr…

    Java 2023年5月29日
    080
  • aardio + Python 可视化快速开发桌面程序,一键生成独立 EXE

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月16日
    066
  • dubbo和springCloud

    Dubbo 高性能的java RPC框架 架构 init:初始化 async:异步 sync同步 0:需要容器启动例如Tomcat 1:注册ip端口以及一些东西到注册中心 2:订阅…

    Java 2023年6月13日
    070
  • 明明准备的挺好,面试又挂了……

    面试准备的时候,你是否总觉得花费的时间过长?又或者有些面试题你明明了解过,但是面试的时候,给出的答案总是不那么令人满意。甚至,每次刷完面试题,你觉得答得很好,但是总也没得到 Off…

    Java 2023年6月7日
    079
  • java使用freemarker作为模板导出Excel表格

    1:首先新建一个excel表格自己弄好格式如下图 2:把excel 表格另存为xml格式文件如下图 3:这个时候的文件就是xml 格式的文件了,在myeclipse里面项目工程里面…

    Java 2023年5月29日
    099
  • Java中this和super的使用

    区别点 this super 访问属性 访问本类中的属性,如果本类没有,则从父类继续查找 访问父类中的属性 调用方法 访问本类中的方法,如果本类没有,则从父类继续查找 直接访问父类…

    Java 2023年6月6日
    082
  • 01-Spring Security框架学习–入门(二)

    一、入门案例 Spring Security 自定义登录界面 通过之前的一节 01-Spring Security框架学习–入门(一)的简单演示,Spring secu…

    Java 2023年6月10日
    084
  • Spring Boot 2.x基础教程:默认数据源Hikari的配置详解

    https://www.cnblogs.com/didispace/p/12291832.html Original: https://www.cnblogs.com/zhaoya…

    Java 2023年5月30日
    089
  • 【二】pig4cloud项目一键build — 编写发布脚本

    在开发测试阶段,代码从仓储发布到测试服务器总是少不了的过程,在这个过程中我喜欢把一些繁琐的步骤全部全部聚合到一个脚本里面,只需要执行一个脚本或者把脚本配置到jenkins上通过按钮…

    Java 2023年6月8日
    092
  • JAVA 异常 基本知识

    异常 异常定义 异常是运行过程中出现的错误 人为错误:填写错误等 随机错误:网络中断、内存耗尽等 一个健壮的程序必须处理各种各样的错误 Java的异常是class Object T…

    Java 2023年6月9日
    072
  • future用法-java中异步执行多个任务并集中处理所有结果

    需求背景 同事问了个问题,java中有什么办法让我异步查询多个表的数据,最后将所有结果进行处理输出想到future是解决这类问题常用的,于是写了个demo给他参考 简化需求 定义3…

    Java 2023年6月9日
    089
  • 分享一例同一系统里不同服务之间通信的设计方案

    优付系统结构如下。一个数据库之上,有商户接口(RestAPI)、运营后台(OMS)、商户门户这3个独立SSM应用,三者有各自不同的功能处理逻辑。 现在呢,要做一个补偿工具。当付款单…

    Java 2023年6月15日
    071
  • SpringBoot启动流程分析原理(一)

    我们都知道 SpringBoot自问世以来,一直有一个响亮的口号”约定优于配置”,其实一种按约定编程的软件设计范式,目的在于减少软件开发人员在工作中的各种繁…

    Java 2023年6月5日
    087
  • JAVA RSA加密AES加密

    RSA加密: import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.C…

    Java 2023年5月29日
    096
  • 含源码解析,深入Java 线程池原理

    从池化技术到底层实现,一篇文章带你贯通线程池技术。 1、池化技术简介 在系统开发过程中,我们经常会用到池化技术来减少系统消耗,提升系统性能。在编程领域,比较典型的池化技术有:线程池…

    Java 2023年5月29日
    075
  • Nginx作为代理服务

    一、代理相关概念 1、什么是代理? 代理不直接让客户端请求源服务器,由代理服务器来代为办理。 生活中如 代理理财,代理收快递都是同一个道理。 2、代理的分类 按应用场景进行分类 正…

    Java 2023年5月30日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球