Spring——jdk动态代理

原创 2016年05月31日 21:12:42

Spring容器aop的实现使用的方式是jdk自带的动态代理,我们简单来了解下动态代理。

1.每个D层和D层实现的方法都是完成。

UserDao

public interface UserDao {

	public void addUser(String userId);
	
	public void dltUser(String UserId);
	
	public String modifyUser(String userId);
}

UserDaoImpl

public class UserDaoImp implements UserDao {

	public void addUser(String userId) {
		try {
			System.out.println("UserDaoImp.addUser" + userId);
		} catch (Exception e) {
			e.printStackTrace();
		}		
	}
		
	@Override
	public void dltUser(String UserId) {	
		System.out.println("UserDaoImp.dltUser" + UserId);
	}

	@Override
	public String modifyUser(String userId) {
		System.out.println("UserDaoImp.dltUser" + userId);
		return userId;
	}

}

2.现在要给每个方法加上一个功能,比如日志输出。System.out.println();我们采用方式有多中,

       1.直接在每个方法上添加对应的功能,这样不灵活,最不建议使用

        2.静态代理:StaticProxy实现UserDao接口,然后在StaticProxy类中的每个方法添加日志输出,然后调用UserDaoImpl的实现。这种方式不用修改以前的实现,但是在代理类中还是遇到了相同的问题(加上,和删除)。代理的类少的话,可以,多的话不建议。

        3.动态代理:输出日志是独立的功能(服务),

package com.tgb.stataicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class logHanderlar implements InvocationHandler {

	//传入目标对象,根据目标对象生成目标对象的代理对象
	private Object objecttager;
		
	public Object proxyIntance(Object objecttager){
		this.objecttager = objecttager;
		return Proxy.newProxyInstance(objecttager.getClass().getClassLoader(),
				objecttager.getClass().getInterfaces(), this);
	}
	
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		 //调用独立的功能(服务)
		 logOut();
		 //调用目标方法
		 Object	retObject = method.invoke(objecttager, args);
			
		
		return retObject;
	}
	
	//独立的功能(服务)
	public void logOut(){
		System.out.println("hello!");
	}

}

客户端调用:

package com.tgb.stataicproxy;

public class Client {
	public static void main(String[] args) {
		
		//实例化代理对象
		logHanderlar logHanderlar = new logHanderlar(); 
		//创建具体类的代理对象
		UserDao userDao = (UserDao)logHanderlar.proxyIntance(new UserDaoImp());
		
		//调用类的方法(中间执行代理类中附加的独立的功能服务)
		userDao.dltUser("hahah ");
	}
}
执行结果:

hello!
UserDaoImp.dltUserhahah


       动态代理,将要添加的方法放成一份,单独修改和维护,不用再每个方法中添加,而是在运行的时候加载上去。可以动态的给已有的方法在添加新的功能,为SpringAop提供了实现。



版权声明:本文不足之处在所难免,敬请各位批评指正,留下宝贵意见。

Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC

一、为什么需要代理模式 假设需实现一个计算的类Math、完成加、减、乘、除功能,如下所示: 1 package com.zhangguo.Spring041.aop01; 2 3 ...

JDK动态代理 spring aop 的原理

  • 2010年11月08日 23:43
  • 13KB
  • 下载

Spring-AOP-JDK动态代理

  • 2015年05月12日 13:45
  • 75KB
  • 下载

Spring的AOP实现使用的JDK的动态代理必须使用接口

今天,在项目中遇到一个问题,情况是这样的:在一个项目中,我配置了一个用以处理任务的工厂类,然后将这个工厂类注入到其他的service类中进行使用。在Spring中的配置如下:...
  • thjnemo
  • thjnemo
  • 2014年12月26日 14:18
  • 630

【Spring】jdk动态代理例子

DaoImpl类: public class PersonDaoImpl implements PersonDao{ @Override public void savePerson() { ...

spring AOP出现拦截无效的情况(一般是jdk动态代理失败)

springAOP 面向切面编程

由微见著!模拟JDK动态代理的实现2---Spring AOP

续: /**  * 测试端  * @author Administrator  *  */ public class Client { public static void ma...
  • O_ORick
  • O_ORick
  • 2017年06月23日 11:12
  • 164

Spring AOP的底层实现技术---JDK动态代理

    在JDK 1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例。在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在我们终于发现动态代理是实现AOP的绝好底层技术。  ...

spring的AOP(二)----JDK动态代理

JDK动态代理在1.3的时候引入,其底层需要依赖一个工具类java.lang.reflect.Proxy和一个接口java.lang.reflect.InvocationHandlerJDK 动态代理...

Java设计模式(七) Spring AOP JDK动态代理 VS. cglib

Spring的AOP有JDK动态代理和cglib两种实现方式。JDK动态代理要求被代理对象实现接口;cglib通过动态继承实现,因此不能代理被final修饰的类;JDK动态代理生成代理对象速度比cgl...
  • Habren
  • Habren
  • 2016年05月06日 07:49
  • 811
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring——jdk动态代理
举报原因:
原因补充:

(最多只允许输入30个字)