今天是学习Spring的第二天,看到了AOP,即AspectOrientedProgramming 面向切面编程,
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。下面我就用一个实例演示面向切面编程中动态代理的过程。
首先把需要的类引入进来
User类:
package com.spring.model;
public class User {
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
接口UserDao:
package com.spring.dao;
import com.spring.model.User;
public interface UserDao {
public void save(User u);
public void delete();
}
UserDaoImpl:
package com.spring.dao.impl;
import com.spring.dao.UserDao;
import com.spring.model.User;
public class UserDaoImpl implements UserDao{
public void save(User u) {
System.out.println("user saved !");
}
public void delete()
{
System.out.println("delete ok !");
}
}
好了,下面我们要做的事就是写出一个UserDaoImpl类的动态代理类,这个代理类实现的功能是在调用UserDaoImpl类方法的时候提示该方法已经开始执行的语句。代理类LogInterceptor,他实现了InvocationHandler接口
package com.spring.aop; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class LogInterceptor implements InvocationHandler { private Object target; //接收被代理类的对象 public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } public void beforeMethod(Method m) { System.out.println(m.getName()+" start !"); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { beforeMethod(method); method.invoke(target, args); return null; } }
在接口方法invoke(Object proxy, Methodmethod, Object[] args)里,将目标类实例传给method.invoke()方法,通过反射调用目标类方法。最后就是生成代理类对象并初始化,调用方法查看结果,完成切面编程的过程。以junit进行单元测试,代码如下
@Test public void taestProxy() { UserDao userDao = new UserDaoImpl(); LogInterceptor li = new LogInterceptor(); li.setTarget(userDao); //为编织了目标业务类逻辑和横切逻辑的LogInterceptor创建代理类 UserDao proxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), li); proxy.save(new User()); proxy.delete(); }
上面的代码完成了业务类代码和横切代码编织和接口代理实例生成的工作,其中在li.setTarget(userDao)处,我们将LogInterceptor实例编织为一个包含业务逻辑和横切逻辑实例,然后在newProxyInstance处,通过Proxy的静态方法newProxyInstance()为融合了业务类逻辑和横切逻辑的LogInterceptor创建一个UserDao接口的代理实例,该方法的第一个入参为类加载器,第二个入参为创建的代理实例所要实现的一组接口,第三个参数是整合了业务逻辑和横切逻辑的编织器对象。简言之这三个参数分别是UserDaoImpl的类加载器、UserDao接口、实现了代理的类LogInterceptor对象,此时UserDaoImpl是被代理的对象
运行结果如下
相关推荐
结合spring框架实现的动态代理代理,spring,Proxy
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
springAOP配置实现动态代理,有利于熟悉动态代理原理,深入了解spring。
JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于代理没有实现接口的类或final类。CGLIB(Code Generation Library)是一个代码生成的类库,...
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
spring aop jdk 动态代理的底层实现解析模拟
Spring MVC中利用动态代理记录日志,通过注解的方式记录日志。Spring MVC+ Restful。
静态代理的实现,动态代理实现,spring代理实现项目源代码
JavaEE spring半自动实现AOP代理
对spring代理机制的实现和原理的详细讲解
主要介绍了Spring CGLlB动态代理实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口,则没办法代理这个类。 cglib代理, 1.cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在...
AOP动态代理描述了Spring AOP中使用Java高级技术功能实现的动态代理,为Spring IOC等高级开发实现了逻辑功能;
Spring整合JDBC实现转账业务-动态代理模式demo源代码,在这里我们我们对其Spring整合JDBC实现转账业务进行优化更新,使其业务层完全脱离我们的事务书写,我们采用的时候动态代理模式
java 动态代理实现,模拟了spring实现aop的原理,对学习面向切面编程的朋友有帮助!
NULL 博文链接:https://arne3166.iteye.com/blog/1046340
Spring实现自动代理Demo,BeanNameAutoProxyCreator的运用,学习参考原理
实现将一个接口动态代理,并将该代理对象在spring容器初始化完成前注册到spring容器中。实现可以通过@Autowired等注释或其他方法从spring容器中获取该代理对象
实现动态代理的两种方式: 第一种是JDK提供的基于接口的动态代理,要求被代理的类必须至少实现一个接口。 2. 第二种是第三方cglib提供的基于子类的动态代理,。至少要继承一个类。 我们这里 来讲解,动态代理,以及...
该资源包含了三种不同方式实现的代理模式,喜欢的下载。