在「spring AOP (4) 基础知识-代理」中给大家讲解了什么是代理,有什么弊端。
java的动态代理比代理的思想更前进了一步。
首先我们要创建一个代理类,它必须实现java.lang.reflect.InvocationHandler接口。
DynamicProxyHandler:
package spring3.aop.aop3; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DynamicProxyHandler implements InvocationHandler { // 目标对象 private Object proxied; public DynamicProxyHandler(Object proxied) { this.proxied = proxied; } /** * invoke. * * @param proxy (最终生成的)代理实例,不是目标对象(一般情况下不会用到) * @param method 要调用的方法 * @param args 要调用方法的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("----START----"); // method.invoke是java反射的知识 Object obj = method.invoke(proxied, args); System.out.println("----END----"); return obj; } }
接口Interface1
package spring3.aop.aop3; public interface Interface1 { public void do1(); public void do2(String str); }
接口Interface2
package spring3.aop.aop3; public interface Interface2 { public void exe1(); public void exe2(String str); }
目标对象类,Target实现了两个接口Interface1, Interface2
package spring3.aop.aop3; public class Target implements Interface1, Interface2 { @Override public void do1() { System.out.println("Target.do1()"); } @Override public void do2(String str) { System.out.println("Target.do2(" + str + ")"); } @Override public void exe1() { System.out.println("Target.exe1()"); } @Override public void exe2(String str) { System.out.println("Target.exe2(" + str + ")"); } }
基本的组件我们创建完成了,看看如何利用这些组件:
package spring3.aop.aop3; import java.lang.reflect.Proxy; public class ProxyMain { /** * @param args */ public static void main(String[] args) { Object obj = Proxy.newProxyInstance(Interface1.class.getClassLoader(), new Class<?>[] { Interface1.class, Interface2.class }, new DynamicProxyHandler(new Target())); Interface1 if1 = (Interface1) obj; if1.do1(); if1.do2("test"); Interface2 if2 = (Interface2) obj; if2.exe1(); if2.exe2("test"); } }
运行结果:
----START---- Target.do1() ----END---- ----START---- Target.do2(test) ----END---- ----START---- Target.exe1() ----END---- ----START---- Target.exe2(test) ----END----
以上就是java的动态代理,现在我来讲解下测试累的main方法
在main中
通过静态方法Proxy.newProxyInstance()来创建动态的代理。
这个方法需要三个参数:
①类加载器:可以通过已加载对象,获得类加载器。例如:Interface1.class.getClassLoader()
②希望被代理的接口列表,是个Class数组。例如:new Class<?>[] { Interface1.class, Interface2.class }
③java.lang.reflect.InvocationHandler接口的一个实现类。
动态代理就是将所有调用重定向到调用处理器(DynamicProxyHandler),一般会向调用处理器传递一个目标对象(例如:DynamicProxyHandler的构造函数public DynamicProxyHandler(Object proxied)),调用器在在执行中介任务时,将请求转发给目标对象。
相关推荐
了解这些基础知识可以帮助我们更好地掌握 Spring AOP 的实现细节。在分析源码时,可以参考作者的源码注释和相关文章,以便更深入地理解每一步操作。 总的来说,Spring AOP 通过动态代理技术实现了切面的插入,使得...
8. **org.springframework.asm-3.0.5.RELEASE.jar**:这个库提供了对Java字节码的读取、修改和生成的功能,Spring AOP在动态代理过程中可能会用到。 9. **aopalliance-1.0.jar**:AOP Alliance是AOP框架间的一个互...
一、Spring AOP基础知识 1. **什么是AOP**:AOP是一种编程范式,用于处理系统中的横切关注点,即那些跨越多个类或方法的共同功能,如事务管理、日志记录等。AOP通过切面(Aspect)将这些关注点与业务逻辑分离,提高...
【标题】"spring-aop.rar_java aop_spring aop" 涉及的主要知识点是Spring框架中的面向切面编程(AOP)以及Java基础知识。这个压缩包可能包含了一个简单的Spring AOP应用示例,同时也涵盖了Java的一些核心概念,如...
本篇文章将探讨如何通过JDK动态代理实现Spring AOP的基础知识。 首先,我们要理解什么是JDK动态代理。在Java中,动态代理机制允许我们在运行时创建一个实现了特定接口的新类。这个新类的实例可以代理目标对象,执行...
5. **代理(Proxy)**:Spring AOP 使用动态代理技术创建对象,有两种代理方式:JDK 动态代理和 CGLIB 代理。前者适用于接口实现类,后者适用于没有接口的类。 6. **注解使用**:如 @Aspect、@Before、@After、@...
在Spring框架4.*版本中,可能会遇到一个常见问题,即缺少`spring-cglib-repack-3.2.5.jar`和`spring-objenesis-repack-2.6.jar`这两个jar...了解这些基础知识对于理解和优化Spring应用的性能、处理相关问题都非常重要。
- **代理模式**:Spring支持两种代理,JDK动态代理和CGLIB代理。JDK代理适用于实现了接口的类,而CGLIB代理则用于没有实现接口的类。 - **注解驱动的AOP**:通过在类或方法上使用特定的注解(如`@Aspect`, `@...
本教程将带你了解Spring AOP的基础知识,帮助你入门这一强大技术。 ### 一、什么是AOP AOP是一种编程范式,旨在解决程序中的横切关注点问题,这些关注点通常与业务逻辑无关,但又需要在多个地方被调用,如日志记录...
对于接口,Spring使用Java动态代理(JDK Proxy)创建代理对象;而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在方法调用前后插入切面逻辑。 接下来,我们转向DataSource的...
本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...
- **Spring AOP**:基于纯Java实现,运行时通过动态代理进行织入,使用JDK或CGLib动态代理。 4. **基础知识** - Spring AOP通过动态代理技术在运行时织入增强代码,采用JDK动态代理或CGLib动态代理两种机制。 - ...
了解了这些基础知识,我们可以通过以下几个步骤在Spring中使用AOP: 1. 定义切面:创建一个类,并使用`@Aspect`注解标记为切面。 2. 定义切点:在切面类中,使用`@Pointcut`定义切点表达式。 3. 编写通知:使用`@...
本示例将深入探讨Spring AOP的基础知识,以及如何在实际应用中使用它。 首先,我们来看"LogProfilter.java",这很可能是实现一个日志拦截器的类。在Spring AOP中,这样的类通常被称为切面(Aspect)。切面是封装了...
- `AspectException.java`定义了一个异常类,用于表示所有的AOP基础架构异常。从类的继承结构来看,`AspectException`是运行时异常(RuntimeException),代表这类异常是不检查的(unchecked)。它们通常被认为是...
总结,这个"SpringAOP简单项目实现"涵盖了Spring AOP的基础知识,包括切面、通知、切入点的定义与配置,以及如何在实际项目中使用Maven进行构建和依赖管理。对于初学者来说,这是一个很好的实践案例,能够帮助他们...
Spring AOP基础** - **切⾯编程**: AOP允许开发者将横切关注点(如日志、事务、安全性等)定义为独立的模块,称为切面。切面可以包含通知(advice)、切入点(pointcut)和其他元数据。 - **通知(Advice)**: 通知...
基础知识涉及Spring的核心概念,如Bean管理、XML与注解配置、IoC容器。进阶部分将涵盖Spring MVC、数据访问(如JdbcTemplate和Hibernate集成)、事务管理、Spring Boot的自动配置等。源码分析可以帮助你理解Spring的...
**一、Spring AOP基础知识** 1. **切面(Aspect)**:切面是跨越多个对象的行为或关注点的模块化。在Spring AOP中,切面由通知(advises)和切点(pointcuts)定义。 2. **通知(Advice)**:通知是在特定连接点上...
6. **Spring MVC基础知识**:虽然主要讲解AOP,但实例可能也会涵盖Spring MVC的基础,如DispatcherServlet、ModelAndView、@RequestMapping等。 7. **运行和测试**:实例可能包括如何配置和启动Spring项目,以及...