转载自前辈:我没有三个新脏

Spring学习(1)——快速入门

认识 Spring 框架

Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转)AOP(Aspect Oriented Programming,面向切面编程)

什么是 Spring:

  1. Spring 是一个轻量级的 DI / IoC 和 AOP 容器的开源框架,来源于 Rod Johnson 在其著作《Expert one on one J2EE design and development》中阐述的部分理念和原型衍生而来。
  2. Spring 提倡以“最少侵入”的方式来管理应用中的代码,这意味着我们可以随时安装或者卸载 Spring
  • 适用范围:任何 Java 应用
  • Spring 的根本使命:简化 Java 开发

尽管 J2EE 能够赶上 Spring 的步伐,但 Spring 并没有停止前进, Spring 继续在其他领域发展,而 J2EE 则刚刚开始涉及这些领域,或者还没有完全开始在这些领域的创新。移动开发、社交 API 集成、NoSQL 数据库、云计算以及大数据都是 Spring 正在涉足和创新的领域。Spring 的前景依然会很美好。

Spring 中常用术语:

  • 框架:是能完成一定功能半成品

    框架能够帮助我们完成的是:项目的整体框架、一些基础功能、规定了类和对象如何创建,如何协作等,当我们开发一个项目时,框架帮助我们完成了一部分功能,我们自己再完成一部分,那这个项目就完成了。
  • 非侵入式设计:

    从框架的角度可以理解为:无需继承框架提供的任何类

    这样我们在更换框架时,之前写过的代码几乎可以继续使用。
  • 轻量级和重量级:

    轻量级是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反
  • JavaBean:

    符合 JavaBean 规范的 Java 类
  • POJO:Plain Old Java Objects,简单老式 Java 对象

    它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色不继承或不实现任何其它Java框架的类或接口。

注意:bean 的各种名称——虽然 Spring 用 bean 或者 JavaBean 来表示应用组件,但并不意味着 Spring 组件必须遵循 JavaBean 规范,一个 Spring 组件可以是任意形式的 POJO。

  • 容器:

    在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期

Spring 的优势

  • 低侵入 / 低耦合 (降低组件之间的耦合度,实现软件各层之间的解耦)
  • 声明式事务管理(基于切面和惯例)
  • 方便集成其他框架(如MyBatis、Hibernate)
  • 降低 Java 开发难度
  • Spring 框架中包括了 J2EE 三层的每一层的解决方案(一站式)

Spring 能帮我们做什么

①.Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系

②.Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。

③.Spring非常简单的帮我们管理数据库事务

④.Spring提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成,而且自己也提供了一套JDBC访问模板来方便数据库访问。

⑤.Spring 还提供与第三方Web(如Struts1/2、JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。

⑥.Spring方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)

Spring 的框架结构

  • Data Access/Integration层包含有JDBC、ORM、OXM、JMS和Transaction模块。
  • Web层包含了Web、Web-Servlet、WebSocket、Web-Porlet模块。
  • AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现。
  • Core Container(核心容器):包含有Beans、Core、Context和SpEL模块。
  • Test模块支持使用JUnit和TestNG对Spring组件进行测试。

Spring IoC 和 DI 简介

IoC:Inverse of Control(控制反转)

  • 读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
  • 正控:若要使用某个对象,需要自己去负责对象的创建
  • 反控:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架
  • 好莱坞法则:Don’t call me ,I’ll call you

一个例子

控制反转显然是一个抽象的概念,我们举一个鲜明的例子来说明。

在现实生活中,人们要用到一样东西的时候,第一反应就是去找到这件东西,比如想喝新鲜橙汁,在没有饮品店的日子里,最直观的做法就是:买果汁机、买橙子,然后准备开水。值得注意的是:这些都是你自己“主动”创造的过程,也就是说一杯橙汁需要你自己创造。

