`
ponlya
  • 浏览: 164380 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Spring3笔记之 AOP Cglib 代理

阅读更多

JDK的Proxy实现代理要求被代理的目标对象必须实现一个接口,而如果目标对象没有实现接口则不能使用Proxy来代理。不过我们也可以借助cglib来实现代理,这样目标对象不必实现接口.

要代理的对象:com.spring305.test.aopCglib.UserDao.java

public class UserDao {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public UserDao(String name) {
		this.name = name;
	}

	public UserDao() {
		// TODO Auto-generated constructor stub
	}

	public void print1() {
		System.out.println(UserDao.class.toString() + " print1()");
	}

	public void print2() {
		System.out.println(UserDao.class.toString() + " print2()");
	}
}

 

 com.spring305.test.aopCglib.CglibFactory.java

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

public class CglibFactory implements MethodInterceptor {

	private Object target;

	public Object createUserDao(Object target) {
		this.target = target;
		//用enhancer类来创建代理对象
		Enhancer enhancer = new Enhancer();
		//设置父类,即为目标类
		enhancer.setSuperclass(this.target.getClass());
		// cglib创建的代理对象,其实就是继承了要代理的目标类,然后对目标类中所有非final方法进行覆盖,但在覆盖方法时会添加一些拦截代码。
		// 注册回调器,回调下面intercept
		enhancer.setCallback(this); 
		//返回创建的代理对象
		return enhancer.create();
	}

	@Override
	//参数依次代表:代理对象本身,被拦截到的方法,方法的参数,方法的代理对象
	//切面,指横切性关注点的抽象,与类相似,但是两者的关注点不同,类是对物体特征的抽象
	//连接点:指那些被拦截到的点,spring只支持方法类型的连接点
	//切入点:指我们要对连接点进行拦截的定义
	//通知:拦截到连接点后做的事情即为通知
	//Target,目标对象:代理的目标对象
	//织入:将aspectJ应用到target对象,并导致proxy对象创建的过程
	//引入:在不修改类代码前提下,引入可以在运行期为类动态地添加一些方法或者field
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {//环绕通知
		UserDao udi = (UserDao) target;
		Object result = null;
		if (udi.getName() != null) {
			// 前置通知 advice()
			try {
				result = methodProxy.invoke(target, args);
				// 后置通知 afterAdvice()
			} catch (Exception e) {
				e.printStackTrace();
				// 例外通知 exceptionAdvice
			} finally {
				// 最终通知  finalyAdvice
			}
		}
		return result;
	}
}

 测试:

@Test
	public void cglibTest(){
		CglibFactory test = new CglibFactory();
		//UserDao dao = (UserDao)test.createUserDao(new UserDao());
		UserDao dao = (UserDao)test.createUserDao(new UserDao("aa"));
		dao.print1();
		dao.print2();
	}

 

分享到:
评论

相关推荐

    spring源码--AOP流程--笔记.docx

    Spring AOP 源码分析笔记 Spring AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发者 modularize cross-cutting concerns,即将横切关注点模块化。AOP 使得开发者可以将一些公共的功能模块化,以便在...

    spring aop 学习笔记

    - **动态代理**:Spring AOP主要使用JDK动态代理和CGLIB实现。如果目标类实现了接口,使用JDK动态代理;否则,使用CGLIB生成子类作为代理。 - **切点(Pointcut)**:定义连接点的筛选规则,通过表达式或注解来...

    Spring AOP IOC源码笔记.pdf

    Spring AOP基于代理实现,可以使用接口代理(JDK动态代理)或类代理(CGLIB)。 7. CGLIB: CGLIB是Spring AOP默认的代理库,用于生成目标类的子类,从而实现方法拦截。当目标类没有实现接口时,Spring会使用CGLIB...

    Spring学习笔记(14)----使用CGLIB实现AOP功能

    在本篇Spring学习笔记中,我们将探讨如何使用CGLIB库来实现AOP功能。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它被广泛用于动态代理和运行时织入AOP切面。在Spring中,如果目标类没有...

    SpringAop学习笔记以及实现Demo

    **Spring AOP 学习笔记及实现Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的...

    SSH笔记-AOP

    SSH笔记主要围绕的是Spring框架中的AOP(面向切面编程)特性进行讲解,结合了动态代理和基于注解的配置方式。AOP是Spring框架的一个重要组成部分,它提供了一种模块化和解耦代码的方式,使得我们可以将关注点分离到...

    学习Spring笔记_AOP_Annotation实现和XML实现

    这篇“学习Spring笔记_AOP_Annotation实现和XML实现”主要探讨了如何在Spring中利用注解和XML配置来实现AOP的概念。 AOP,全称Aspect-Oriented Programming,是一种编程范式,旨在将关注点分离,让开发者可以更专注...

    Spring AOP源码笔记

    【Spring AOP源码笔记】 Spring AOP是Spring框架的核心组件之一,它实现了面向切面编程(Aspect-Oriented Programming,简称AOP),允许开发者定义“切面”,这些切面可以封装横切关注点,如日志记录、事务管理等。...

    spring学习笔记(十三)

    【标题】"Spring学习笔记(十三)"主要涉及的是Spring框架中的AOP(面向切面编程)部分,特别是关于CGLIB动态代理的实现。在Spring中,AOP是一种强大的编程模型,它允许开发者定义“切面”,即关注点的模块化,如日志...

    Spring_AOP笔记Spring_AOP笔记

    - **动态代理**:在运行时创建,Spring支持JDK动态代理和CGLIB动态代理,可以为任何类创建代理,即使它没有实现接口。 在Spring AOP中,配置切面主要是在`applicationContext.xml`配置文件中完成,或者使用注解式...

    spring学习笔记(十四)

    综上所述,这个学习笔记可能详细讲解了Spring AOP的概念、实现方式,特别是CGLIB代理的工作原理,并且提供了一个实际的测试案例,帮助读者深入理解并掌握这些技术。通过学习这部分内容,开发者可以更好地利用Spring ...

    Spring学习笔记(15)----使用Spring的注解方式实现AOP

    在本篇Spring学习笔记中,我们将深入探讨如何利用Spring框架的注解方式来实现面向切面编程(AOP)。AOP是一种编程范式,它允许我们定义横切关注点,如日志、事务管理等,然后将这些关注点模块化并插入到应用程序的多...

    Spring学习笔记(13)----动态代理模式分析演示

    在本篇Spring学习笔记中,我们将深入探讨动态代理模式,并结合Spring框架的实现进行分析演示。动态代理模式是Java编程中一种重要的设计模式,它允许我们在不修改原对象代码的情况下,为对象添加额外的功能或行为。...

    Spring IOC和AOP代码与笔记整理

    5. **代理(Proxy)**:Spring AOP通过JDK动态代理或CGLIB代理来创建一个目标对象的代理,以便在调用目标方法时插入通知。 实际操作中,我们可以使用注解来声明切面,例如`@Aspect`、`@Before`、`@After`等,也可以...

    Spring学习笔记

    ### Spring学习笔记:深入理解AOP与Annotation驱动的动态代理 #### 核心知识点解析: 在探讨Spring框架中AOP(面向切面编程)及基于Annotation的动态代理之前,我们首先需要了解AOP的基本概念及其在Spring中的实现...

    spring学习笔记(八)

    【标题】"Spring学习笔记(八)"主要涵盖了Spring框架中的动态代理机制,这是Spring AOP(面向切面编程)的核心技术之一。动态代理允许我们在不修改原有代码的情况下,为对象添加额外的功能,如日志、事务管理等。在这...

    Spring IOC 笔记

    Spring 支持代理模式实现 AOP,可以是 JDK 动态代理或 CGLIB 代理。 ### Spring 源码分析 深入理解 Spring 源码有助于我们更好地利用和定制框架。例如,`DefaultListableBeanFactory` 类是 BeanFactory 的实现,...

    Spring高级源码学习笔记.zip

    AOP代理有两种实现方式:JDK动态代理和CGLIB。前者针对实现了接口的类,后者则在没有接口的情况下通过子类化目标类实现。源码中,Advised接口和ProxyFactoryBean扮演着关键角色。 在数据访问/集成方面,Spring提供...

    spring学习笔记(十)

    在Spring中,AOP通过代理模式实现,可以是JDK动态代理(接口实现)或CGLIB代理(类继承)。 2. **切面(Aspect)**:切面是关注点的模块化,如日志、事务管理等,它结合了通知和切点。 3. **通知(Advice)**:...

    Spring的学习笔记

    - **动态代理**:Spring AOP通过动态代理技术实现切面,包括JDK动态代理和CGLIB代理。 **AOP配置** - **注解方式**:使用@Aspect,@Before,@After等注解定义切面、通知和切入点表达式。 - **XML方式**:在配置...

Global site tag (gtag.js) - Google Analytics