http://blog.csdn.net/iamtheevil/article/details/6698377 (iteye的编辑器总是丢失源码,崩溃)
1、 创建一个被拦截对象接口peopleService
(横切性关注点)
2、 实现被拦截对象接口
package com.wxy.service.impl;
import com.wxy.service.PeopleService;
public class PeopleServiceBean implements PeopleService {
private String user = null;
public PeopleServiceBean() {
}
public PeopleServiceBean(String user) {
this.setUser(user);
}
@Override
public String getPeopleName(Integer peopleId) {
System.out.println("我是getPeopleName()方法");
return "wxy";
}
@Override
public void save(String name) {
System.out.println("我是save()方法,save:" + name);
}
@Override
public void update(String name, Integer peopleId) {
System.out.println("我是update()方法");
}
/**
* @param user the user to set
*/
public void setUser(String user) {
this.user = user;
}
/**
* @return the user
*/
public String getUser() {
return user;
}
}
3、拦截所有业务方法
判断用户是否有权限,有权限就允许执行业务方法,没有权限则不允许执行业务方法(是否有权限是根据user是否为null为依据的)。
为目标对象创建动态代理类的类proxy(在jdk
中的反射中):
package com.wxy.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.wxy.service.impl.PeopleServiceBean;
/**
* 创建代理工厂
* 当客户端调用代理对象的业务方法时,代理对象执行invoke方法,invoke方法把调用委派给targetObject
* 相当于调用目标对象的方法,在invoke方法委派前判断权限,实现方法的拦截
* @creator xiaoyu.wang
* @create-time 2011-8-18 上午08:57:30
* @revision $Id
*/
public class JDKProxyFactory implements InvocationHandler {
private Object targetObject;
public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
PeopleServiceBean bean = (PeopleServiceBean) this.targetObject;//被代理对象
Object result = null;
if (bean.getUser() != null) {//有权限,user不为null
result = method.invoke(targetObject, args);
}
return result;
}
/**
* @param targetObject the targetObject to set
*/
public void setTargetObject(Object targetObject) {
this.targetObject = targetObject;
}
/**
* @return the targetObject
*/
public Object getTargetObject() {
return targetObject;
}
}
4、测试:
public class AOPTest {
public static void main(String[] args) {
JDKProxyFactory factory = new JDKProxyFactory();
PeopleService service = (PeopleService) factory.createProxyInstance(new PeopleServiceBean(
"wxy"));
service.save("wxy");
}
}
5、测试结果:
我是save()方法,save:wxy
分享到:
相关推荐
本篇将深入探讨如何使用JDK的动态代理和CGLIB库来实现Spring中的AOP功能。 首先,我们来看JDK中的Proxy技术。JDK Proxy是Java提供的一种动态代理机制,它允许我们在运行时创建一个实现了特定接口的新类。这个新类...
在Java中,我们可以使用JDK的动态代理(Proxy)来实现AOP的功能,这主要涉及到反射和接口编程。 **JDK动态代理的工作原理** JDK的Proxy类提供了一种机制,可以创建一个代理对象,该对象在调用方法时会执行自定义的...
Spring AOP则是在Spring框架中对AOP概念的实现,它利用了JDK动态代理或CGLIB(字节码增强)来实现。Spring AOP的主要目标是分离关注点,将非业务逻辑(如日志、事务管理)从核心业务代码中解耦出来。以下是Spring ...
本篇将详细探讨JDK动态代理和Spring AOP,以及它们在实际应用中的作用。 首先,JDK动态代理是Java提供的一种在运行时创建代理对象的技术。它允许我们在不修改原有类的基础上,为已有接口添加额外的功能。动态代理的...
通过使用 Proxy 和 InvocationHandler,可以将性能监视的横切代码从业务类中移除,并将其安置在 PerformaceHandler 中,从而实现了 AOP 式的编程。 在使用 JDK 动态代理时,需要实现 InvocationHandler 接口,并在 ...
- 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法前后,会插入相应的通知代码,从而实现AOP功能。 - **CGLIB代理**: - 如果目标...
Spring框架中的AOP模块使用了动态代理来实现AOP概念。Spring AOP允许开发者定义切面,并在这些切面中指定拦截的方法。Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,...
本篇将详细讲解Spring中的AOP实现,特别是JDK动态代理的应用。 首先,我们要了解什么是AOP(Aspect Oriented Programming,面向切面编程)。AOP是一种编程范式,旨在解决应用程序中分散的、横切关注点的问题,如...
- **代理(Proxy)**:Spring AOP通过代理模式来实现切面功能,有JDK动态代理和CGLIB代理两种方式。 **2. JDK 动态代理** - 当目标类实现了接口时,Spring AOP会选择使用JDK动态代理。它会生成一个实现了目标类所有...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,...通过理解JDK动态代理的工作原理和Spring AOP的相关概念,我们可以更好地利用这一强大功能,提升应用程序的可维护性和灵活性。
这个小例子适合初学者理解AOP和JDK Proxy的基本用法,对于经验丰富的开发者来说,可能更倾向于使用Spring AOP或其他高级AOP框架,它们提供了更为强大和灵活的特性。但无论如何,理解JDK Proxy的基本原理对掌握AOP...
在Java中,我们可以使用JDK的动态代理或者Spring AOP来实现代理模式。 JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类是生成代理对象的工厂,而...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许程序员在不修改源代码的情况下,通过在运行时插入额外的行为(如日志记录、性能监控等)来增强对象的功能。动态代理则是Spring AOP实现的核心技术之一...
在Java开发中,AOP(面向切面编程)是一种重要的编程范式,它允许程序员将关注点分离,比如日志、事务管理等通用功能,从核心业务逻辑中解耦出来。Spring框架是Java世界里AOP应用的典型代表。本文将深入探讨Spring是...
标题中的“spring-aop”指的是Spring框架中的面向切面编程(Aspect-Oriented Programming, AOP)模块,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的核心概念包括切面(Aspect)、通知...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点...
7. AOP代理(AOP Proxy):Spring提供了两种类型的代理,即JDK动态代理和CGLIB代理。JDK代理用于实现接口的类,而CGLIB代理则在没有接口的情况下创建目标对象的子类。 实现Spring AOP通常有两种方式: 1. 注解驱动...
在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
- **JDK动态代理**:当目标类实现了接口时,Spring会使用JDK的Proxy类创建一个代理对象,该代理对象会在调用接口方法时插入通知代码。 - **CGLIB代理**:如果目标类没有实现接口,Spring会使用CGLIB库创建一个目标...