然而到了今时今日,由于饮品店的盛行,当我们想喝橙汁时,第一想法就转换成了找到饮品店的联系方式,通过电话等渠道描述你的需要、地址、联系方式等,下订单等待,过一会儿就会有人送来橙汁了。

请注意你并没有“主动”去创造橙汁,橙汁是由饮品店创造的,而不是你,然而也完全达到了你的要求,甚至比你创造的要好上那么一些。

编写第一个 Spring 程序

  1. 新建一个空的 Java 项目,命名为【spring】
  2. 新建一个名为【lib】的目录,并添加进必要的 jar 包,导入项目

  1. 在 Packge【pojo】下新建一个【Source】类:
package pojo;
public class Source {

private String fruit; // 类型

private String sugar; // 糖分描述

private String size; // 大小杯

/* setter and getter */

}
  1. 在 【src】 目录下新建一个 【applicationContext.xml】 文件,通过 xml 文件配置的方式装配我们的 bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"source"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"pojo.Source"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"fruit"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"橙子"</span>/&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"sugar"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"多糖"</span>/&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"size"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"超大杯"</span>/&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">bean</span>&gt;</span>

</beans>

  1. 在 Packge【test】下新建一个【TestSpring】类:
package test;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import pojo.Source; public class TestSpring {
@<span class="hljs-type">Test</span>
<span class="hljs-keyword">public</span> void test(){
<span class="hljs-type">ApplicationContext</span> context = new <span class="hljs-type">ClassPathXmlApplicationContext</span>(
new <span class="hljs-type">String</span>[]{<span class="hljs-string">"applicationContext.xml"</span>}
); <span class="hljs-type">Source</span> source = (<span class="hljs-type">Source</span>) context.getBean(<span class="hljs-string">"source"</span>);
<span class="hljs-type">System</span>.out.<span class="hljs-built_in">println</span>(source.getFruit());
<span class="hljs-type">System</span>.out.<span class="hljs-built_in">println</span>(source.getSugar());
<span class="hljs-type">System</span>.out.<span class="hljs-built_in">println</span>(source.getSize());
}

}

  1. 运行测试代码,可以正常拿到 xml 配置的 bean

  • 总结:
  • 传统的方式:

    通过new 关键字主动创建一个对象
  • IOC方式:

    对象的生命周期由Spring来管理,直接从Spring那里去获取一个对象。 IOC是反转控制 (Inversion Of Control)的缩写,就像控制权从本来在自己手里,交给了Spring。

参考地址:这里

DI:Dependency Injection(依赖注入)

  • 指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象

继续上面的例子

  1. 在 Packge【pojo】下新建一个【JuiceMaker】类:
package pojo;

public class JuiceMaker {
<span class="hljs-comment">// 唯一关联了一个 Source 对象</span>
<span class="hljs-keyword">private</span> Source source = <span class="hljs-keyword">null</span>; <span class="hljs-comment">/* setter and getter */</span> <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">makeJuice</span><span class="hljs-params">()</span></span>{
String juice = <span class="hljs-string">"xxx用户点了一杯"</span> + source.getFruit() + source.getSugar() + source.getSize();
<span class="hljs-keyword">return</span> juice;
}

}

  1. 在 xml 文件中配置 JuiceMaker 对象:
  • 注意:这里要使用 ref 来注入另一个对象
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"source"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"pojo.Source"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"fruit"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"橙子"</span>/&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"sugar"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"多糖"</span>/&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"size"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"超大杯"</span>/&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">bean</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"juickMaker"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"pojo.JuiceMaker"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"source"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"source"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">bean</span>&gt;</span>

</beans>

  1. 在 【TestSpring】 中添加如下代码:
package test;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import pojo.JuiceMaker;

