1.静态代理
静态代理 时序图:
[img]
[/img]
静态的代理
存在的问题:
1.需要建立大量的代理类
2.重复的代码会出现各个角落里。
接口
package com.test.dao;
public interface UserDao {
public void addUser(String userId,String userName);
public String findById(String id);
public void modifyUser(String userId,String userName);
}
实现类:
package com.test.dao;
public class userDaoImpl implements UserDao {
public void addUser(String userId, String userName) {
System.out.println("userDaoImpl----->addUser()"+userName);
}
public String findById(String id) {
// TODO Auto-generated method stub
return null;
}
public void modifyUser(String userId, String userName) {
// TODO Auto-generated method stub
}
}
静态代理类:
package com.test.dao;
public class userDaoImpl implements UserDao {
public void addUser(String userId, String userName) {
System.out.println("userDaoImpl----->addUser()"+userName);
}
public String findById(String id) {
// TODO Auto-generated method stub
return null;
}
public void modifyUser(String userId, String userName) {
// TODO Auto-generated method stub
}
}
调用的客户端:
package com.test.dao;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
UserDao userDao= new UserProxyImpl(new userDaoImpl());
userDao.addUser("a001", "郭靖");
}
}
2.动态代理:
动态代理 时序图:
[img]
[/img]
接口
package com.test.dao;
public interface UserDao {
public void addUser(String userId,String userName);
public String findById(String id);
public void modifyUser(String userId,String userName);
}
实现类:
package com.test.dao;
public class userDaoImpl implements UserDao {
public void addUser(String userId, String userName) {
System.out.println("userDaoImpl----->addUser()"+userName);
}
public String findById(String id) {
// TODO Auto-generated method stub
return null;
}
public void modifyUser(String userId, String userName) {
// TODO Auto-generated method stub
}
}
代理类:
package com.test.dao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogHendler implements InvocationHandler {
//声明目标对象 所有类用继承之Object
private Object targetObject;
//根据转入的对象创建代理类
public Object newProxyObject(Object targetObject){
this.targetObject=targetObject;
//返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader()
, targetObject.getClass().getInterfaces()
, this);
}
/**
* proxy - 在其上调用方法的代理实例
* method - 对应于在代理实例上调用的接口方法的 Method 实例
* args - 包含传入代理实例上方法调用的参数值的对象数组
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("代理start()------>"+method.getName());
//取方法参数个数
for(int i=0;i<args.length;i++){
System.out.println(args[i]);
}
//用作返回
Object ret=null;
try{
//调用对象方法,如果有返回则存入ret中返回结果
ret=method.invoke(this.targetObject, args);
System.out.println("代理success------>"+method.getName());
}catch(Exception e){
e.printStackTrace();
System.out.println("调用代理------>失败!");
}
return ret;
}
}
调用的客户端:
package com.test.dao;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// UserDao userDao= new UserProxyImpl(new UserDaoImpl());
//
// userDao.addUser("a001", "郭靖");
LogHendler hendler =new LogHendler();
//根据真实的类生成代理对象
UserDao userDao=(UserDao)hendler.newProxyObject(new UserDaoImpl());
userDao.addUser("aoo1", "郭靖");
}
}
3.项目应用动态代理做事务处理
public class TransactionHandler implements InvocationHandler {
//取得目标对象
private Object targetObject;
public Object newProxyObject(Object targetObject){
this.targetObject=targetObject;
//根据传入的对象产生目标对象
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader()
, targetObject.getClass().getInterfaces()
, this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object ret=null;
Connection conn=null;
try{
conn=ConnectionManager.getConnection();
//只对add,modify,del开头的方法,开启事务,对find开头方法不开启事务
if(method.getName().startsWith("add")||
method.getName().startsWith("modify")||
method.getName().startsWith("del")){
//开启事务
ConnectionManager.setAutoCommit(conn, false);
}
//调用目标方法,返回结果
ret=method.invoke(targetObject, args);
//如果是自动提交,则不要再重复提交
if(!conn.getAutoCommit()){
//提交事务
ConnectionManager.commit(conn);
}
}catch(AppException e ){
//事务回滚
ConnectionManager.rollback(conn);
throw e;
}finally{
ConnectionManager.closeConnection();
}
return ret;
}
}
分享到:
相关推荐
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
本资源包含了博主博客中的代码,用一个黄牛买票的例子帮助新手理解静态代理与动态代理的原理
java静态代理和动态代理的区别,及其例子
- 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...
自己写的小例子,供学习参考。 public class StaticProxy implements Hello{ private HelloSpecker helloSpecker; public StaticProxy() { } public StaticProxy(HelloSpecker helloSpecker) { super(); ...
一个静态代理和动态代理的小例子,开发时使用的工具是myeclipse,直接使用myeclipse工具导入即可,希望能 给大家理解这方面的入门知识带来些作用,同时也希望大家指出不足,我可以更加进行改进
这是一个基于spring AOP静态代理模拟的案例,可以更好的理解spring的aop作用
动态代理的代码例子 里面敲好了注释 搭配文章观看更好
静态代理demo,可以参考一下。这个是一个静态代理的例子。
对代理模式的介绍,静态代理,JDK动态代理,CGLIB动态代理的介绍,例子
两个示例都调用实例化视图类的 render 方法,静态代理版本使用简洁和干净的代码。 这可能是也可能不是一件好事,完全取决于您的要求、用法和观点。这个怎么运作一切都通过Statical\Manager运行。 创建每个静态代理...
java中代理的使用,包括静态代理、JDK动态代理、CGLIB动态代理的例子,想了解AOP和动态代理的童鞋可以看下
示例(1)静态代理(2)动态代理3. 通用类图4. 代理模式的优点二、jdk动态代理实现原理1. jdk动态代理源码分析(通过该示例学会阅读源码的方法)2.jdk动态代理生成的代理类的源码3.总结三、手写实现jdk动态代理 一、...
静态代理和动态代理(jdk动态代理),以及使用代理模式hook系统的startActivity(...),这块还涉及到反射的使用.使用的是一个现实生活中找代理买东西的例子1 . 静态代理,可以理解为我们没有时间自己亲自去买东西,于是...
这是一个demo,里面包含静态包含和动态包含的例子 使用这个demo进行不断调试,查看JDk内部代码,了解代理内部原理 参考这篇文章学习更轻松:https://blog.csdn.net/qq_42276808/article/details/110495122
例子 { " proxies " : [ { " context " : " /api " , " config " : { " target " : " http://example.com " , " changeOrigin " : true } } ], " port " : 8080 , " logLevel " : " dev
静态代理 动态代理(JDK代理,借口代理) package basicKnowledge.dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /* * JDK 动态代理...
网络应用程序,它通常代理实时或静态数据集。 它通过 URL 端点和规范化的 JSON 接口公开您的数据集。 静态数据集 - Dataportal 将 JSON 静态文件加载到 MongoDB 并使其可动态搜索。 远程数据集 - Dataportal 提供了...