代理模式
按照代理的创建时期,代理类可以分为两种:
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建代理类的.class
代理模式的实现包括四部分,如图:
静态代理:
接口:
package cn.cblue.service;
/**
* @Description: 接口
* @author huangzjb cblue2013@126.com
* @Company Digital China
* @date 2014-6-23 下午10:05:12
* @version 1.0
*/
public interface PersonService {
public void save(String name);
public void update(String name,Integer personid);
public String getPersonName(Integer personid);
}
目标类:
package cn.cblue.service.impl;
import cn.cblue.service.PersonService;
/**
* @Description: 目标类
* @author huangzjb cblue2013@126.com
* @Company Digital China
* @date 2014-6-23 下午10:05:56
* @version 1.0
*/
public class PersonServiceBean implements PersonService{
private String user = null;
public String getUser() {
return user;
}
public PersonServiceBean() {
}
public PersonServiceBean(String user) {
this.user = user;
}
@Override
public String getPersonName(Integer personid) {
System.out.println("method getPersonName() invoked");
return "xxx";
}
@Override
public void save(String name) {
System.out.println("method save() invoked");
}
@Override
public void update(String name, Integer personid) {
System.out.println("method update() invoked");
}
}
代理类:
package cn.cblue.service.impl;
import cn.cblue.service.PersonService;
/**
* @Description: 静态代理类
* @author huangzjb cblue2013@126.com
* @Company Digital China
* @date 2014-6-23 下午10:04:20
* @version 1.0
*/
public class PersonServiceProxy implements PersonService{
private PersonServiceBean bean;
public PersonServiceProxy() {
bean = new PersonServiceBean();
}
public PersonServiceProxy(String name){
bean = new PersonServiceBean(name);
}
@Override
public void save(String name) {
System.out.println("do something before");
if(bean.getUser() != null){
bean.save(name);
}
System.out.println("do something after");
}
@Override
public String getPersonName(Integer personid) {
return null;
}
@Override
public void update(String name, Integer personid) {
}
}
客户类:
import cn.cblue.service.impl.PersonServiceProxy;
public class Test {
public static void main(String[] args) {
PersonServiceProxy bean = new PersonServiceProxy("zhangsan");
bean.save("zhangsan");
}
}
动态代理跟静态代理的区别是代理类不是开发者用源代码定义出的,而是通过java的反射机制在程序运行期生成的。
“接口”,“目标类”,“客户类”,仍然需要开发者自己源代码定义,而代理类则由JDK提供的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口动态生成。
接口
package cn.cblue.service;
/**
* @Description: 接口
* @author huangzjb cblue2013@126.com
* @Company Digital China
* @date 2014-6-23 下午10:05:12
* @version 1.0
*/
public interface PersonService {
public void save(String name);
public void update(String name,Integer personid);
public String getPersonName(Integer personid);
}
目标类:
package cn.cblue.service.impl;
import cn.cblue.service.PersonService;
/**
* @Description: 目标类
* @author huangzjb cblue2013@126.com
* @Company Digital China
* @date 2014-6-23 下午10:05:56
* @version 1.0
*/
public class PersonServiceBean implements PersonService{
private String user = null;
public String getUser() {
return user;
}
public PersonServiceBean() {
}
public PersonServiceBean(String user) {
this.user = user;
}
@Override
public String getPersonName(Integer personid) {
System.out.println("method getPersonName() invoked");
return "xxx";
}
@Override
public void save(String name) {
System.out.println("method save() invoked");
}
@Override
public void update(String name, Integer personid) {
System.out.println("method update() invoked");
}
}
代理工厂类:
package cn.cblue.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.cblue.service.impl.PersonServiceBean;
/**
* @Description: 使用jdk中的proxy类动态生成代理类
* @author huangzjb cblue2013@126.com
* @Company Digital China
* @date 2014-6-23 下午08:56:15
* @version 1.0
*/
public class JDKProxyFactory implements InvocationHandler {
private Object target;
public Object createProxyIntance(Object target){
this.target = target;
Object object = Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this);
return object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
PersonServiceBean bean = (PersonServiceBean)this.target;
Object result = null;
if(bean.getUser() != null){
result = method.invoke(target, args);
}
return result;
}
}
客户类:
import cn.cblue.aop.JDKProxyFactory;
import cn.cblue.service.PersonService;
import cn.cblue.service.impl.PersonServiceBean;
public class AOPTest {
public static void main(String[] args) {
JDKProxyFactory factory = new JDKProxyFactory();
PersonService bean = (PersonService) factory
.createProxyIntance(new PersonServiceBean());
bean.save("xxxx");
}
}

被折叠的 条评论
为什么被折叠?