import pojo.Source; public class TestSpring {
<span class="hljs-meta">@Test</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">test</span><span class="hljs-params">()</span></span>{
ApplicationContext context = <span class="hljs-keyword">new</span> ClassPathXmlApplicationContext(
<span class="hljs-keyword">new</span> String[]{<span class="hljs-string">"applicationContext.xml"</span>}
); Source source = (Source) context.getBean(<span class="hljs-string">"source"</span>);
System.out.println(source.getFruit());
System.out.println(source.getSugar());
System.out.println(source.getSize()); JuiceMaker juiceMaker = (JuiceMaker) context.getBean(<span class="hljs-string">"juickMaker"</span>);
System.out.println(juiceMaker.makeJuice());
}

}

  1. 运行测试代码:

总结:IoC 和 DI 其实是同一个概念的不同角度描述,DI 相对 IoC 而言,明确描述了“被注入对象依赖 IoC 容器配置依赖对象”

IoC 如何实现的

最后我们简单说说IoC是如何实现的。想象一下如果我们自己来实现这个依赖注入的功能,我们怎么来做? 无外乎:

  1. 读取标注或者配置文件,看看JuiceMaker依赖的是哪个Source,拿到类名
  2. 使用反射的API,基于类名实例化对应的对象实例
  3. 将对象实例,通过构造函数或者 setter,传递给 JuiceMaker

我们发现其实自己来实现也不是很难,Spring实际也就是这么做的。这么看的话其实IoC就是一个工厂模式的升级版!当然要做一个成熟的IoC框架,还是非常多细致的工作要做,Spring不仅提供了一个已经成为业界标准的Java IoC框架,还提供了更多强大的功能,所以大家就别去造轮子啦!希望了解IoC更多实现细节不妨通过学习Spring的源码来加深理解!

引用地址:这里


Spring AOP 简介

如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用。

AOP 即 Aspect Oriented Program 面向切面编程

首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。

  • 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
  • 所谓的周边功能,比如性能统计,日志,事务管理等等

周边功能在 Spring 的面向切面编程AOP思想里,即被定义为切面

在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP

AOP 的目的

AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码降低模块间的耦合度,并有利于未来的可拓展性和可维护性

