`
文章列表
最近遇见一个问题,即调用一个集合(只存放类A的对象)的toArray()方法变成Object[]数组,最后将它转换成A[]时抛出类型转换异常。不知道为什么不能转换成功。 最后了解到,集合的toArray方法有两个,一种就是Object[] toArray(),另 ...
先来看下下报纸和杂志的订阅: (1)报社:出版报纸和杂志 (2)订阅者:向某家报社订阅报纸和杂志,只要报社出版了新的报纸,订阅者就会收到最新的报纸和杂志。 (3)报社具有添加和删除订阅者的功能(其实应该是订阅者具有订阅和退订的功能,这个主动权应该是订阅者而不是报社,报社也应该对外开放这样的方法) 下面就让我们来简单实现上述的描述: 报社:PublishingHouse 如下: package com.lg.design.obser; import java.util.ArrayList; import java.util.List; public class Publishin ...
Session接口方法主要有save、persist、load、get、update、saveOrUpdat、merge、delete等,这里主要是对我看hibernate书籍的一个实践加总结。 首先是save()方法: 以之前的Customer和Order为例,看下类文件: public class Customer { private Long id; private String name; private String email; private Timestamp registeredTime; private Set<Order> orde ...
以Person类和IDCard类为例,这里仅仅说一种一对一关联关系,即Person类拥有IDCard,但是IDCard不含Person类,数据库库的表如下: CREATE TABLE `hibernate`.`person` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(45) NULL, `age` INT NULL, `idcard_id` INT NULL, PRIMARY KEY (`id`)); CREATE TABLE `hibernate`.`idcard` ( `id` INT ...
以Teacher和Student为例,他们之间是多对多的关系。 手动创建的数据库的三张表为,teacher、student、teacher_student。分别如下: CREATE TABLE `teacher` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `student` ( `id` int(11) NOT NULL ...
上一篇文章介绍了基本知识后,本篇该介绍下现实中的一对多的关联关系。如Customer和Order,一个Customer可以拥有多个Order,每个Order只属于一个Customer。这样就存在几种表示形式,可以分为单向关联和双向关联。 形式1:Order拥有一个Customer引用,这种属于单向关联 形式2:Customer拥有Order的集合,这种也属于单向关联 形式3:Order拥有一个Customer引用,同时Customer拥有Order集合,这种属于双向关联 先来说说形式1:Order拥有一个Customer引用 Customer还是上一篇文章的形式: public class ...
最近开始学习hibernate,然后就想把这个学习历程总结下来。还是打算主要分两个过程,第一个过程:学会使用hibernate,第二个过程:做一些源码分析,更加深入的理解。 言归正传,开始入门案例,这里的入门案例不牵扯其他框架,所以一开始学习的时候尽量不要牵扯其他框架,如SpringMVC。如果入门时牵涉其他框架,有时候会搞不清楚hibernate和其他框架的责任机制,本工程虽然搭建的是SpringMVC项目,主要是为后来服务,但是目前几乎用不到: hibernate有两种配置文件,一种就是像jdbc那样连接数据库的配置文件,另一种就是domain类和数据库表之间的映射文件。 第一种配置文件 ...
SpringAOP要注意的地方有很多,下面就举一个,之后想到了再列出来: (1)SpringAOP对于最外层的函数只拦截public方法,不拦截protected和private方法,另外不会对最外层的public方法内部调用的其他方法也进行拦截,即只停留于代理对象所调用的方法。如下案例: B类有两个public方法,foo1()和foo2(),foo1内部调用了foo2,简单如下: public void foo2() { System.out.println("foo2"); } public void f ...
这篇文章里面就要说说Spring自己的AOP,搞清楚哪种方式是Spring自己实现的AOP,哪种方式是Spring引入aspectj的AOP。 Spring自己的AOP实现在于ProxyFactoryBean。先看下使用案例(仍和之前的案例是一样的):接口AService、实现类AServiceImpl、通知MyBeforeAdvice public interface AService { public void fooA(String _msg); public void barA(); } public class AServiceImpl ...
本篇文章主要对Spring AOP配置背后进行了哪些事情做下说明。还是如上类似的工程,在xml中AOP拦截配置如下: <bean id="aspectBean" class="com.lg.aop.TestAspect" /> <aop:config expose-proxy="false" proxy-target-class="false"> <aop:aspect id="TestAspect" ref="aspe ...
上一篇文章介绍了Spring AOP的JDK动态代理的过程,这一篇文章就要介绍下Spring AOP的Cglib代理过程,仍然是使用上一篇文章的工程案例。 JDK动态代理是由JdkDynamicAopProxy来生成代理对象的,Cglib则是由CglibAopProxy来生成代理对象的。JdkDynamicAopProxy、CglibAopProxy实现了AopProxy接口,如下: public interface AopProxy { Object getProxy(); Object getProxy(ClassLoader classLoader); } ...
本篇文章将会介绍上一个例子中的源码执行情况,从中熟悉整个SpringAOP的一些概念和接口设计。 首先整个SpringAOP的分两大过程。 第一个过程:根据xml文件或者注解中配置的拦截信息,生成相应的代理对象,这个代理对象包含了对应的拦截器。 第二个过程:执行所拦截的方法时,就是调用代理对象的执行逻辑,完成各种拦截。 本文章先对第二个过程进行源码解析。 对第一个过程先做简单概述,如果拦截的类的对应方法是接口方法,则使用JDK的Proxy进行代理对象的创建否则使用CGLIB进行代理对象的创建。 本工程采用的之前文章所给出案例链接:http://www.iteye.com/topic/336 ...
本文章对一些SpringAOP的接口设计进行下介绍,主要是区分三者的关系,AOP联盟、Aspectj、SpringAOP所做的工作。 主要内容: (1)Advice接口设计 (2)MethodInterceptor接口设计 (3)Advisor和Pointcut接口设计 第一个:Advice接口设计 Advice:AOP ...
本篇是介绍java实现代理对象的两种方法,JDK动态代理和CGLIB。 JDK动态代理:针对你所调用的方法是接口所定义的方法。动态的创建一个类,通过实现目标类的接口来实现代理。 CGLIB:没有限制。通过继承目标类来创建代理类,实现代理。 下面看案例: 案例一,JDK动态代理: Person和Animals都实现了Say接口sayHello方法。现在就需要对他们的sayHello方法进行拦截。 Say接口如下: public interface Say { public void sayHello(); } Person类如下: package com.lg.aop.ba ...
ThreadLocal设计模式使用的也很频繁,会经常在各大框架找到它们的踪影,如struts2以及最近正在看的SpringAOP等。 ThreadLocal设计模式也有很多误解,我的理解是 (1)ThreadLocal所操作的数据是线程间不共享的。它不是用来解决多个线 ...
Global site tag (gtag.js) - Google Analytics