`

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

 
阅读更多
十 使用JDK中的Proxy技术实现AOP功能

通过代理对象来调用对象的方法,从而做出权限控制。

目标对象必须实现接口才能使用proxy技术创建代理对象。

PersonService.java

view plaincopy to clipboardprint?
01.package cn.pf.aop.service;   
02.  
03.public interface PersonService {   
04.    public void save(String name);   
05.    public void update(String name, Integer personId);   
06.    public String getName(Integer personId);   
07.}  
package cn.pf.aop.service;

public interface PersonService {
	public void save(String name);
	public void update(String name, Integer personId);
	public String getName(Integer personId);
}
 

PersonServiceBean.java

view plaincopy to clipboardprint?
01.package cn.pf.aop.service.impl;   
02.  
03.import cn.pf.aop.service.PersonService;   
04.  
05.public class PersonServiceBean implements PersonService {   
06.    private String user = null;   
07.       
08.    public PersonServiceBean() {   
09.  
10.    }   
11.  
12.    public PersonServiceBean(String user) {   
13.        this.setUser(user);   
14.    }   
15.  
16.    @Override  
17.    public String getName(Integer personId) {   
18.        System.out.println(this.getClass().getName()+" getName方法");   
19.        return "pf";   
20.    }   
21.  
22.    @Override  
23.    public void save(String name) {   
24.        System.out.println(this.getClass().getName()+" save方法");   
25.    }   
26.  
27.    @Override  
28.    public void update(String name, Integer personId) {   
29.        System.out.println(this.getClass().getName()+" update方法");   
30.    }   
31.  
32.    public void setUser(String user) {   
33.        this.user = user;   
34.    }   
35.  
36.    public String getUser() {   
37.        return user;   
38.    }   
39.  
40.}  
package cn.pf.aop.service.impl;

import cn.pf.aop.service.PersonService;

public class PersonServiceBean implements PersonService {
	private String user = null;
	
	public PersonServiceBean() {

	}

	public PersonServiceBean(String user) {
		this.setUser(user);
	}

	@Override
	public String getName(Integer personId) {
		System.out.println(this.getClass().getName()+" getName方法");
		return "pf";
	}

	@Override
	public void save(String name) {
		System.out.println(this.getClass().getName()+" save方法");
	}

	@Override
	public void update(String name, Integer personId) {
		System.out.println(this.getClass().getName()+" update方法");
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getUser() {
		return user;
	}

}
 

JDKProxyFactory.java

view plaincopy to clipboardprint?
01.package cn.pf.aop;   
02.  
03.import java.lang.reflect.InvocationHandler;   
04.import java.lang.reflect.Method;   
05.import java.lang.reflect.Proxy;   
06.  
07.import cn.pf.aop.service.impl.PersonServiceBean;   
08.  
09.public class JDKProxyFactory implements InvocationHandler {   
10.    private Object targetObject;   
11.       
12.    public Object createProxyIntance(Object targetObject){   
13.        this.targetObject = targetObject;   
14.        return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),    
15.                this.targetObject.getClass().getInterfaces(), this);   
16.    }   
17.  
18.    @Override  
19.    public Object invoke(Object proxy, Method method, Object[] arg2)   
20.            throws Throwable {   
21.        PersonServiceBean personServiceBean = (PersonServiceBean)targetObject;   
22.        Object result = null;   
23.        if(personServiceBean.getUser() != null){   
24.            result = method.invoke(targetObject, arg2);   
25.        }   
26.        return null;   
27.    }   
28.}  
package cn.pf.aop;

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

import cn.pf.aop.service.impl.PersonServiceBean;

public class JDKProxyFactory implements InvocationHandler {
	private Object targetObject;
	
	public Object createProxyIntance(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[] arg2)
			throws Throwable {
		PersonServiceBean personServiceBean = (PersonServiceBean)targetObject;
		Object result = null;
		if(personServiceBean.getUser() != null){
			result = method.invoke(targetObject, arg2);
		}
		return null;
	}
}
 

AOPTest.java

view plaincopy to clipboardprint?
01.package junit.test;   
02.  
03.import org.junit.Test;   
04.  
05.import cn.pf.aop.JDKProxyFactory;   
06.import cn.pf.aop.service.PersonService;   
07.import cn.pf.aop.service.impl.PersonServiceBean;   
08.  
09.  
10.public class AOPTest {   
11.    @Test public void proxyTest(){   
12.        JDKProxyFactory factory = new JDKProxyFactory();   
13.        PersonService personService = (PersonService) factory.createProxyIntance(new PersonServiceBean());   
14.        personService.save("111");   
15.    }   
16.}  
package junit.test;

import org.junit.Test;

import cn.pf.aop.JDKProxyFactory;
import cn.pf.aop.service.PersonService;
import cn.pf.aop.service.impl.PersonServiceBean;


public class AOPTest {
	@Test public void proxyTest(){
		JDKProxyFactory factory = new JDKProxyFactory();
		PersonService personService = (PersonService) factory.createProxyIntance(new PersonServiceBean());
		personService.save("111");
	}
}
 

Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this);

创建代理对象的时候,加入了该目标对象所有的接口,即对所有的方法进行监听,任何一个方法的调用都会触发代理对象的invoke方法。this表示触发哪个代理对象的invoke方法,这里我们设置当前代理对象。

调用personService的save方法的时候,可以理解为,save方法被监听,进入代理对象的invoke方法,如果user!=null,则invoke方法中调用了personService的save方法,如果user==null,则什么也不做。

通过反射技术调用方法其实可以简单的理解为

xxx.invoke(obj,args)返回的结果是obj.xxx(args) 

end 完毕!

 

分享到:
评论

相关推荐

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

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

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

    NULL 博文链接:https://countme.iteye.com/blog/1130188

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

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

    Aop jdk proxy实现小例子

    使用jdk proxy实现aop机制的一个小例子,写着给新手看看而已,老手们莫见笑

    JAVA动态代理

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

    JDK动态代理 spring aop 的原理

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

    AOP编程示例

    CGlib的Proxy实现AOP的示例、JDK的Proxy实现AOP的示例、通过spring注解方式实现AOP

    AOP的实现机制

    使用动态代理实现AOP需要有四个角色:被代理的类,被代理类的接口,织入器,和InvocationHandler,而织入器使用接口反射机制生成一个代理类,然后在这个代理类中织入代码。被代理的类是AOP里所说的目标,...

    spring_aop4.rar_Home Home_jar 转换_spring AOP jar

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

    spring2.5学习PPT 传智博客

    使用JDK中的Proxy技术实现AOP功能 16.使用CGLIB实现AOP功能与AOP概念解释 17.使用Spring的注解方式实现AOP入门 18.使用Spring的注解方式实现AOP的细节 19.使用Spring配置文件实现AOP 20.aspectj的切入点语法...

    类似spring Aop的Proxy封装

    有一天在用回调模版的时候,忽然间又想到jdk自带的Proxy类似乎不是怎么好用,为何不把其做成回调模版呢,可以将其改造称类似spring Aop 代码如下: package com.fjx.proxy.up.test; import ...

    基于java的企业级应用开发:JDK动态代理.ppt

    对于使用业务接口的类,Spring默认会使用JDK动态代理来实现AOP。 Hibernate 的 二级缓存 学习案例 案例代码 接下来,就通过一个案例来演示Spring中JDK动态代理的实现过程,具体代码请参见教材3.2.1小节。 CGLIB代理 ...

    cglib aop spring 动态代理

    静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib

    java 实现AOP

     为了简单起见,例子没有没有使用任何第三方的AOP Framework, 而是利用Java语言本身自带的动态代理功能来实现AOP.  让我们先回到AOP本身,AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面。它的主要...

    spring之AOP(动态代理)

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

    使用动态代理演示Spring的AOP编程原理

    为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...

    Spring_0300_JDKProxy

    简单的动态代理实现代码!文档参考博文Spring学习(3)AOP初步—JDK动态代理

    JDK-proxy-mode-spring-source-code-.zip_spring code

    Spring框架的JDK代理模式底层代码。有助理解Spring的Aop模式的代理

    Spring框架+SpringAOP动态代理

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

Global site tag (gtag.js) - Google Analytics