AOP 当中的概念:

  • 切入点(Pointcut)

    在哪些类,哪些方法上切入(where
  • 通知(Advice)

    在方法执行的什么实际(when:方法前/方法后/方法前后)做什么(what:增强的功能)
  • 切面(Aspect)

    切面 = 切入点 + 通知,通俗点就是:在什么时机,什么地方,做什么增强!
  • 织入(Weaving)

    把切面加入到对象,并创建出代理对象的过程。(由 Spring 来完成)

AOP 编程

  1. 在 Packge【service】下创建 【ProductService】类:
package service;
public class ProductService {

public void doSomeService(){

System.out.println("doSomeService");

}

}
  1. 在 xml 文件中装配该 bean:
<bean name="productService" class="service.ProductService" />
  1. 在【TestSpring】中编写测试代码,运行:

  1. 在 Packge【aspect】下准备日志切面 【LoggerAspect】类:
package aspect;

import org.aspectj.lang.ProceedingJoinPoint;

public class LoggerAspect {
public <span class="hljs-type">Object</span> log(<span class="hljs-type">ProceedingJoinPoint</span> joinPoint) <span class="hljs-keyword">throws</span> <span class="hljs-type">Throwable</span> {
<span class="hljs-type">System</span>.out.println(<span class="hljs-string">"start log:"</span> + joinPoint.getSignature().getName());
<span class="hljs-type">Object</span> <span class="hljs-class"><span class="hljs-keyword">object</span> </span>= joinPoint.proceed();
<span class="hljs-type">System</span>.out.println(<span class="hljs-string">"end log:"</span> + joinPoint.getSignature().getName());
<span class="hljs-keyword">return</span> <span class="hljs-class"><span class="hljs-keyword">object</span></span>;
}

}

  1. 在 xml 文件中声明业务对象和日志切面:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"productService"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"service.ProductService"</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"loggerAspect"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"aspect.LoggerAspect"</span>/&gt;</span> <span class="hljs-comment">&lt;!-- 配置AOP --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">aop:config</span>&gt;</span>
<span class="hljs-comment">&lt;!-- where:在哪些地方(包.类.方法)做增加 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">aop:pointcut</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"loggerCutpoint"</span>
<span class="hljs-attr">expression</span>=<span class="hljs-string">"execution(* service.ProductService.*(..)) "</span>/&gt;</span> <span class="hljs-comment">&lt;!-- what:做什么增强 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">aop:aspect</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"logAspect"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"loggerAspect"</span>&gt;</span>
<span class="hljs-comment">&lt;!-- when:在什么时机(方法前/后/前后) --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">aop:around</span> <span class="hljs-attr">pointcut-ref</span>=<span class="hljs-string">"loggerCutpoint"</span> <span class="hljs-attr">method</span>=<span class="hljs-string">"log"</span>/&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">aop:aspect</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">aop:config</span>&gt;</span>

</beans>

  1. 再次运行 TestSpring 中的测试代码,代码并没有改变,但是在业务方法运行之前和运行之后,都分别输出了日志信息:

欢迎转载,转载请注明出处!

简书ID:@我没有三颗心脏

github:wmyskxz

欢迎关注公众微信号:wmyskxz_javaweb

分享自己的Java Web学习之路以及各种Java学习资料

	</div>
<div class="postDesc">posted @ <span id="post-date">2018-04-13 14:57</span> <a href="https://www.cnblogs.com/wmyskxz/">我没有三颗心脏</a> 阅读(<span id="post_view_count">5930</span>) 评论(<span id="post_comment_count">1</span>) <a href="https://i.cnblogs.com/EditPosts.aspx?postid=8820371" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(8820371);return false;">收藏</a></div>
</div>
<script src="//common.cnblogs.com/highlight/9.12.0/highlight.min.js"></script><script>markdown_highlight();</script><script type="text/javascript">var allowComments=true,cb_blogId=340733,cb_entryId=8820371,cb_blogApp=currentBlogApp,cb_blogUserGuid='e085d8d2-9103-e711-845c-ac853d9f53ac',cb_entryCreatedDate='2018/4/13 14:57:00';loadViewCount(cb_entryId);var cb_postType=1;</script>
评论列表
	<div class="feedbackItem">
<div class="feedbackListSubtitle">
<div class="feedbackManage">
&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3951018,'tLF4al0n7ii+37zC5B4VnZGPjd5a+6QY1sl13Y8zOA5NXmVL3tnJkw==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3951018,'tLF4al0n7ii+37zC5B4VnZGPjd5a+6QY1sl13Y8zOA5NXmVL3tnJkw==')">引用</a></span>
</div>
<a href="#3951018" class="layer">#1楼</a><a name="3951018" id="comment_anchor_3951018"></a><span id="comment-maxId" style="display:none;">3951018</span><span id="comment-maxDate" style="display:none;">2018/4/13 19:11:51</span> <span class="comment_date">2018-04-13 19:11</span> <a id="a_comment_author_3951018" href="https://www.cnblogs.com/LinJavaWeb/" target="_blank">LinJava-X</a> <a href="http://msg.cnblogs.com/send/LinJava-X" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
</div>
<div class="feedbackCon">
<div id="comment_body_3951018" class="blog_comment_body">果然,很详细</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3951018,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3951018,'Bury',this)">反对(0)</a></div><span id="comment_3951018_avatar" style="display:none;">http://pic.cnblogs.com/face/1153138/20171110152516.png</span>
</div>
</div>
<div id="comments_pager_bottom"></div></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
发表评论

昵称:

评论内容:





不改了
退出
订阅评论

[Ctrl+Enter快捷键提交]

</div><!--end: forFlow -->
</div>

