`
yulon
  • 浏览: 118717 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

AOP编程的实现与原理

阅读更多

1、问题描述:拦截所有业务方法,判断用户是否有权限,有权限就允许他执行业务方法。

1.1定义一个UserServcie业务接口

public interface UserService {
 public void save();
 public void update(String name,Integer userid);
 public String getUserName(Integer userid);
}

 

1.2、编写实现UserServcie接口的类

public class UserServiceBean implements UserService {
	private String user = null;
	
	public UserServiceBean (String user){
		this.user = user;
	}
	public UserServiceBean (){
		
	}
	public String getUserName(Integer userid) {
		return "xxx";
	}
	public String getUser() {
		return user;
	}
	public void save() {
	//	if(user!=null){System.out.println("我是save()方法");}
		System.out.println("我是save()方法");

	}
	public void update(String name, Integer userid) {
		System.out.println("我是update()方法");
	}
}

 

2、编写JDKProxyFactory代理工厂类,要求实现java.lang.reflect.InvocationHandler接口,实现invoke方法.

public class JDKProxyFactory implements InvocationHandler{

	private Object targetObject;
	
	//创建目标对象的代理类
	public Object createProxyInstance(Object targetObject){
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
				//實現目標對象的所有接口,InvocationHandler是回調
				this.targetObject.getClass().getInterfaces(), this);
	}
	//當客戶端調用代理對象方法的時候,會先調用this的這個方法invoke
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		PersonServiceBean bean = (PersonServiceBean)this.targetObject;
		Object result = null;
		if(bean.getUser()!=null){
			//最終方法的調用委派給目標對象targetObject
		   result = method.invoke(targetObject, args);
		}else{
			System.out.println("沒有權限,退出程序.....");
		}	
		return result;
	}
}

  2.2 第二种方式,创建 CGlibProxyFactory代理工厂,要求实现MethodInterceptor接口,并实现其中的intercept方法.

(注:要加入cglib相关jar包)

public class CGlibProxyFactory implements MethodInterceptor{
	private Object targetObject;
	
	public Object createProxyInstance(Object targetObject){
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.targetObject.getClass());//继承目标类,重写final方法
		enhancer.setCallback(this);
		return enhancer.create();
	}

	//类似struts2拦截器
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		UserServiceBean bean = (UserServiceBean)this.targetObject;
		Object result = null;
		if(bean.getUser()!=null){
		   result = method.invoke(targetObject, args);
		}else{
                                      System.out.println("沒有權限,退出程序.....");
                                } 	
		return result;
	}
}

 

3、编写测试类

public class AOPTest extends TestCase {
	@Test
	public void proxyTest(){
		//测试JDKProxy
		System.out.println("----------测试JDKProxy----------");
		JDKProxyFactory factory = new JDKProxyFactory();
		UserService userService = (UserService )factory.createProxyInstance(new UserServiceBean());
		userService .save();
		userService = (UserService )factory.createProxyInstance(new UserServiceBean("test"));
		userService .save();
		
		//测试CGlibProxy
		System.out.println("----------测试CGlibProxy----------");
		CGlibProxyFactory factory2 = new CGlibProxyFactory();
		userService = (UserServiceBean)factory2.createProxyInstance(new PersonServiceBean());
		userService .save();
		userService = (UserServiceBean)factory2.createProxyInstance(new UserServiceBean("test"));
		userService .save();
	}
}

运行结果:

----------测试JDKProxy----------
沒有權限,退出程序.....
我是save()方法
----------测试CGlibProxy----------
沒有權限,退出程序.....
我是save()方法

 

2
0
分享到:
评论

相关推荐

    Spring AOP面向方面编程原理:AOP概念

    ### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)...对于希望深入了解Spring AOP原理与实践的读者来说,掌握以上概念将是开启面向方面编程之旅的第一步。

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。AOP通过预定义的“切面”对横切关注点进行模块化,从而可以在不修改业务逻辑代码的情况下增加新功能。动态...

    Spring AOP面向方面编程原理Spring AOP面向方面编程原理

    ### Spring AOP面向方面编程原理详解 #### 一、引言与定义 Spring AOP(Aspect Oriented Programming)是Spring框架中的一个核心组件,用于实现面向切面编程。AOP是一种编程范式,旨在将横切关注点(Cross-cutting...

    C++ AOP编程理论

    总之,C++ AOP编程理论的研究和应用,能够帮助开发者在面对庞大的代码库维护挑战时,提供更加灵活和高效的解决方案。通过模拟或者采用专门的AOP工具,可以将横切关注点从核心业务逻辑中分离出来,从而提高代码的整洁...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...

    深入解析Spring AOP源码:从原理到实现,全方位掌握Java AOP编程精髓

    Spring AOP,全称为Spring的面向切面编程,是Spring框架的重要组成部分,旨在实现关注点的分离,提高代码的可维护性和...对于那些需要更高级功能或对性能有更高要求的项目,可以考虑使用AspectJ进行更深入的AOP编程。

    代理机制及AOP原理实现

    本文将深入探讨这两个主题,并结合JDK的反射和CGLIB库来阐述其实现原理。 首先,我们来看动态代理。动态代理是Java提供的一种在运行时创建代理对象的技术,它允许我们在不修改原有代码的情况下,为已有接口添加额外...

    Spring切面AOP编程的简单模拟实现

    本教程将通过模拟Spring AOP来阐述如何实现一个简单的切面编程。我们将讨论以下几个核心概念:切面、通知、连接点和代理。 首先,我们要理解什么是切面。在AOP中,切面是关注点的模块化,它结合了“横切关注点”...

    AOP的实现机制.

    三、Spring AOP实现原理 1. 切面配置:在Spring中,切面可以通过XML配置或注解来定义。通知、切入点和引入都可以在切面中声明。 2. 代理创建:Spring根据目标对象是否实现了接口,选择使用JDK动态代理或CGLIB代理...

    Spring AOP实现机制

    总之,Spring AOP通过代理技术实现了面向切面编程,使得开发者能够更专注于业务逻辑,而将通用的横切关注点剥离出来,提高了代码的可读性和可维护性。通过深入理解Spring AOP的实现机制,我们可以更好地利用这一强大...

    JavaEE CGLIB字节码增强方式实现AOP编程

    总的来说,JavaEE CGLIB字节码增强方式提供了一种灵活的手段来实现AOP编程,它通过动态生成字节码创建目标类的子类,实现了对目标方法的拦截和增强,从而在不修改原有代码的基础上,增强了代码的功能和可维护性。...

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...

    aop.zip_884AOP_java aop原理_javaaop原理

    Java AOP(面向切面编程)是软件设计中的一个重要概念,它允许程序员定义“切面”,这些切面封装了特定的、与业务逻辑不直接相关的关注点,如日志、事务管理、性能监控等。AOP的核心思想是将横切关注点从核心业务...

    编程语言+JAVAspring+AOP编程+面向切面

    编程语言+JAVAspring+AOP编程+面向切面...它介绍了JAVAspring的AOP编程的概念、原理和作用,以及如何使用JAVAspring的AOP编程来实现面向切面的功能,包括切点、通知、切面、织入的概念,以及一些配置文件和注解的用法。

    aop的工作原理

    **AOP(面向切面编程)**是一种编程范式,主要应用于处理系统中的横切关注点,例如日志记录、事务管理、权限控制等。它将这些分散在代码各处的功能抽取出来,集中管理和实现,使得核心业务逻辑更加清晰。 在Java中...

    AOP的实现机制

    面向切面编程(Aspect-Oriented Programming, AOP)是一种编程范式,它旨在将横切关注点(cross-cutting concerns)从业务...了解这些实现机制的原理和优缺点,有助于开发者在设计和开发时选择最合适的方法来实现AOP。

    spring源代码分析:aop的实现

    本文将深入Spring源码,探索AOP的实现原理。 首先,我们需要理解AOP的基本概念。AOP允许开发者定义“切面”(Aspect),一个切面封装了跨越多个对象的横切关注点。切点(Pointcut)定义了这些关注点在何时何地被...

    Spring AOP编程实例

    **Spring AOP编程实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的核心特性之一,它提供了一种在不修改原有代码的情况下,通过插入额外的行为(如日志、事务管理等)来增强功能的...

    javaXML方式实现SpringAop编程(源码+jar包)

    AOP是一种编程范式,用于将关注点(如日志、安全检查)与业务逻辑分离,使得代码更加模块化。在Spring中,AOP通过定义切面(Aspect)、通知(Advice)、切入点(Pointcut)和织入(Weaving)等概念来实现。 1. **切...

Global site tag (gtag.js) - Google Analytics