上一篇文章是Spring AOP的单独代理,这一篇是关于Spring AOP的自动代理。其中的原理没必要多说,Spring AOP可以通过两种方式实现自动代理。下面就是分别介绍这两种方式。
1、使用
BeanNameAutoProxyCreator
1)首先创建Bean类
package com.javaeye.sunjiesh.proxy.auto;
public class HelloBeanA {
public void testHelloBeanA(){
System.out.println(this.getClass().getName()+" is running");
}
}
package com.javaeye.sunjiesh.proxy.auto;
public class HelloBeanB {
public void testHelloBeanB(){
System.out.println(this.getClass().getName()+" is running");
}
}
2)创建Advice类
package com.javaeye.sunjiesh.aop;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class AfterAdviceBean implements AfterReturningAdvice{
public AfterAdviceBean() {
// TODO Auto-generated constructor stub
}
@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
// TODO Auto-generated method stub
System.out.println("afterReturning is running");
}
}
package com.javaeye.sunjiesh.aop;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class BeforeAdviceBean implements MethodBeforeAdvice{
public BeforeAdviceBean() {
// TODO Auto-generated constructor stub
}
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("before is running");
}
}
3)创建xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="helloBeanA" class="com.javaeye.sunjiesh.proxy.auto.HelloBeanA"></bean>
<bean id="helloBeanB" class="com.javaeye.sunjiesh.proxy.auto.HelloBeanB"></bean>
<bean id="beforeAdvice" class="com.javaeye.sunjiesh.aop.BeforeAdviceBean"></bean>
<bean id="afterAdvice" class="com.javaeye.sunjiesh.aop.AfterAdviceBean"></bean>
<!-- 在此进行自动代理配置 -->
<bean id="beanNameAutoProxyCreator"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>helloBean*</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>beforeAdvice</value>
<value>afterAdvice</value>
</list>
</property>
</bean>
</beans>
4)创建测试类
package com.javaeye.sunjiesh.proxy.auto;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringAopMain {
public SpringAopMain() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"spring-beans3.xml");
HelloBeanA h1 = (HelloBeanA) ctx.getBean("helloBeanA");
h1.testHelloBeanA();
HelloBeanB h2 = (HelloBeanB) ctx.getBean("helloBeanB");
h2.testHelloBeanB();
}
}
5)输出
before is running
com.javaeye.sunjiesh.proxy.auto.HelloBeanA is running
afterReturning is running
before is running
com.javaeye.sunjiesh.proxy.auto.HelloBeanB is running
afterReturning is running
2、使用
DefaultAdvisorAutoProxyCreator
只要修改xml配置文件就可以了
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="helloBeanA" class="com.javaeye.sunjiesh.proxy.auto.HelloBeanA"></bean>
<bean id="helloBeanB" class="com.javaeye.sunjiesh.proxy.auto.HelloBeanB"></bean>
<bean id="beforeAdvice" class="com.javaeye.sunjiesh.aop.BeforeAdviceBean"></bean>
<bean id="afterAdvice" class="com.javaeye.sunjiesh.aop.AfterAdviceBean"></bean>
<!-- 在此进行自动代理配置 -->
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
<bean id="nameMatchMethodPointcutAdvisor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="beforeAdvice" />
<property name="mappedNames">
<list>
<value>test*</value>
</list>
</property>
</bean>
</beans>
分享到:
相关推荐
在 Spring AOP 的自动代理创建过程中,`AbstractAutoProxyCreator` 类起着关键作用。它实现了 `BeanPostProcessor` 接口,会在 Bean 初始化后对其进行处理,生成代理对象。`AbstractAutoProxyCreator` 会查找 Spring...
在实际项目中,还可以结合Spring的其他功能,如自动代理创建、注解驱动的AOP等,来进一步提高开发效率和代码质量。对于更复杂的需求,可以深入学习Spring AOP的源码,理解其底层实现机制,以便更好地利用这一强大...
6. **配置自动代理**:在某些情况下,可能需要自定义代理创建或禁用某些特性。可以通过`@EnableAspectJAutoProxy`注解在配置类中启用AspectJ支持,并调整其属性。 7. **调试与测试**:确保在测试中正确配置了AOP,...
- **自动模式**:指的是Spring AOP的自动代理创建功能,即不需要手动指定代理对象,而是通过配置自动创建。 - **AbstractAutoProxyCreator**:一个抽象类,它实现了自动创建代理对象的逻辑。 - **...
然而,如果需要更精细的控制,可以通过`@EnableAspectJAutoProxy`注解开启基于AspectJ的自动代理支持,或者通过`proxyTargetClass`属性来强制使用CGLIB代理。 总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态...
标题“spring-aop-aspectj-case”涉及到...综上所述,这个主题涵盖了Spring框架中的AOP概念,AspectJ的特性,以及两者的集成应用。通过深入理解和实践,开发者可以更好地管理和组织代码,提高系统的可维护性和灵活性。
Spring AOP通过代理模式实现了这一概念,允许开发者在不修改源代码的情况下插入额外的功能。 JDK动态代理是Java提供的一种创建代理对象的方式,它在运行时根据接口生成一个实现了这些接口的代理类。Spring AOP可以...
在本"Spring-AOP源码Demo"中,我们将深入探讨Spring AOP的工作原理以及如何通过源码学习其核心概念。 1. **AOP的基本概念** - **切面(Aspect)**:AOP的核心单元,它封装了横切关注点,包括通知(advice)、切入...
在spring-aop.jar中,`org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator`类负责自动创建代理并织入切面。 三、Spring AOP的使用 在实际应用中,我们可以利用Spring AOP进行日志记录、...
在本示例中,我们探讨的是如何在Spring Boot项目中使用Spring AOP(面向切面编程)实现环绕通知,以自动记录日志的功能。Spring AOP是Spring框架的一部分,它允许我们在不修改源代码的情况下,对应用程序进行横切...
AOP概念 - **切面(Aspect)**:切面是关注点的模块化,通常包括业务逻辑与横切关注点,如日志、安全检查等。 - **通知(Advice)**:通知是切面在特定连接点上执行的行为,如方法调用前、后、异常时等。 - **连接...
6. **自动代理(Auto-proxy)**:Spring提供自动代理机制,可以通过配置或注解来自动识别哪些bean应该被代理。`@EnableAspectJAutoProxy`注解可以开启基于AspectJ的自动代理。 7. **注解驱动的AOP**:从Spring 2.5...
**Spring AOP 学习笔记及实现Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的...
Spring与AspectJ的整合还提供了自动代理生成功能。当启用AspectJ注解驱动的AOP(`@EnableAspectJAutoProxy`),Spring会自动创建代理对象来处理通知。此外,还可以通过`@AspectJSupport`和`<aop:aspectj-autoproxy>`...
#### 三、Spring AOP 的关键概念 **1. Aspect (切面)** - 定义:用来描述横切关注点的模块化,比如日志记录、事务管理等。 **2. Advice (通知)** - 定义:在切面中的具体实现,即在特定的连接点上所执行的代码。 -...
5. **代理(Proxy)**:Spring AOP 使用动态代理技术创建对象,有两种代理方式:JDK 动态代理和 CGLIB 代理。前者适用于接口实现类,后者适用于没有接口的类。 6. **注解使用**:如 @Aspect、@Before、@After、@...
5. **代理(Proxy)**:Spring AOP通过动态代理机制创建目标对象的代理,代理对象在调用目标方法时会自动插入切面逻辑。在Java项目中,Spring可以使用JDK动态代理或CGLIB动态代理来创建代理对象。 在实际应用中,...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过...这个例子提供了学习Spring AOP实际操作的宝贵资源,通过阅读源码和运行测试,你将对Spring AOP有更全面的认识。
- 自动代理:Spring会根据配置自动生成代理对象,透明地处理切面逻辑。 7. **最佳实践**: - 尽量减少切面的粒度,避免过多的切面导致系统复杂性增加。 - 切面应该具有高度的重用性和独立性,避免与具体业务逻辑...
**Spring AOP 概念理解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它允许我们通过定义“切面”来模块化横切关注点,比如日志、事务管理、性能监控等。在传统的...