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");
}
}
分享到:
相关推荐
在Java领域,我们可以使用Spring框架提供的AOP支持,但本实例主要讨论的是如何使用JDK自身的动态代理(Proxy)技术来实现AOP。 JDK的Proxy类提供了创建动态代理对象的能力,这个代理对象可以代表一个或多个实现了...
本篇将深入探讨如何使用JDK的动态代理和CGLIB库来实现Spring中的AOP功能。 首先,我们来看JDK中的Proxy技术。JDK Proxy是Java提供的一种动态代理机制,它允许我们在运行时创建一个实现了特定接口的新类。这个新类...
1. Spring_AOP_DynProxy:这可能包含有关Spring动态代理的资料,Spring使用JDK动态代理或CGLIB来创建代理对象,实现AOP的功能。 2. ch20_aop_annotation:这部分内容可能是关于使用注解来定义和实现切面的教程。 3. ...
在本示例中,"Spring示例_Printer_Spring_AOP_Spring_Proxy" 主要关注的是Spring框架中的核心概念,特别是AOP(面向切面编程)和代理模式的应用。让我们深入探讨这些知识点。 首先,Spring框架是Java开发中最常用的...
下面我们将详细讲解如何使用JDK Proxy实现Aop。 首先,我们需要定义一个接口,这个接口将代表我们要进行代理的目标对象的行为。例如,我们可以创建一个名为`Service`的接口: ```java public interface Service { ...
在实际的`spring_aop_xml`压缩包中,应该包含了相关的XML配置文件、服务接口及其实现类、通知类等,通过这些文件可以更好地理解和学习如何在XML中配置和使用Spring AOP。通过深入学习和实践,你将能熟练掌握这一强大...
在Spring配置中,如果我们希望使用CGLIB代理,可以在`<aop:config>`或`<aop:aspectj-autoproxy>`元素下添加`<aop:proxy>`子元素,并设置`proxy-target-class="true"`。例如: ```xml <aop:config> <aop:aspect id=...
标题"Spring_0300_JDKProxy"暗示我们将讨论Spring如何使用JDK的Proxy类来实现动态代理。在Spring中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以...
Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...
在Spring AOP中,当目标对象实现了至少一个接口时,Spring会使用JDK的动态代理来创建代理对象。这是因为JDK的动态代理只适用于实现了接口的类,它通过生成一个与目标类接口相同的新类来实现代理。这个新类在运行时被...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,...通过理解JDK动态代理的工作原理和Spring AOP的相关概念,我们可以更好地利用这一强大功能,提升应用程序的可维护性和灵活性。
AOP的实现技术主要包括两大类: 1. **动态代理**:通过截取方法调用的方式,在不修改原有对象行为的基础上添加额外的功能。这种方式适用于运行时动态地改变行为。 2. **静态织入**:通过引入特定的语法创建“方面”...
7. **代理(Proxy)**:代理是AOP的实现机制,它在目标对象和实际调用者之间创建一个中介,使得通知可以在调用目标方法时执行。 8. **织入(Weaving)**:织入是将切面应用到目标对象以创建代理对象的过程。Spring支持...
在Java中实现AOP(面向切面编程)通常依赖于Spring框架,但其实也可以仅使用Core Java来实现类似的功能。AOP的核心思想是将横切关注点(如日志、事务管理、安全性等)与业务逻辑分离,提高代码的可维护性和模块化。...
7. 代理(Proxy):AOP框架创建的对象,用于实现切面逻辑。 三、Spring AOP实现方式 Spring支持两种AOP代理:JDK动态代理和CGLIB代理。JDK动态代理适用于接口实现类,而CGLIB代理则用于没有实现接口的类。Spring会...
本篇将详细讲解Spring中的AOP实现,特别是JDK动态代理的应用。 首先,我们要了解什么是AOP(Aspect Oriented Programming,面向切面编程)。AOP是一种编程范式,旨在解决应用程序中分散的、横切关注点的问题,如...
4. **动态代理**:Java 1.6通过`java.lang.reflect.Proxy`类实现了动态代理,允许在运行时创建接口的实现类,方便进行AOP(面向切面编程)等设计模式的应用。 5. **脚本语言支持**:通过JSR 223,Java 1.6开始支持...
6. **Spring AOP配置**:可以通过XML配置文件或Java配置来启用和定义AOP,例如在XML中使用`<aop:config>`和`<aop:aspect>`元素,而在Java配置中使用`@EnableAspectJAutoProxy`注解。 7. **代理模式详解**:Spring...