Spring 实现动态代理 附源码
2014-02-26 22:34
351 查看
spring 实现动态代理几个步骤:
1、写一个类 (LoggerProxy)实现invocationHandle 接口中的invoke方法;
2、创建需要代理的对象
3、LoggerProxy 构造方法设置为私有,创建一个方法来生成对象,这个方法的对象时要代理的对象;
getInstance所返回的对象就是代理对象;
4、设置代理对象以后,不管这个代理对象执行什么方法,都会调用以下invoke的方法: 配置xml文件;
到层关键代码:
@Repository("userDao") (??实现IuserDao接口)
public class UserDao implements IUserDao {
@Override
public void add(User user) {
}
@Override
public void delete(int id) {
}
@Override
public User load(int id) {
}
}
5.在需要调用的服务类中注入动态代理对象:
@Service("userService")
public class UserService implements IUserService {
private IUserDao userDao;
private IUserDao userJDBCDao;
---- ---- --- ---
// 注入IUserDao 接口的动态代理类
//?? 可以理解为IUserDao 接口是用userDynamicDao实现的???
@Resource(name="userDynamicDao")
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
}
}
package org.zttc.itat.spring.log;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/*
* 1 写一个类实现invocation //
*
* */
public class LoggerProxy implements InvocationHandler {
private LoggerProxy(){
}
//创建一个代理对象
private Object target;
//getinstance
public static Object getInstance(Object o){
//创建logger对象
LoggerProxy loggerProxy = new LoggerProxy();
//设置代理对象 //在初始化被注入的时候 target被初始化成o
loggerProxy.target = o;
// 通过Proxy的方法创建代理对象,第一个参数是要代理对象的classLoader,第二个参数是
//要代理对象实现的所有接口,第三个参数是实现类InvocationHandler的对象
Object result = Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(),loggerProxy );
return result;
}
//当有了代理对象之后,不管这个代理对象执行什么方法,都会调用以下的invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//method 就是被代理类里方法;可以控制那些方法增加操作
//Object proxy 就是getInstance(Object o)生成的对象、
//args
//执行特定方法 //method.getName() 返回方法名
if(method.getName().equals("add")){
Logger.info("进行了相应的操作");
}
//target //创建的对象target;
Object o = method.invoke(target, args);
return o;
}
}
<?xml version="1.0" encoding="UTF-8"?>
1、写一个类 (LoggerProxy)实现invocationHandle 接口中的invoke方法;
2、创建需要代理的对象
3、LoggerProxy 构造方法设置为私有,创建一个方法来生成对象,这个方法的对象时要代理的对象;
getInstance所返回的对象就是代理对象;
4、设置代理对象以后,不管这个代理对象执行什么方法,都会调用以下invoke的方法: 配置xml文件;
到层关键代码:
@Repository("userDao") (??实现IuserDao接口)
public class UserDao implements IUserDao {
@Override
public void add(User user) {
}
@Override
public void delete(int id) {
}
@Override
public User load(int id) {
}
}
5.在需要调用的服务类中注入动态代理对象:
@Service("userService")
public class UserService implements IUserService {
private IUserDao userDao;
private IUserDao userJDBCDao;
---- ---- --- ---
// 注入IUserDao 接口的动态代理类
//?? 可以理解为IUserDao 接口是用userDynamicDao实现的???
@Resource(name="userDynamicDao")
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
}
}
package org.zttc.itat.spring.log;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/*
* 1 写一个类实现invocation //
*
* */
public class LoggerProxy implements InvocationHandler {
private LoggerProxy(){
}
//创建一个代理对象
private Object target;
//getinstance
public static Object getInstance(Object o){
//创建logger对象
LoggerProxy loggerProxy = new LoggerProxy();
//设置代理对象 //在初始化被注入的时候 target被初始化成o
loggerProxy.target = o;
// 通过Proxy的方法创建代理对象,第一个参数是要代理对象的classLoader,第二个参数是
//要代理对象实现的所有接口,第三个参数是实现类InvocationHandler的对象
Object result = Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(),loggerProxy );
return result;
}
//当有了代理对象之后,不管这个代理对象执行什么方法,都会调用以下的invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//method 就是被代理类里方法;可以控制那些方法增加操作
//Object proxy 就是getInstance(Object o)生成的对象、
//args
//执行特定方法 //method.getName() 返回方法名
if(method.getName().equals("add")){
Logger.info("进行了相应的操作");
}
//target //创建的对象target;
Object o = method.invoke(target, args);
return o;
}
}
<?xml version="1.0" encoding="UTF-8"?>
相关文章推荐
- Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程
- Spring AOP源码解析——AOP动态代理原理和实现方式
- 静态代理、JDK动态代理、CGLIB动态代理、Spring实现AOP、IOC+AOP
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务
- Spring 容器AOP的实现原理——动态代理
- spring动态代理实现计算器
- JAVA的动态代理机制及Spring的实现方式
- Spring2.5学习4.2_Proxy实现动态代理(目标类实现任意接口)
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- Spring动态代理实现
- Spring中AOP的实现原理(动态代理)
- AOP 动态代理模式(Spring反射实现 )
- [原创]JAVA的动态代理机制及Spring的实现方式
- Spring中AOP实现的两种方式之JDK和cglib的动态代理
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- Java的动态代理机制及Spring的实现方式
- Spring2.5学习4.2_Proxy实现动态代理(目标类实现随意接口)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)