AOP是Spring的重要组成部分,而AOP正是通过代理实现的。如果代理对象实现了接口,则默认使用jdk动态代理,也可强制使用cglib代理,如果未实现接口则只能使用cglib代理。
JDK动态代理: https://chenjumin.iteye.com/blog/2437314, https://chenjumin.iteye.com/blog/339554
CGLIB动态代理: https://chenjumin.iteye.com/blog/2437315
Spring提供三个代理处理类:ProxyFactory、ProxyFactoryBean、AspectJProxyFactory
先定义公共类:
public interface CountryMapper { void show(); } public class CountryMapperImpl implements CountryMapper { @Override public void show(){ System.out.println("invoke show..."); } } public class CustomMethodInterceptor implements MethodInterceptor{ @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("before..."); Object object = invocation.proceed(); System.out.println("after..."); return object; } } @Component("customMethodInterceptor2") public class CustomMethodInterceptor2 implements MethodInterceptor{ @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("2 before..."); Object object = invocation.proceed(); System.out.println("2 after..."); return object; } }
ProxyFactory的使用范例:
@Test public void test1()throws Exception{ //代理对象未指定接口,使用CGLIB生成代理类 ProxyFactory factory1 = new ProxyFactory(); //factory1.setExposeProxy(true); //对外发布代理对象,在目标对象方法中可以通过AopContext.currentProxy()访问当前代理对象 factory1.setTarget(new CountryMapperImpl()); factory1.addAdvice(new CustomMethodInterceptor()); CountryMapperImpl countryMapperImpl = (CountryMapperImpl) factory1.getProxy(); countryMapperImpl.show(); } @Test public void test2()throws Exception{ //代理对象指定接口,使用JDK Proxy生成代理类 ProxyFactory factory2 = new ProxyFactory(); //factory2.setExposeProxy(true); factory2.setInterfaces(new Class[] {CountryMapper.class}); factory2.setTarget(new CountryMapperImpl()); factory2.addAdvice(new CustomMethodInterceptor()); CountryMapper countryMapper = (CountryMapper) factory2.getProxy(); countryMapper.show(); }
ProxyFactoryBean的使用范例:
@Test public void test3()throws Exception{ //ProxyFactoryBean //AnnotationConfigApplicationContext 基于注解类的配置 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.seasy"); ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setBeanFactory(applicationContext.getBeanFactory()); proxyFactoryBean.setInterfaces(CountryMapper.class); proxyFactoryBean.setInterceptorNames("customMethodInterceptor2"); proxyFactoryBean.setTarget(applicationContext.getBean(CountryMapper.class)); applicationContext.getBeanFactory().registerSingleton("proxyFactoryBean", proxyFactoryBean); CountryMapper countryMapper2 = (CountryMapper)applicationContext.getBean("proxyFactoryBean"); countryMapper2.show(); }
AspectJProxyFactory的使用范例:
@Test public void test4()throws Exception{ //AspectJProxyFactory CountryMapper countryMapper3 = new CountryMapperImpl(); AspectJProxyFactory proxyFactory = new AspectJProxyFactory(); proxyFactory.setTarget(countryMapper3); proxyFactory.addAspect(MyAspect.class); proxyFactory.setProxyTargetClass(true); CountryMapper proxy = proxyFactory.getProxy(); proxy.show(); } @Aspect public class MyAspect { @Pointcut("execution(* com.seasy..*(..))") private void beforeAdd() {} @Before("beforeAdd()") public void before1() { System.out.println("-----------before-----------"); } }
相关推荐
Spring 动态代理是Spring框架中的一个重要特性,它允许我们在不修改原有代码的情况下,为对象增加额外的功能。这个"spring动态代理类的示范小版本,很简单的例子"应该是提供了一个简单易懂的示例,帮助我们理解...
Spring 动态代理是 Spring 框架中的一个重要特性,它允许我们在运行时自动生成代理对象,以便在方法调用前后执行额外的操作,比如事务管理、AOP(面向切面编程)等。动态代理主要涉及两个核心接口:`java.lang....
在Spring框架中,动态代理是一种重要的技术,它主要用于AOP(面向切面编程)场景,如日志记录、事务管理等。本篇文章将深入探讨Spring动态代理及其在Spring MVC中的应用,特别是在创建RESTful服务时如何利用注解来...
本篇文章将深入探讨Spring动态代理的原理,并通过代码示例来解析其工作流程。 首先,我们需要理解JDK中的动态代理机制。Java提供了一种称为接口代理的机制,即通过`java.lang.reflect.Proxy`类和`java.lang.reflect...
Spring框架提供了一种便捷的方式来实现动态代理,这使得我们可以在不修改原有代码的情况下扩展或增强已有功能。在本篇中,我们将深入探讨Spring如何使用动态代理以及其在实际开发中的应用。 动态代理的核心概念是...
Spring 动态代理二 Spring 框架中动态代理技术的应用是非常广泛的,今天我们将讨论 Dao 层和 Service 层的动态代理二。 Dao 层的动态代理二: Dao 层的动态代理二是通过 MapperScannerConfigurer 实现的。这是一...
在Spring框架中,动态代理是实现AOP(面向切面编程)的核心技术之一。它允许我们在不修改原有代码的情况下,为方法添加额外的功能,如事务管理、日志记录等。本篇文章将深入探讨Spring中的动态代理机制,以及它是...
Spring的核心特性之一就是它的动态代理机制,这使得我们可以实现面向切面编程(AOP)。本压缩包包含的是Spring动态代理中需要用到的一些关键第三方依赖,包括aopalliance-1.0.jar、aspectjrt-1.7.2.jar以及...
jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口,则没办法代理这个类。 cglib代理, 1.cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在...
在Spring框架中,动态代理是一种重要的机制,它主要用于AOP(面向切面编程)和事务管理。本篇文章将深入探讨Spring如何对Dao层和服务层进行动态代理,以及它与MyBatis集成的过程。 首先,Spring集成MyBatis的步骤...
在Spring框架中,动态代理和AOP(面向切面编程)是两个重要的概念,它们极大地增强了代码的可维护性和灵活性。下面将详细讲解这两个概念及其实际应用。 动态代理,是Spring提供的一种机制,允许我们在不修改原对象...
本资料“动态代理和注解Spring.rar”着重介绍了Spring框架中的两个关键概念:动态代理和注解的使用。 首先,我们来深入了解Spring中的动态代理。动态代理在Spring AOP(面向切面编程)中扮演着重要角色。AOP允许...
在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
### Spring的动态代理详解 #### 引言 在软件工程领域,代理模式是一种常见的设计模式,主要用于增强对象的功能,而不改变其原有的结构。Spring框架利用动态代理技术为Bean提供了横切关注点(如事务管理、日志记录...
Spring AOP允许我们通过代理来实现横切关注点,如日志、事务管理等,而JDK动态代理则是Spring AOP实现的一种方式。本文将深入探讨Spring如何利用JDK动态代理技术来实现这一功能,并通过实例解析其底层实现。 首先,...
总结来说,Spring的静态代理和动态代理都用于实现AOP,静态代理适用于简单场景,但需要手动编写代理类,而动态代理则更加灵活,可以在运行时动态创建代理对象,适用于接口众多的情况。了解和掌握这两种代理模式对于...
Spring 框架中 JDK 动态代理和 CGLIB 动态代理是 Spring AOP 中一个非常重要的知识点。Spring AOP 框架会根据实际情况选择使用 JDK 的动态代理还是 CGLIB 的动态代理。 JDK 动态代理是 Java 自带的动态代理机制,它...