随笔分类 - JAVA
Maven重复类的解决
摘要:1. 设置仓库,我的Settings里设置使用了公司的Nexus D:\mavenrepo snapshots snapshots xxx 664 775 releases xxx Nexus Releases xxxx false snapshots ...
阅读全文
Java IO 体系结构
摘要:参考文章地址:http://blog.csdn.net/oracle_microsoft/article/details/2634231Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系2. 原始处理器(适配器)与链接流处理器(装饰器)其结构图如下:InputStream-OutputStream体系Reader-Writer体系1. 基类InputStream与OutputStream是所有字节型输入输出流的
阅读全文
建造者模式(Builder)
摘要:建造者模式是对象创建型设计模式之一,他主要用于构造复杂对象,而这个复杂对象则可以由多组不同的产品族构成,其结构原理图如下:其中关键部件有两个1. BuilderBuilder定义了生产复杂对象的组件的抽象接口(BuildPart)和获取这个复杂对象的方法(GetResult),但他自己本身并不装配对象,简言之Builder是生成复杂对象部件的接口提供者2. DirectorDirector定义了装配复杂对象的接口,它使用Builder提供的生产复杂对象组件的方法来生成组件,并将其装配起来,最后调用GetResult返回该复杂对象例子:ComponentBody组件族public abstrac
阅读全文
利用MyBatis的动态SQL特性抽象统一SQL查询接口
摘要:1. SQL查询的统一抽象MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射的方法构造多查询参数.在遇到多属性参数(例如order by,其参数包括列名,升序降序类型,以及可以多个列及升降序类型凭借在order by之后)无法使用简单的key-value表示时,可以将参数单独抽象为一个类.将要用到的beanpackage com.xxx.mybatistask.bean;import com.xxx.mybatistask.support.jsonSerializer.Js
阅读全文
MyBatis 物理分页
摘要:MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据offset和limit截断记录返回为了在数据库层面上实现物理分页,又不改变原来MyBatis的函数逻辑,可以编写plugin截获MyBatis Executor的statementhandler,重写SQL来执行查询参考资料:http://blog.csdn.net/hupanfeng/article/details/9265341下面的插件代码只针对MySQLplugin代码package plugin;import java.sql.Connection;import java.sql.P
阅读全文
MyBatis Lazy Loading
摘要:MyBatis的Lazy Loading可以实现延迟查询Bean里的嵌套成员类,控制lazy loading的属性有lazyLoadingEnabled: lazy loading开关,默认为trueaggressiveLazyLoading: 侵略性 lazy loading 开关, 默认为true, 这个属性比较搞笑,如果为true则当你访问任何一个属性都会加载所有的其他lazy load属性,即使你根本没有调用哪个lazy load属性,说白了就是aggressiveLazyLoading=true,则lazy load等于没用,所以要使用lazy load还是将其设为false一个使用
阅读全文
DAO,Service接口与实现类设计
摘要:DAO接口为每个DAO声明接口的好处在于1. 可以在尚未实现具体DAO的时候编写上层代码,如Service里对DAO的调用2. 可以为DAO进行多实现,例如有JDBCDAO实现,MyBatisDAO实现,而不需要更改上层代码,只需要简单的在Spring的IoC配置里修改一下注入的DAO实现Service接口1. 可以在尚未实现具体Service情况下编写上层改代码,如Controller对Service的调用2. Spring无论是AOP还是事务管理的实现都是基于动态代理的,而动态代理的实现依赖于接口,所以必须有接口的定义才能使用这些功能3. 可以对Service进行多实现总的来说,接口的优势
阅读全文
MyBatis 缓存
摘要:MyBatis缓存分为一级缓存和二级缓存一级缓存MyBatis的一级缓存指的是在一个Session域内,session为关闭的时候执行的查询会根据SQL为key被缓存(跟mysql缓存一样,修改任何参数的值都会导致缓存失效)1)单独使用MyBatis而不继承Spring,使用原生的MyBatis的SqlSessionFactory来构造sqlSession查询,是可以使用以及缓存的,示例代码如下public class Test { public static void main(String[] args) throws IOException { String conf...
阅读全文
MyBatis 查询示例
摘要:环境搭建数据库schema1)datasource.xml配置 2.applicationContext.xml --> 3. log4j.propertie...
阅读全文
从原型模式(Prototype Pattern)到 Clone
摘要:前面提到抽象工厂的实现,这里说说抽象工厂的原型实现,与工厂方法的实现不同,原型实现有他自己的优点和缺点原型的优点:1. 效率:clone是native方法,比new的效率高,当使用复杂循环嵌套对象是尤为明显2. 不需要为每一个新增的product创造一个具体factory缺点:1. 如果需要深复制,则需要手写所有包含循环引用对象的类的clone方法,因为需要手动在clone方法里对引用对象进行clone,否则是浅复制2. 当需要改变一个克隆实例内部的值时,由于clone方法是无参方法,只能在clone完以后手动调用改变值得方法,且如果这个值是一个类的引用,则克隆应该建立在深复制的前提下,否则会
阅读全文
抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
摘要:在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实例化这个对象,好处就是客户端并不知道这个实例化的对象的实际实现,从而可以将这个对象随意替换成我们需要的不同实现工厂方法(Factory Method)概念:定义一个用于创建对象的接口,让子类决定实例化哪个类.它使一个类的实例化延迟到其子类结构图:抽象工厂(Abstract Factory)概念: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类.结构图:单例模式(Singleto
阅读全文
Spring Security
摘要:Spirng Security主要涵盖的方面有1. 登录验证管理,包括登录成功后保存用户信息到Session2. URL级别和Controller方法级别的访问控制3. 对于访问控制采取的授权管理方法,包括用户授权和用户组授权下面是例子security-config.xml (权限验证失败回到登录页面) (权限验证失败弹框) (提供登出链接) --> --> ...
阅读全文
Spring Validation
摘要:Spring Validation模块用于表单数据验证配置,示例如下依赖Jar包 javax.validation validation-api org.hibernate hibernate-validator Controller方法 /** * 添加酒店 * @param hotel * @param bindingResult * @return */ @RequestMapping(v...
阅读全文
Spring REST
摘要:示例实现1. 请求REST接口返回类转换的JSON或XML数据2. POST JSON数据到REST接口自动转为类数据服务端Beanpackage com.qunar.bean;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlRootElement;/** * Created with IntelliJ IDEA. * User: zhenwei.liu * Date: 13-7-
阅读全文
Spring 远程服务
摘要:稍微看了一下Spring的远程服务章节,讲到了RMI,Hessian,Burlap,Http invoker以及JAX-WS1.RMI原理:1)在Spring服务端使用RmiServiceExporter将一个Spring bean包装在RMI的适配器里,并将这个适配器注册到服务端的RMI服务的ip和端口上,注册RMI服务2)在客户端则使用一个代理工厂生成一个代理对象负责与远程的RMI服务进行通信,这个代理对象当做本地pojo这样使用缺点:1)由于使用任意端口交互,难以穿越防火墙2)RMI基于Java,它使用了Java的序列化机制,因此服务端和客户端之间传输的对象必须保证是相同版本2.Hess
阅读全文
Spring 事务管理
摘要:1.事务管理器的声明 2. 编码式事务管理 /** * 编码型事务测试 */ public void killUser(final int userId) { txTemplate.execute(new TransactionCallback() { @Override public Object doInTransaction(TransactionStatus transactionStatus) { ...
阅读全文
Spring AOP
摘要:Spring AOP 可以使用XML 配置方式和注解方式而AOP的类型有如下三种1. 显示声明前置后置AOP方法2. 环绕AOP方法3. 使用接口扩展已知类以下是各种类型示例applicationContext.xml示例 ...
阅读全文
ContextLoaderListener 与 ServletDispatcher
摘要:网上找了一下关于ContextLoaderListener和ServletDispatcher的解释,这是原文http://simone-folino.blogspot.com/2012/05/dispatcherservlet-vs.htmlhttp://syntx.co/languages-frameworks/difference-between-loading-context-via-dispatcherservlet-and-contextloaderlistener/总结如下:Spring中有两种上下文环境-"Application Context和Web Applica
阅读全文
Spring Bean 注入 2 注解篇
摘要:1. 自动装配注解配置applicationContext.xml开启注解 注解使用示例 /** Value 注解可以使用SpEL,对基本数据类型完成注入 */ @Value("#{americanA.getName}") public void setName(String name) { this.name = name; } /** * Autowired表示使用byType自动装配该属性,他除了用在set方法也可以用在其他方法 * required属性表示可以允许找不到匹配的bean,而将该属性置为nul...
阅读全文
<%@ include> <jsp:include>
摘要:1.这个效果是将引入的文件内容直接加入当前JSP然后再编译,会造成的问题就是如果引入的页面中也写了head,contentType之类的东西,就会造成重复,从而出错那么在实际应用场景中,可以使用它来引入一些页面中公共的小段内容,例如引入css时后面用include引入css的版本号2.这个效果是将引入的jsp执行之后,将执行结果引入到当前jsp的结果当中,所以引入的页面需要有自己独立的head和footerflush参数表示是否要在缓冲区满了以后再将内容刷新出来,true表示直接输出,不等待缓冲区充满实际应用中,一般用来引入页面内独立的模块,他们可以有自己的页面配置
阅读全文
浙公网安备 33010602011771号