public interface PersonDao {
public void Song(String name);
public void Dance(String name);
}
1.首先创建一个dao层接口,任意方法,
接着实现接口方法(@Repository是spring中的bean的注解)
@Repository
public class PersonDaoImpl implements PersonDao{
@Override
public void Song(String name) {
System.out.println("刘德华唱了一首"+name);
}
@Override
public void Dance(String dance) {
System.out.println("刘德华跳了一个"+dance);
}
}
。。创建日志工具类(这里根据需求设置参数)
public class LogFactroy {
public static void LogBefore(String dao,String method,Object... args){
System.out.println("前置日志是:当前执行的是"+dao+"的"+method+"的方法,参数是"+args);
}
public static void LogAfter(String dao,String method,Object... args){
System.out.println("后置日志是:当前执行的是"+dao+"的"+method+"的方法,参数是"+args);
}
public static void LogThrowing(String method,Exception e){
System.out.println("异常日志是:当前异常的的是"+method+"方法,错误是"+e);
}
public static void LogAfterReturn(String dao,String method,Object result){
System.out.println("返回日志是:当前返回的的是"+dao+"的"+method+"的方法的结果"+result);
}
3.创建代理对象
步骤如下①创建静态方法
②通过"Proxy"类提供的一个newProxyInstance方法用来创建一个对象的代理对象newProxyInstance方法用来返回一个代理对象
3个参数分别为ClassLoader loader,Class<?>[] interfaces, InvocationHandler h
ClassLoader loader用来指明生成代理对象使用哪个类装载器
Class<?>[] interfaces用来指明生成哪个对象的代理对象
InvocationHandler h会重写一个方法,用来指明产生的这个代理对象要做什么事情(在这个方法里去调用我们写好的日志工具)
public class PersonDaoProxy {
public static Object createPersonProxy(Object target){
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=null;
try {
try {
LogFactroy.LogBefore(target.getClass().getName(),method.getName(),args);
// 调用目标对象的方法
result=method.invoke(target,args);
LogFactroy.LogAfter(target.getClass().getName(),method.getName(),args);
}finally {
LogFactroy.LogAfterReturn(target.getClass().getName(),method.getName(),result);
}
}catch (Exception e){
LogFactroy.LogThrowing(method.getName(),e);
}
return result;
}
});
}
}
4.测试
<!--JUnit4测试单元-->
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class AppTest
{
/**
* Rigorous Test :-)
*/
<!--Spring自动注入(xml需配置包扫描
<context:component-scan base-package="cn.pht"></context:component-scan>)-->
@Autowired
PersonDao personDao;
@Test
public void test1(){
<!--用代理对象类PersonDaoProxy的方法去运行对象(才会调用代理对象类中的代理方法)-->
PersonDao personDaoProxy= (PersonDao) PersonDaoProxy.createPersonProxy(personDao);
personDaoProxy.Dance("江南style");
personDaoProxy.Song("王妃");
}
本文介绍了一个具体的Java代理模式实现案例,展示了如何通过代理模式在不修改原有代码的情况下添加额外的功能,如日志记录等。文章详细解释了创建代理对象的过程,并提供了一个简单的测试示例。
308

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



