1、基础类
import java.lang.reflect.Method;
/*系统功能的建议,spring中命名规则*/
public interface Advice {
public void beforeMethod(Method method);
public void afterMethod(Method method);
public String CMethod();
}
import java.lang.reflect.Method;
public class MyAdvice implements Advice {
long beginTime = 0;
long endTime = 0;
public void afterMethod(Method method) {
System.out.println("结束时间");
endTime = System.currentTimeMillis();//获取毫秒信息
System.out.println(CMethod());
}
public void beforeMethod(Method method) {
System.out.println("开始时间");
beginTime = System.currentTimeMillis();
}
public String CMethod(){
return "总共用时" + (beginTime - endTime) ;
}
}
2、代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactoryBean {
private Object target;
private Advice advice;
public Object getProxy() {
// 创建一个新的代理.
// InvocationHandler动态方法
Object proxy = Proxy.newProxyInstance(target.getClass()
.getClassLoader(), target.getClass().getInterfaces(),
new InvocationHandler() {
Object retVal = null;
public Object invoke(Object obj, Method method,
Object[] objs) throws Throwable {
advice.beforeMethod(method);
retVal = method.invoke(target, objs);
advice.afterMethod(method);
return retVal;
}
});
return proxy;
}
public String getString() {
return "testProxyFactoryBean";
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public Advice getAdvice() {
return advice;
}
public void setAdvice(Advice advice) {
this.advice = advice;
}
}
定义名为config.properties配置文件,其中配置文件.target要代理的文件,.advice为在代理文件前后调用的代理方法,xxx为代理文件(判断是否在工厂进行加工)
#Proxy
#xxx=com.dhy.test.likeSpring.ProxyFactoryBean
xxx = java.util.ArrayList
#xxx=java.util.ArrayList
xxx.advice=com.dhy.test.likeSpring.MyAdvice
xxx.target=java.util.ArrayList
代理工厂
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Properties;
/* Bean工厂用来判定是否进入 AOP切面中,
* 换句话说就是Bean进入工厂后,经过工厂的处理(其可以选择对进入的信息进行加工,也可以选择不加工)
* 再输出出来,这就是工厂的概念*/
public class BeanFactory {
Properties properties = new Properties();
public BeanFactory(InputStream inputStream) {
try {
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public Object getBean(String name){
//找到代理Bean的工厂
String className = properties.getProperty(name);
Class clazz = null;
Object bean = null;
try {
clazz = Class.forName(className);
bean = clazz.newInstance();//其就等于new自己
} catch (Exception e) {
e.printStackTrace();
}
//判断是否是代理工厂类型(没有定义为代理工厂即转出,不对其进行代理)
if(bean instanceof Collection){
Object proxy = null;
ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
try {
//由配置文件中获取处理代理的类
Advice advice = (Advice) Class.forName(properties.get(name + ".advice").toString()).newInstance();
//获取要代理的类
Object target = Class.forName(properties.get(name + ".target").toString()).newInstance();
//设置代理的内部方法
proxyFactoryBean.setAdvice(advice);
//设置代理
proxyFactoryBean.setTarget(target);
proxy = proxyFactoryBean.getProxy();
} catch (Exception e) {
e.printStackTrace();
}
return proxy;
}
return bean;
}
}
分享到:
相关推荐
在iOS开发中,代理模式是一种常见的设计模式,它允许对象之间进行通信,特别是在处理事件响应、数据传递等方面。代理模式的使用使得代码更加模块化,增强了可扩展性和灵活性。在这个"IOS开发代理模式demo"中,我们将...
【第03章 从架构层面看设计模式02】主要探讨了如何在软件架构中应用设计模式,尤其是代理模式,以及如何结合其他模式优化系统。本章节通过一个电商设计模式实战案例,详细阐述了代理模式、享元模式、装饰者模式、...
在本示例中,我们将深入探讨如何利用Spring框架与JDBC的整合来实现转账业务,并通过动态代理模式来优化事务管理。动态代理模式是Java中一种强大的设计模式,它允许我们在运行时创建对象的代理,以拦截方法调用并执行...
设计模式03-创建型模式 设计模式04-创建型模式2 设计模式05-建造者、原型模式 设计模式06-适配器、桥接、组合模式 设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大...
代理模式的核心在于定义一个协议(Protocol),这个协议规定了代理需要实现的方法。在iOS开发中,这些协议通常是以"Delegate"结尾的,比如UITableViewDataSource、UITableViewDelegate、UIApplicationDelegate等。...
代理模式、适配器模式、桥接模式、外观模式、装饰者模式 结构型模式是描述如何将类或对象按某种布局组成更大的结构的模式。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或...
12第十二讲代理模式 13第十三讲外观模式 14第十四讲组合模式 15第十五讲桥接模式 16第十六讲适配器模式 17第十七讲解释器模式 18第十八讲中介者模式 19第十九讲职责链模式 20第二十讲迭代模式 21第二十一讲模板方法...
结构型模式涉及如何组合类和对象,比如适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)和桥接模式(Bridge)。行为型模式则主要关注对象间的行为和责任分配,如策略模式(Strategy)、观察者...
这包括创建型模式(如单例、工厂方法、抽象工厂)、结构型模式(如适配器、装饰器、代理、桥接、组合、外观、享元)和行为型模式(如策略、模板方法、观察者、迭代器、访问者、责任链、命令、解释器)。 Part01可能...
6. **代理模式(Proxy)**:代理模式为其他对象提供一种代理以控制对这个对象的访问。在这个压缩包中,可能会有一个Proxy类,它代表了RealSubject,并在访问RealSubject之前或之后执行额外操作。 7. **命令模式...
7. **SDP03-06例子代码.rar** - 可能包含代理模式,代理模式为其他对象提供一种代理以控制对这个对象的访问。它可以用来在访问原对象前增加一些额外的操作,或者用于远程代理、虚拟代理等场景。 8. **SDP03-04例子...
- **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。 - **外观模式**:提供一个统一的接口,用来访问子系统中的一组接口。 - **组合模式**:将对象组合成树形结构以表示“部分-整体”的层次结构,...
"SDP03-07静态代理和动态代理.doc"涵盖了代理模式,代理模式为其他对象提供一种代理以控制对这个对象的访问。静态代理在编译时就确定了代理对象,而动态代理则是在运行时根据需要创建代理对象,例如Java中的动态代理...
第11章 越俎代庖:代理模式 (Proxy) 第12章 真人不露相:装饰模式 (Decorator) 第13章 游刃有余:桥模式 (Bridge) 第14章 如法炮制:组合模式 (Composite) 第15章 源源不断:享元模式 (Flyweight) 第16章 按部就班:...
- **代理模式**:提供一个代理对象来控制对真实对象的访问。 - **外观模式**:为子系统中的一组接口提供一个一致的界面。 - **桥接模式**:将抽象部分与它的实现部分分离,使它们都可以独立变化。 - **组合模式*...
在这个"spring03-1"的例子中,我们通过租房的应用场景来探讨如何在Spring框架中实现代理模式。这个压缩包可能包含了相关的代码示例,如"1606SpringDay03-1",它可能是课程资料或者练习项目的一部分。 首先,我们...
- SDP02-02可能涉及的是代理模式,用于在不修改原有对象的基础上增加额外功能。 - SDP03-01和SDP03-06可能涵盖了工厂模式或抽象工厂模式,提供了一种创建对象的接口,但允许子类决定实例化哪个类。 - SDP02-05和...
4. **代理模式**(10代理模式):代理模式为一个对象提供一个替代品或代表,以控制对原对象的访问。它可以用于延迟加载、安全控制、增加额外功能等场景。 5. **享元模式**(09享元模式):享元模式用于减少大量相似...
代理模式为其他对象提供一种代理以控制对这个对象的访问。在Java中,静态代理和动态代理(JDK Proxy或CGLIB)都是常见的实现方式。 8. **策略模式 (Strategy)** - 08.pdf 策略模式定义了一系列算法,并将每一个...
【标题】:“Python自学教程-03-事件代理.ev4.rar”是一个压缩文件,其中包含了一个视频教程,专门讲解Python编程中的事件代理概念。事件代理是面向对象编程中的一种设计模式,尤其在GUI(图形用户界面)编程中广泛...