JDK,cglib动态代理-AOP学习

8.利用动态代理模式重构hibernate

动态代理模式:

1、产生的代理对象和目标对象实现了共同的接口

jdk动态代理

2、代理对象是目标对象的子类

hibernate: Person person = session.load(Person.class,1L);  javassisit

spring:cglib动态代理

jdk的动态代理:

1、因为是用jdk的API做到的

2、代理对象是动态产生的

cglib产生的代理类是目标类的子类

注意事项:

1、拦截器中invoke方法体的内容就是代理对象方法体的内容

2、当客户端执行代理对象.方法时,进入到了拦截器的invoke方法体

3、拦截器中invoke方法的method参数是在调用的时候赋值的

例子

存入数据库的person

public class Person implements Serializable{

private Long pid;

private String pname;

private String psex;

set,get方法}

 

接口PersonDao

public interface PersonDao {

public String savePerson(Person person);}

 

hibernate工具类

public class HibernateUtils {

public static SessionFactory sessionFactory;

static{

Configuration config = new Configuration();

config.configure("/proxy/cn/itcast/jdkproxy/hibernate/hibernate.cfg.xml");

sessionFactory = config.buildSessionFactory();}}

 

实现类PersonDaoImpl

public class PersonDaoImpl extends HibernateUtils implements PersonDao{

public String savePerson(Person person) {

sessionFactory.getCurrentSession().save(person);

return "save a person";

}

 

事务切面Transaction

public class MyTransaction extends HibernateUtils{

private Transaction tran;

public void beginTran(){

    this.tran = sessionFactory.getCurrentSession().beginTransaction();}

public void commit(){

this.tran.commit();}}

 

hibernate映射文件

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<!-- 用来描述一个持久化类 name 类全名     table 表名,默认值和类名一样 catalog 数据库名称,一般不写    -->

<class name="proxy.cn.itcast.jdkproxy.hibernate.Person">

<!-- 标示属性  和数据库中的主键对应    name  属性的名称  column 列的名称  -->

<id name="pid" column="pid" length="200" type="java.lang.Long">

<!-- 主键的产生器   就该告诉hibernate容器用什么样的方式产生主键   -->

<generator class="increment"></generator></id>

<!-- 描述一般属性 -->

<property name="pname" column="pname" length="20" type="string"></property>

<property name="psex" column="psex" length="10" type="java.lang.String"></property>

</class>

</hibernate-mapping>

 

拦截器

public class PersonDaoInterceptor implements InvocationHandler{

private Object obj;

private MyTransaction myTran;

public PersonDaoInterceptor(Object obj,MyTransaction myTran){

this.obj = obj;

this.myTran = myTran;}

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

this.myTran.beginTran();

Object obj = method.invoke(this.obj, args);

this.myTran.commit();

return obj;}}

 

测试类

 

public class ProxyTest {

@Test

public void test1(){

Object obj = new PersonDaoImpl();

MyTransaction myTran = new MyTransaction();

PersonDaoInterceptor interceptor= new PersonDaoInterceptor(obj, myTran);

PersonDao pdao = (PersonDao) Proxy.newProxyInstance(obj.getClass().getClassLoader(),                    obj.getClass().getInterfaces(), interceptor);

Person person = new Person();

person.setPname("pengya");

person.setPsex("female");

String s = pdao.savePerson(person);

System.out.println(s);

}

}

8.cglib的动态代理

cglib产生的代理类是目标类的子类

1.拦截器实现net.sf.cglib.proxy.MethodInterceptor;

2.代码加强机制-生成代理对象

public Object createProxy(){

Enhancer enhancer = new Enhancer();

enhancer.setCallback((Callback) this);

enhancer.setSuperclass(this.target.getClass());

return enhancer.create();

}

3.覆盖intercept方法

@Override

public Object intercept(Object obj, Method method, Object[] obj2,

MethodProxy methodproxy) throws Throwable {

for(Interceptor interceptor : interceptors){

interceptor.interceptor();

}

method.invoke(this.target, obj2);

return null;

}

4.测试类

SalaryInterceptor salaryinterceptor = new SalaryInterceptor(target, list);

SalaryManager sm = (SalaryManagerImpl) salaryinterceptor.createProxy();

sm.showSalary();


时间: 2024-08-10 00:03:09

JDK,cglib动态代理-AOP学习的相关文章

Java代理之(jdk静态代理/jdk动态代理/cglib动态代理/aop/aspectj)

一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法.如果公司卖多少钱,代理商也卖多少钱,那么代理商就赚不了钱.所以代理商在调用公司的卖方法后,加上自己的利润然后再把产品卖给客户.而客户部直接跟公司打交道,或者客户根本不知道公司的存在,然而客户最终却买到了产品. 专业点说:代理模式是对象的结构型模式,代码模式给某一个对象提供代理,并由代理对象控制原对象

JDK / CGLIB 动态代理

1.JDK 的动态代理:针对实现了接口的类产生代理 (Proxy+InvocationHandler)2.Cglib 的动态代理 :针对没有实现接口的类产生代理. 应用的是底层的字节码增强的技术生成当前类的子类对象 (MethodInterceptor) -- Cglib是一种代码生成包 如上图:最底层是字节码,是JVM跨平台产生的虚拟指令格式(区别机器码) 字节码之上是ASM,是直接操作字节码的框架    ASM之上是Cglib等,它们可以通过ASM框架生成字节码 原文地址:https://w

Java学习之:JDK动态代理与CGLIB动态代理

代理的概念:简单的理解就是通过为某一个对象创建一个代理对象,我们不直接引用原本的对象,而是由创建的代理对象来控制对原对象的引用. 动态代理:是指在程序运行时由Java反射机制动态生成,无需手动编写代码.动态代理不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java反射机制可以生成任意类型的动态代理类. 代理原理:代理对象内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作

Spring AOP详解 、 JDK动态代理、CGLib动态代理

AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就成为“连接点”,Spring仅支持方法的连接点,即

Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)

一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法.如果公司卖多少钱,代理商也卖多少钱,那么代理商就赚不了钱.所以代理商在调用公司的卖方法后,加上自己的利润然后再把产品卖给客户.而客户部直接跟公司打交道,或者客户根本不知道公司的存在,然而客户最终却买到了产品. 专业点说:代理模式是对象的结构型模式,代码模式给某一个对象提供代理,并由代理对象控制原对象

【Spring】AOP之JDK动态代理和CGLib动态代理

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.JAVA动态代理  1.1 代理模式         代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创

【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类

spring aop原理 JDK动态代理和CGLIB动态代理

Spring的两大特性是IOC和AOPIOC负责将对象动态的注入到容器,从而达到一种需要谁就注入谁,什么时候需要就什么时候注入的效果.理解spring的ioc也很重要.但是今天主要来和大家讲讲aop.AOP 广泛应用于处理一些具有横切性质的系统级服务,AOP 的出现是对 OOP 的良好补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理.日志.缓存等等. AOP实现的关键在于AOP框架自动创建的AOP代理.AOP代理主要分为静态代理和动态代理, 静态代理的代表为AspectJ:动态代理则

Spring AOP中的JDK和CGLib动态代理哪个效率更高?

一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理,另一种是CGLib的方式. 自Java 1.3以后,Java提供了动态代理技术,允许开发者在运行期创建接口的代理实例,后来这项技术被用到了Spring的很多地方. JDK动态代理主要涉及java.lang.reflect包下边的两个类:Proxy和InvocationHandler.其中,Invoc