`

AOP__使用JDK中的Proxy技术实现AOP功能

 
阅读更多

AOP主要用于权限的验证

细粒度的权限控制:对方法进行拦截,判断用户是否用权限,假如有权限,则允许用户访问被拦截的方法

粗粒度的权限控制:

机制:方法——代理对象——目标对象

实例:使用JDK中的Proxy技术实现AOP功能模拟AOP的机制(不使用任何AOP框架)

局限性:目标对象PersonServiceImp需要实现接口

 PersonService.java

package com.qh.service;
//接口
public interface PersonService {
	public void save(String name);

	public void update(String name, int id);

	public String getPersonName(int id);
}

 PersonServiceImp.java

/**
 * 业务层,被拦截对象
 */
package com.qh.service.imp;
import com.qh.service.PersonService;
public class PersonServiceImp implements PersonService {
	String user = null;//用户
	// 获得用户信息的方法
	public String getUser() {
		return user;
	}
	public PersonServiceImp() {
	}
	public PersonServiceImp(String user) {
		this.user = user;
	}
	public void save(String name) {
		System.out.println("我是save()方法");
	}
	public void update(String name, int id) {
		System.out.println("我是update()方法");
	}
	public String getPersonName(int id) {
		return "我是getPersonName()方法";
	}
}

 JDKProxyFactory.java

/*
 * proxy工厂,拦截所有业务方法,判断user是否为null,为null,则没有权限访问方法
 */
package com.qh.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.qh.service.imp.PersonServiceImp;

public class JDKProxyFactory implements InvocationHandler {// 实现接口
	private Object targetObject;// 目标对象

	/*
	 * 创建一个Proxy实例,参数说明:获得目标类的装载、代理对象实现的接口、 
	 * 回调(当实现前两个参数后,调用类的拦截方法(invoke()方法))
	 */
	public Object createProxyIntance(Object targetObject) {
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(this.targetObject.getClass()
				.getClassLoader(),
				this.targetObject.getClass().getInterfaces(), this);
	}
	//此方法是接口InvocationHandler中的方法,是Proxy的核心方法
	// 参数说明:代理对象、拦截的方法、拦截方法的输入参数
	public Object invoke(Object poxy, Method method, Object[] args)
			throws Throwable {
		PersonServiceImp personServiceImp = (PersonServiceImp) this.targetObject;
		Object result = null;
		if (personServiceImp.getUser() != null) {
			// 将拦截的方法委派给目标对象
			result = method.invoke(this.targetObject, args);
		}
		return result;
	}
}

  Test.java

package com.qh.test;

import org.junit.Test;

import com.qh.aop.JDKProxyFactory;
import com.qh.service.PersonService;
import com.qh.service.imp.PersonServiceImp;

public class AOPTest {

	@Test
	public void test() {
		JDKProxyFactory factory = new JDKProxyFactory();
		//用接口创建对象
		PersonService personServiceImp = (PersonService) factory
				.createProxyIntance(new PersonServiceImp("aa"));//传入目标对象
		personServiceImp.save("fdf");
	}

}
分享到:
评论

相关推荐

    AOP_1.入门及使用JDK中的Proxy技术实现实例

    在Java领域,我们可以使用Spring框架提供的AOP支持,但本实例主要讨论的是如何使用JDK自身的动态代理(Proxy)技术来实现AOP。 JDK的Proxy类提供了创建动态代理对象的能力,这个代理对象可以代表一个或多个实现了...

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    本篇将深入探讨如何使用JDK的动态代理和CGLIB库来实现Spring中的AOP功能。 首先,我们来看JDK中的Proxy技术。JDK Proxy是Java提供的一种动态代理机制,它允许我们在运行时创建一个实现了特定接口的新类。这个新类...

    spring_AOP.rar_876.aop_java aop_spring_aop

    1. Spring_AOP_DynProxy:这可能包含有关Spring动态代理的资料,Spring使用JDK动态代理或CGLIB来创建代理对象,实现AOP的功能。 2. ch20_aop_annotation:这部分内容可能是关于使用注解来定义和实现切面的教程。 3. ...

    Spring示例_Printer_Spring_AOP_Spring_Proxy

    在本示例中,"Spring示例_Printer_Spring_AOP_Spring_Proxy" 主要关注的是Spring框架中的核心概念,特别是AOP(面向切面编程)和代理模式的应用。让我们深入探讨这些知识点。 首先,Spring框架是Java开发中最常用的...

    Aop jdk proxy实现小例子

    下面我们将详细讲解如何使用JDK Proxy实现Aop。 首先,我们需要定义一个接口,这个接口将代表我们要进行代理的目标对象的行为。例如,我们可以创建一个名为`Service`的接口: ```java public interface Service { ...

    spring_aop_xml.rar_java aop_xml aop

    在实际的`spring_aop_xml`压缩包中,应该包含了相关的XML配置文件、服务接口及其实现类、通知类等,通过这些文件可以更好地理解和学习如何在XML中配置和使用Spring AOP。通过深入学习和实践,你将能熟练掌握这一强大...

    spring_aop_cglib的实现方式

    在Spring配置中,如果我们希望使用CGLIB代理,可以在`<aop:config>`或`<aop:aspectj-autoproxy>`元素下添加`<aop:proxy>`子元素,并设置`proxy-target-class="true"`。例如: ```xml <aop:config> <aop:aspect id=...

    Spring_0300_JDKProxy

    标题"Spring_0300_JDKProxy"暗示我们将讨论Spring如何使用JDK的Proxy类来实现动态代理。在Spring中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以...

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

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

    spring_aop之JDK的动态代理

    在Spring AOP中,当目标对象实现了至少一个接口时,Spring会使用JDK的动态代理来创建代理对象。这是因为JDK的动态代理只适用于实现了接口的类,它通过生成一个与目标类接口相同的新类来实现代理。这个新类在运行时被...

    模拟spring aop【一】基于jdk动态代理实现的aop

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,...通过理解JDK动态代理的工作原理和Spring AOP的相关概念,我们可以更好地利用这一强大功能,提升应用程序的可维护性和灵活性。

    Java JDK 实现AOP

    AOP的实现技术主要包括两大类: 1. **动态代理**:通过截取方法调用的方式,在不修改原有对象行为的基础上添加额外的功能。这种方式适用于运行时动态地改变行为。 2. **静态织入**:通过引入特定的语法创建“方面”...

    SPRING_AOP_概念解析以及例子示范.docx

    7. **代理(Proxy)**:代理是AOP的实现机制,它在目标对象和实际调用者之间创建一个中介,使得通知可以在调用目标方法时执行。 8. **织入(Weaving)**:织入是将切面应用到目标对象以创建代理对象的过程。Spring支持...

    手把手教你用Java实现AOP_.docx

    在Java中实现AOP(面向切面编程)通常依赖于Spring框架,但其实也可以仅使用Core Java来实现类似的功能。AOP的核心思想是将横切关注点(如日志、事务管理、安全性等)与业务逻辑分离,提高代码的可维护性和模块化。...

    Spring_AOP_Demo

    7. 代理(Proxy):AOP框架创建的对象,用于实现切面逻辑。 三、Spring AOP实现方式 Spring支持两种AOP代理:JDK动态代理和CGLIB代理。JDK动态代理适用于接口实现类,而CGLIB代理则用于没有实现接口的类。Spring会...

    Spring-AOP-JDK动态代理

    本篇将详细讲解Spring中的AOP实现,特别是JDK动态代理的应用。 首先,我们要了解什么是AOP(Aspect Oriented Programming,面向切面编程)。AOP是一种编程范式,旨在解决应用程序中分散的、横切关注点的问题,如...

    JDK_API_1_6_zh_CN.zip_JDK_API_1_6_zh_CN_java api_jdk_api_1_6_zn_

    4. **动态代理**:Java 1.6通过`java.lang.reflect.Proxy`类实现了动态代理,允许在运行时创建接口的实现类,方便进行AOP(面向切面编程)等设计模式的应用。 5. **脚本语言支持**:通过JSR 223,Java 1.6开始支持...

    AOP_使用spring框架进行面向切面编程

    6. **Spring AOP配置**:可以通过XML配置文件或Java配置来启用和定义AOP,例如在XML中使用`<aop:config>`和`<aop:aspect>`元素,而在Java配置中使用`@EnableAspectJAutoProxy`注解。 7. **代理模式详解**:Spring...

Global site tag (gtag.js) - Google Analytics