暂无个人介绍
<div class="markdown_views"> <h1 id="集合注解映射">集合注解映射</h1> <p>集合关系映射可以看成是一对多关系映射的一种简化,在一个电商系统里,出售的产品可能会有多张展示图片,如果我们使用一对多来建立关联映射时,需要创建一个实体类Images,里面可能有属性:图片在服务器的访问路径url和图片所属产品productId。但如果我们使用
<div class="markdown_views"> <p>在我们的角色管理系统中,一个用户可以有多种角色,一种角色可以赋予多个用户,显然用户和角色就是典型的多对多关系。又或者博客网站上,用户与文章点赞记录也是一个多对多关系,即一个用户可以点赞多篇文章,一篇文章可以给多个用户点赞等,这时候,我们往往需要附加一些信息,比如授权时间、点赞时间等。在上面两个实例中,都可对应于hi
<div class="markdown_views"> <h1 id="本地分支解析">本地分支解析</h1> <p>git 通过可变指针来实现对提交数据的历史版本的控制,每当我们提交新的更新,当前分支(设为master)则指向最后一个提交更新A,而最后一个提交对象则存在一个指针指向前一次的提交更新Q。如果我们创建一个新的分支,child,它和master共同指向A,这时,
<div class="markdown_views"> <h1 id="一对一共享主键">一对一共享主键</h1> <p>下面我们直接通过实例来讲解共享主键配置: <br> 主键主控方:Article</p> <pre class="prettyprint"><code class="language-java hljs "><span class="hljs-key
<div class="markdown_views"> <p>在实际博客网站中,文章内容的数据量非常多,它会影响我们检索文章其它数据的时间,如查询发布时间、标题、类别的等。这个时候,我们可以尝试将文章内容存在另一张表中,然后建立起文章——文章内容的一对一映射</p> <p>一对一关联有两种方式,一种是外键关联,另一种是复合主键关联。</p> <h1 id="外键关联"
<div class="markdown_views"> <p>在SpringMVC中,我们会经常使用到拦截器,虽然SpringAOP也能帮我们实现强大的拦截器功能,但在Web资源供给上,却没有SpringMVC来得方便快捷。 <br> 使用SpringMVC拦截器的核心应用场景是根据我们的实际需求,个性化定制拦截器,再对特定url进行拦截处理。 <br> 而自定义拦截器,首先
<div class="markdown_views"> <p>在上两篇文章里,我们详细地分别讲解了一对多和多对一的单向关联配置的具体属性含义,在这一篇文章里,我们完成两者的的整合建立双向关联。 <br> 在实际的博客网站中,我们可能需要根据文章读取作者(用户)信息,但肯定也要让用户能获取自己的文章信息,针对这种需求,我们可以建立文章(多)对用户(一)的双向关联映射。 <br>
<div class="markdown_views"> <p>在博客网站中,我们可能需要从某一篇文章找到其所关联的作者,这就需要从文章方建立起对用户的关联,即是多对一的映射关系。 <br> 现在先看一个配置实例:我们的文章实体类</p> <pre class="prettyprint"><code class="language-java hljs "><span clas
<div class="markdown_views"> <p>在上一篇文章里,我们从端方向一端建立关联关系,完成了从文章到作者的关联关系建立,但在实际的博客网站中,用户肯定还需要获取自己所写的文章,这时可以建立用户(一)对文章(多)的单向关联映射。 <br> 先来看我们的一方配置实例</p> <pre class="prettyprint"><code class="lan
<div class="markdown_views"> <p>4# 混合使用多种视图技术。 <br> 在前面文章里,我们对jsp、json、xml个中视图都进行了较为详细的实例解析,但涉及到的都是单视图使用配置。在实际开发中,我们可能需要混合是使用多种视图技术。尤其是针对REST编程风格,我们可以通过<strong>一个URL、多种视图</strong>来切合REST风格的<
<div class="markdown_views"> <h1 id="1-模板视图">1. 模板视图</h1> <p>FreeMarkerViewResolver 、 VolocityViewResolver 这两个视图解析器都是 UrlBasedViewResolver 的子类。 FreeMarkerViewResolver 会把 Controller 处理方法返回的逻
<div class="markdown_views"> <p>为什么要说是“封装方法”呢?因为它帮我们封装好了底层的增删改查操作,直接调用相应方法即可灵活地操作我们数据库数据。它们由Session接口提供,下面我们通过实例一一分析这些方法。</p> <h2 id="1save方法">1.save方法</h2> <p><font color="blue">Session
<div class="markdown_views"> <p>在<a href="http://blog.csdn.net/qwe6112071/article/details/51044414"> 《springMVC4(7)模型视图方法源码综合分析》 </a>一文中,我们介绍了ModelAndView的用法,它会在控制层方法调用完毕后作为返回值返回,里面封装好了我们的业务
<div class="markdown_views"> <h1 id="状态类型">状态类型</h1> <p>在hibernate中,java对象的声明周期对应有4种状态:</p> <table> <thead><tr> <th>状态</th> <th>说明</th> </tr></thead> <tbody> <tr> <td>瞬时(Transient)</td>
<div class="markdown_views"> <h1 id="java对象在jvm中的存活条件">java对象在JVM中的存活条件</h1> <p>在java中,我们使用<code>User user = new User();</code>来创建一个java对象时,JVM会为其分配一块内存空间,此时,这个对象被变量“user”引用,那么它就会一直存在于内存中,而
<div class="markdown_views"> <h1 id="1-复杂对象参数绑定">1. 复杂对象参数绑定</h1> <p>对于普通的对象参数绑定,我们只需要对象成员变量名与请求参数名一一对应即可完成绑定。 <br> 而求对于组合对象,我们可以使用级联的方式来绑定方法参数。见下面实例: <br> 我们先定义两个POJO类:User,Article其中Atricl
<div class="markdown_views"> <h1 id="需求实例引入">需求实例引入</h1> <p>在实际开发中,我们会常常遇到需要对日期格式、数值格式进行转换的需求。在spring中,我们可以轻松通过注解的方式完成对数据的格式化处理,比如现在有个User POJO类: <br> package com.mvc.model;</p> <pre cla
<div class="markdown_views"> <p>在<a href="http://blog.csdn.net/qwe6112071/article/details/51049743">《springMVC4(9)属性编辑器剖析入参类型转换原理 》</a>一文中,我们通过分析Sping内置的属性编辑器来理解springMVC是如何完成请求参数到入参的类型的转换的
<p>Bean Validation 1.1当前实现是Hibernate validator 5,且spring4才支持。接下来我们从以下几个方法讲解Bean Validation 1.1,当然不一定是新特性:</p> <ol style="font-size:14px"> <li> 集成Bean Validation 1.1到SpringMVC</li> <li> 分组验证、分组顺序及
<div class="markdown_views"> <p>我们通过Http请求提交的参数都以字符串的形式呈现,但最终在springMVC的方法入参中,我们却能得到各种类型的数据,包括Number、Boolean、复杂对象类型、集合类型、Map类型等,这些都是springMVC内置的数据类型转换器帮我们完成的。springMVC的将请求数据绑定到方法入参的流程如下所示:</
<div class="markdown_views"> <p>使用@ModelAttribute、Model、Map、@SessionAttributes能便捷地将我们的业务数据封装到模型里并交由视图解析调用。下面开始一一分析</p> <h1 id="在方法入参上使用modelattribute">在方法入参上使用@ModelAttribute</h1> <p>使用@
<div class="markdown_views"> <p>在完整web开发中,springMVC主要充当了控制层的角色。它接受视图层的请求,获取视图层请求数据,再对数据进行业务逻辑处理,然后封装成视图层需要的模型数据,再将数据导向到jsp等视图界面。 <br> 在前面,我们通过对@RequestMapping和方法入参绑定的分析,完成了视图层->控制层的数据交接,然
<div class="markdown_views"> <h1 id="反射断言">反射断言</h1> <h2 id="反射对象断言">反射对象断言</h2> <p>在实际场景中,我们比较两个对象是否相等,可能会去选择重写equals方法去比较对象里的每一个属性,或者是直接将对象的属性一个个取出来比较,但这都比较麻烦,Unitils为我们提供了反射断言可直接完成这一任
<div class="markdown_views"> <p>在前面我们进行web测试,总要在游览器进行,数据组装、请求方法更给等都极为麻烦。 <br> RestTemplate是Spring提供的一个web层测试模板类,我们可以通过RestTemplate在客户端方便的进行web层功能测试。它支持REST风格的URL,而且具有AnnotationMethodHandlerA
<div class="markdown_views"> <h1 id="格式化数据输入输出">格式化数据输入输出</h1> <p>Spring3.0的重要接口:HttpMessageConveter为我们提供了强大的数据转换功能,将我们的请求数据转换为一个java对象,或将java对象转化为特定格式输出等。比如我们常见的从前端注册表单获取json数据并转化为User对象,或
<div class="markdown_views"> <p>在原生Servlet中,我们通过在doGet和doPost方法绑定web资源访问接口:HttpServletRequest和HttpServletResponse到入参来进一步通过request.getParameter()等方法获取我们的web资源。在SpringMVC中,我们一样可以将HttpServletRe
<div class="markdown_views"> <p>在springMVC的控制器中,我们常使用@RequestMapping来完成我们的请求映射,我们可以在类定义上和方法定义上使用注解,其配置的路径将为类中定义的所有方法的父路径,如上篇实例中的/user(类)/hello(方法)。 <br> 一般的,我们类定义上的路径注解起到命名空间的作用,防止不同方法的路径映射产
<div class="markdown_views"> <p>在一个web项目中,典型的MVC架构将后台分为Controller、Service、DAO三层,分别实现不同的逻辑功能,下面是一个web请求过程中,我们后台的处理过程:</p> <div class="sequence-diagram"><svg style="overflow: hidden; positi
<div class="markdown_views"> <h1 id="generatedvalue基本注解类型">@GeneratedValue基本注解类型</h1> <p>在上一篇文章中,我们讲到了JPA使用@GeneratedValue注解来定义生成策略,而关于注解生成策略有4种基本支持类型: <br> 1. GenerationType.TABLES 当前主键的值
<div class="markdown_views"> <p>在另一篇文章<a href="http://blog.csdn.net/qwe6112071/article/details/51010652">hibernate5(2)初入门配置实例</a>中,我们针对hibernate5.1版本的崭新引导配置方法,完成了对数据库的的插入实例操作,在本节内容中,我们开始引入sp
<div class="markdown_views"> <h1 id="入门实例向数据库插入一个对象">入门实例:向数据库插入一个对象</h1> <h2 id="1-第一步需要引入我们的jar包推荐使用maven管理项目直接在pomxml中添加">1. 第一步需要引入我们的jar包,推荐使用maven管理项目,直接在pom.xml中添加</h2> <pre cla
<div class="markdown_views"> <p>在hibernate5中,有了一些新的变动:</p> <ul> <li>新引导 API</li> <li>Spatial/GIS 支持</li> <li>Java 8 支持</li> <li>扩展 AUTO id 生成支持</li> <li>命名策略分离</li> <li>属性转换器支持</li> <li>更好的
<div class="markdown_views"> <p>在<a href="http://blog.csdn.net/qwe6112071/article/details/50989192">《Quartz任务调度(3)存储与持久化操作配置详细解析 》</a>一文中,我们通过配置quartz.properties属性文件实现了Quartz的数据库持久化操作。现在整合sp
<div class="markdown_views"> <p>在我们的另一个专栏<a href="http://blog.csdn.net/column/details/quartz.html">《深入浅出Quartz任务调度》</a>详细的讲解了使用Quartz适用于从普通门户至网站企业级系统的任务调度实现方法。在下面我们结合实例来完整spring和quartz的整合工作,
<div class="markdown_views"> <h1 id="quartz框架需求引入">Quartz框架需求引入</h1> <p>在现实开发中,我们常常会遇到需要系统在特定时刻完成特定任务的需求,在<a href="http://blog.csdn.net/qwe6112071/article/details/50962613">《spring学习笔记(14)引
<div class="markdown_views"> <h1 id="schedulerlistener">schedulerListener</h1> <p>在我们的监听器实现类中,这个类中需实现的方法很多,不需要的可以给出空实现,下面是一些常用的用法:</p> <table> <thead><tr> <th>方法</th> <th>说明</th> </tr></
<div class="markdown_views"> <h1 id="triggerlistener">TriggerListener</h1> <p>在我们的触发器监听器中,也包含了一系列监听方法</p> <table> <thead><tr> <th>方法</th> <th>说明</th> </tr></thead> <tbody> <tr> <td>getNa
<div class="markdown_views"> <p>在<a href="http://blog.csdn.net/qwe6112071/article/details/50966660">《spring学习笔记(15)趣谈spring 事件:实现业务逻辑解耦,异步调用提升用户体验》</a>我们通过实例分析讲解了spring的事件机制,或许你会觉得其中的配置略显繁琐,
<div class="markdown_views"> <h1 id="cron表达式">Cron表达式</h1> <h2 id="1-时间字段与基本格式">1. 时间字段与基本格式</h2> <p>Cron表达式有6或7个空格分割的时间字段组成:</p> <table> <thead><tr> <th>位置</th> <th>时间域名</th> <th>允
<div class="markdown_views"> <h1 id="内存存储ramjobstore">内存存储RAMJobStore</h1> <p>Quartz默认使用RAMJobStore,它的优点是速度。因为所有的 Scheduler 信息都保存在计算机内存中,访问这些数据随着电脑而变快。而无须访问数据库或IO等操作,但它的缺点是将 Job 和 Trigger 信
<div class="markdown_views"> <p>在上一篇文章中,我们使用了声明式事务来配置事务,使事务配置从service逻辑处理中解耦出来。但它还存在一些缺点: <br> 1. 我们只针对方法名的特定进行拦截,但无法利用方法签名的其它信息定位,如修饰符、返回值、方法入参、异常类型等。如果我们需要为同名不同参的同载方法配置不同事务就会出问题了。 <br> 2.
<div class="markdown_views"> <p>在上一节内容中,我们使用了编程式方法来配置事务,这样的优点是我们对每个方法的控制性很强,比如我需要用到什么事务,在什么位置如果出现异常需要回滚等,可以进行非常细粒度的配置。但在实际开发中,我们可能并不需要这样细粒度的配置。另一方面,如果我们的项目很大,service层方法很多,单独为每个方法配置事务也是一件很繁琐的
<div class="markdown_views"> <h1 id="访问数据库事务导入">访问数据库事务导入</h1> <p>在我之前的文章<a href="http://blog.csdn.net/qwe6112071/article/details/50976354">《spring学习笔记(19)mysql读写分离后端AOP控制实例》</a>中模拟数据库读写分离的
<div class="markdown_views"> <p>在这一篇文章中,我们要用JNDI访问我们的应用服务器配置好的<strong>多数据源</strong>。在本实例中,我们使用本地的tomcat服务器来模拟远程服务器,由于本地只有mysql数据库,故通过访问不同的mysql数据库不同database来模拟同时访问不同数据库如mysql和oracle等。 <br> 下
<div class="markdown_views"> <p>在这里,我们接上一篇文章,利用JNDI访问应用服务器配置的两个数据源来模拟同时操作不同的数据库如同时操作mysql和oracle等。实际上,上个例子可能用来模拟mysql数据库主从配置读写分离更贴切些。既然如此,在本例中,我们就完成读写分离的模拟在web端的配置实例。</p> <p>续上次的例子,关于JNDI数据
<div class="markdown_views"> <h1 id="数据连接池">数据连接池</h1> <p>在spring中,常使用数据库连接池来完成对数据库的连接配置,类似于线程池的定义,数据库连接池就是维护有一定数量数据库连接的一个缓冲池,一方面,能够即取即用,免去初始化的时间,另一方面,用完的数据连接会归还到连接池中,这样就免去了不必要的连接创建、销毁工作,提升
<div class="markdown_views"> <h1 id="cglib动态代理基本原理">CGLib动态代理基本原理</h1> <p>CGLib——Code Generation Library,它是一个动态字节代码生成库,基于asm。使用CGLib时需要导入asm相关的jar包。而asm又是何方神圣?</p> <blockquote> <p>asm是一个
<div class="markdown_views"> <h1 id="jdk动态代理技术">JDK动态代理技术</h1> <p>动态代理最常见应用是AOP(面向切面编程)。通过AOP,我们能够地拿到我们的程序运行到某个节点时的方法、对象、入参、返回参数,并动态地在方法调用前后新添一些新的方法逻辑,来满足我们的新需求,比如日志记录等。 <br> 动态代理常见有两种方式:基于
<div class="markdown_views"> <p>上一篇我们使用到的ApplicationListener是无序的,结合异步调度它能满足了我们的大部分应用场景,但现在我们来个另类的需求,我们来模拟一条<strong>作业调度流水线</strong>,它不能异步,必须按照先后次序执行不同的任务才能得到我们的最终结果。 <br> 需求示例:现在假如华中科技大学的小白想
<div class="markdown_views"> <h1 id="分析需求引入事件机制">分析需求引入事件机制</h1> <p>使用spring的事件机制有助于对我们的项目进一步的解耦。假如现在我们面临一个需求: <br><strong>我需要在用户注册成功的时候,根据用户提交的邮箱、手机号信息,向用户发送邮箱认证和手机号短信通知。传统的做法之一是在我们的UserSe