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

\(^_^)/ JDK动态代理模拟Spring的AOP

    博客分类:
  • Code
 
阅读更多

参考:http://dyygusi.iteye.com/blog/1997231

参考:http://550516671-qq-com.iteye.com/blog/833816

 

 

 

代理类:

package spring.mock;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MockSpringAOP implements InvocationHandler {
	private Object target;

	public MockSpringAOP(Object obj) {
		this.target = obj;
	}

	public void setTarget(Object target) {
		this.target = target;
	}

	public void before() {
		System.out.println("这是一个前置通知");
	}

	public void afterReturning() {
		System.out.println("这是一个后置通知");
	}

	public void afterThrowing() {
		System.out.println("这是一个异常通知");
	}

	public void after() {
		System.out.println("这是一个最终通知");
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object returnVal = null;
		try {
			before();
			returnVal = method.invoke(target, args);
			afterReturning();
		} catch (Exception e) {
			afterThrowing();
		} finally {
			after();
		}
		return returnVal;
	}

}

 

 

 

代理对象

package spring.mock;
public class User {
    Integer id;
    String name;
    String pwd;
    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }
}






package spring.mock;

public interface UserDAO {
	public void addUser(User user);
}







package spring.mock;

public class UserDAOImpl implements UserDAO {

	@Override
	public void addUser(User user) {
		System.out.println("保存User到数据库中");
		throw new RuntimeException();
	}

}

 

 

 

测试

package spring.mock;

import java.lang.reflect.Proxy;

public class Test {
	public static void main(String[] args) {

		UserDAO userDao = new UserDAOImpl();
		MockSpringAOP interceptor = new MockSpringAOP(userDao);
		// 通过代理的静态方法创建一个代理对象
		// 这个代理创建的时候,接收了接口类型和拦截器的处理类,在代理的背后,他会调运拦截器的invoke这个方法。
		// 因为传递的有接口类型,所以可以强制类型转换到我们指定的接口类型
		UserDAO userDaoProxy = (UserDAO) Proxy.newProxyInstance(interceptor.getClass().getClassLoader(), userDao.getClass().getInterfaces(), interceptor);
		// 然后在代理对象处理的时候,就会将我的逻辑织如到被代理的对象上
		userDaoProxy.addUser(new User(1, "a", "b"));
	}
}

 

 

 

分享到:
评论

相关推荐

    解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够问题

    我这里是 usr/local/jdk/ 2)输入命令 chmod 777 jdk1.8.0_221/bin/java修改权限 3)再次输入 java -version 成功 总结 以上所述是小编给大家介绍的解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够问题,...

    jdk1.8.0_231

    配置环境变量,vi /etc/profile,在文件最后添加配置 JAVA_HOME=/usr/local/java/jdk1.8.0_231/ JRE_HOME=/usr/local/java/jdk1.8.0_231/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_...

    jdk1.8.0_333.x86_64-linux

    linux(x86_64)下的jdk压缩包,版本为 1.8.0_333。附带安装教程。 1、将jdk压缩包解压到指定目录(如:/usr/local/java) 2、添加环境变量(sudo vi ~/.bashrc) export JAVA_HOME=/usr/local/java/jdk1.8.0_333 ...

    spring_aop之JDK的动态代理

    基于JDK的动态代理。必须是面向接口的,只有实现了具体接口的类才能生成代理对象

    centos安装jdk1.8时出现没有/lib/ld-linux.so.2:这个文件的原因分析

    -bash: /usr/local/jdk/jdk1.8.0_181/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 安装完后 java -version 查看版本出现: 原因是:没有那个文件或目录,找了很久发现需要...

    JDK动态代理 spring aop 的原理

    Jdk动态代理,基于接口的代理示例 InovactionHandler Proxy

    spring之AOP(动态代理)

    spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理

    jdk1.7.0_79.x86_64-linux

    linux(x86_64)下的jdk压缩包,版本为 1.7.0_79。附带安装教程。 1、将jdk压缩包解压到指定目录(如:/usr/local/java) 2、添加环境变量(sudo vi ~/.bashrc) export JAVA_HOME=/usr/local/java/jdk1.7.0_79 ...

    spring_aop4.rar_Home Home_jar 转换_spring AOP jar

    1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间...

    spring jdk动态代理

    spring aop jdk 动态代理的底层实现解析模拟

    JDK1.6.0_03 for linux i586

    JAVA_HOME=/home/jdk1.6.0_03 PATH=$PATH:%JAVA_HOME%/bin CLASSPATH=.:%JAVA_HOME%/jdk1.6.0_03/jre/lib/rt.jar:%JAVA_HOME%lib/dt.jar:%JAVA_HOME%/lib/tools.jar Export JAVA_HOME PATH CLASSPATH 安装过程中...

    Spring-AOP-JDK动态代理

    Spring-AOP-利用java中的动态代理和Spring的拦截器做到AOP

    从JDK动态代理到spring AOP

    NULL 博文链接:https://hyp1987.iteye.com/blog/1833776

    JDK动态代理_JDK动态代理

    JDK动态代理,关于jdk动态代理的问题!详细的说明!JDK动态代理JDK动态代理

    Spring aop 之 静态代理 动态代理 Aspectj aop-config 等实现方式

    主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...

    AOP之JDK动态代理和CGLib动态代理

    AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383

    jdk-7u80-nb-8_0_2-linux-x64

    $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jdk/jdk1.7.0_10/bin/java 300 $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jdk/jdk1.7.0_10/bin/javac 300 $ ...

    代理模式,JDK动态代理,SpringAOP来龙去脉

    NULL 博文链接:https://fruitking.iteye.com/blog/601106

    Spring框架+SpringAOP动态代理

    Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。 JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于代理没有实现接口的...

Global site tag (gtag.js) - Google Analytics