Spring 框架学习的更多相关文章

  1. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  2. spring框架学习(三)junit单元测试

    spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...

  3. Spring框架学习1

    AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理   Spring框架学习(一)   阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...

  4. spring 框架学习网站

    spring 框架学习网站 NO1 http://www.mkyong.com NO2 https://spring.io/docs/reference

  5. Spring框架学习之IOC(二)

    Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...

  6. Spring框架学习之IOC(一)

    Spring框架学习之IOC(一) 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spri ...

  7. Spring框架学习笔记(5)——Spring Boot创建与使用

    Spring Boot可以更为方便地搭建一个Web系统,之后服务器上部署也较为方便 创建Spring boot项目 1. 使用IDEA创建项目 2. 修改groupid和artifact 3. 一路n ...

  8. Spring框架学习总结(上)

    目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...

  9. Spring框架学习笔记(8)——spring boot+mybatis plus+mysql项目环境搭建

    之前写的那篇Spring框架学习笔记(5)--Spring Boot创建与使用,发现有多小细节没有提及,,正好现在又学习了mybatis plus这款框架,打算重新整理一遍,并将细节说清楚 1.通过I ...

  10. Spring框架学习笔记(1)

    Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...

随机推荐

  1. C# ArrayPool 源码解读之 byte[] 池化

    一:背景 1. 讲故事最近在分析一个 dump 的过程中发现其在 gen2 和 LOH 上有不少size较大的free,仔细看了下,这些free生前大多都是模板引擎生成的html片段的byte[]数组 ...

  2. MySQL5.7.24 安装

    官网地址 https://dev.mysql.com/downloads/mysql/ 1. 安装依赖 yum install -y cmake make gcc gcc-c++ libaio ncu ...

  3. VMware 部署虚拟环境

    2021-08-23 1. 版本介绍 本地主机操作系统:windows 10虚拟软件版本:VMware workstation 14centos镜像版本:centos 7.5 2. 设置 2.1 基础 ...

  4. 15-SpringCloud Stream

    Stream是什么及Binder介绍 官方文档1 官方文档2 Cloud Stream中文指导手册 什么是Spring Cloud Stream? 官方定义Spring Cloud Stream是一个 ...

  5. 简单三分钟,本地搭建 k8s

    使用 minikube 在本地搭建 k8s 已经比以前要简单很多了.本文,我们通过简短的三分钟来重现一下在本地搭建 k8s 实验环境的步骤. Newbe.Claptrap 是一个用于轻松应对并发问题的 ...

  6. Python 利用GDAL对图像进行几何校正

    原文链接:https://blog.csdn.net/qq_27045589/article/details/81062586 一.几何校正方法 图像校正本质是建立一种从原始图像行列号到某种投影的数学 ...

  7. 代码注释规范之Doxygen

    1.Doxygen简介 Doxygen是一个程序的文档产生工具,可以将程序中的注释转换成说明文档或者说是API参考手册,从而减少程序员整理文档的时间.当然这里程序中的注释需要遵循一定的规则书写,才能让 ...

  8. CentOS 7操作系统安装

    1.关于运维小伙伴可以采用何种方式安装操作系统 下面列举的只是我会用到的安装方式,在运维过程中并不一定是最优解,只是自己运维过程中的一些经验. (1)物理服务器,可以通过连接管理口来安装操作系统,管理 ...

  9. 从线上日志统计接口访问量QPS

    这一阵子在面试,连续遇到好几家(大小厂都有)问我的项目线上qps的情况了,说实话,我作为一个大头兵,本来没关注过这个数据,只能含混地给个"大概.也许"的回答. 回来之后,我决定对业 ...

  10. Excel中怎么快速选中区域

    连续的表格选定 一张表格中会有不同的部分,若想选择某一个区域的数据的时候我们可以使用快捷键Ctrl+A,这是需要先选中第一个单元格,接着点击Ctrl+A即可选中连续的单元格.       汇总后需要汇 ...