1.静态代理
首先定义接口
package staticProxy;
public interface IHello {
public void hello(String name);
}
然后定义业务逻辑实现类
package staticProxy;
public class HelloSpeaker implements IHello {
@Override
public void hello(String name) {
// TODO Auto-generated method stub
System.out.println("Hello, "+name);
}
}
最后定义代理类,同样实现之前定义的接口
package staticProxy;
import java.util.logging.Logger;
import java.util.logging.Level;;
public class HelloProxy implements IHello {
private Logger logger = Logger.getLogger(this.getClass().getName());
private IHello helloObject;
public HelloProxy(IHello helloObject){
this.helloObject = helloObject;
}
@Override
public void hello(String name) {
// TODO Auto-generated method stub
log("hello method starts......");
helloObject.hello(name);
log("hello method ends......");
}
private void log(String msg){
logger.log(Level.INFO,msg);
}
}
测试类
package staticProxy;
public class ProxyDemo {
public static void main(String[] args){
IHello proxy = new HelloProxy(new HelloSpeaker());
proxy.hello("Cuiliang");
}
}
动态代理
编写动态代理类
package DynamicProxy;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.lang.reflect.*;
public class LogHandler implements InvocationHandler{
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object delegate;
public Object bind(Object delegate){
this.delegate = delegate;
return Proxy.newProxyInstance(
delegate.getClass().getClassLoader(),
delegate.getClass().getInterfaces(),
this);
}
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
Object result = null;
try{
log("method starts......" + method);
result = method.invoke(delegate, args);
log("method ends......" + method);
}
catch(Exception e){
log(e.toString());
}
return result;
}
private void log(String msg){
logger.log(Level.INFO,msg);
}
}
测试类
package DynamicProxy;
import staticProxy.HelloSpeaker;
import staticProxy.IHello;
public class ProxyDemo {
public static void main(String[] args){
LogHandler logHandler = new LogHandler();
IHello helloProxy =
(IHello)logHandler.bind(new HelloSpeaker());
helloProxy.hello("Cuiliang");
}
}
Spring AOP 实现
package AOP;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.aop.MethodBeforeAdvice;
public class LogBeforeAdvice implements MethodBeforeAdvice{
private Logger logger = Logger.getLogger(this.getClass().getName());
public void before(Method method, Object[] args,
Object target) throws Throwable{
logger.log(Level.INFO,"method starts..." + method);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="logBeforeAdvice"
class="AOP.LogBeforeAdvice"/>
<bean id="helloSpeaker"
class="staticProxy.HelloSpeaker"/>
<bean id="helloProxy"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"
value="staticProxy.IHello"></property>
<property name="target" ref="helloSpeaker"></property>
<property name="interceptorNames">
<list>
<value>logBeforeAdvice</value>
</list>
</property>
</bean>
</beans>
测试类
package AOP;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import staticProxy.IHello;
public class SpringAOPDemo {
public static void main(String[] args){
ApplicationContext context =
new ClassPathXmlApplicationContext("AOP/bean-config.xml");
IHello helloProxy =
(IHello)context.getBean("helloProxy");
helloProxy.hello("Cuiliang");
}
}
需要 spring-aop.jar 包,而spring-aop.jar包又依赖,spring.jar和commons-logging-1.0.4.jar两个包。
分享到:
相关推荐
Java 设计模式 代理模式介绍,含源码
Java代理模式 事例很生动,非常容易理解,推荐给大家。
设计模式的代理模式的例子,希望对大家有用~~~~~~~~
自己写的一个代理模式的示例,供大家参考 自己写的一个代理模式的示例,供大家参考 自己写的一个代理模式的示例,供大家参考
本程序是一个代理模式的小例子。程序比较简单。
代理模式的小demo
JAVA设计模式之代理模式实例
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。 代理模式的主要作用是,用来控制真实对象的访问权限,也就是完全对外隐藏真实对象。以及在调用真实对象时,代理还可以额外的处理另外的事。 比如下面...
C#写的一份包含代理模式Proxy的基本实现代码和一个应用案例代码,有助于Proxy的理解和学以致用。
JAVA 设计模式: 工厂模式 代理模式 迭代模式 责任链模式 源码
Proxy代理模式的经典实例(很有面向对象思想哦)。快速学会Proxy代理模式.
该代码是android应用设计模式之代理模式小例子
用java实现代理模式,使用房屋中介的现实例子进行代理模式的说明
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
用生动的例子讲述设计模式 潘金莲 三国演义 。。。。。。
这份文件讲诉了代理模式-分布式计算,是以例子的形式进行讲诉的,希望可以帮助学习的人!
- 代理模式 - 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事...
一个众所周知的代理模式的例子就是引用计数的指针对象。 代理模式是结构设计模式的例子。这个模式的目的是要创建一个真实对象或类的代理。 代理模式有3个必要的元素: 1. 真实的对象(执行业务逻辑,被代理的对象) ...
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...
java的23种设计模式之代理模式, 详细的代码例子。