一、Spring中的Advisor,Advice,Point概述
1、Advisor:充当Advice和Pointcut的适配器,类似使用Aspect的@Aspect注解的类(前一章节所述)。一般有advice和pointcut属性。
祖先接口为org.springframework.aop.Advisor,应用中可直接使用org.springframework.aop.support.DefaultPointcutAdvisor
2、Advice:用于定义拦截行为,祖先接口为org.aopalliance.aop.Advice,该接口只是标识接口,应用中可直接实现BeforeAdvice ,ThrowsAdvice,MethodInterceptor ,AfterReturningAdvice ,IntroductionInterceptor 等子接口
3、Pointcut:用于定义拦截目标集合,祖先接口为org.springframework.aop.Pointcut
二、Spring中的Advisor,Advice,Point的应用
1、编写Advisor实现类
在此可直接使用org.springframework.aop.support.DefaultPointcutAdvisor
2、编写Advice实现类
public class PlayAdvice implements MethodBeforeAdvice{
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("my before advice");
// method.invoke(target, args); 如果再调用这句,则目标方法会执行多一次
}
}
3、编写Pointcut实现类
public class PlayPointcut implements Pointcut {
public ClassFilter getClassFilter() {
return new PlayClassFilter();
}
public MethodMatcher getMethodMatcher() {
return new PlayMethodMatcher();
}
}
//PlayClassFilter的定义
class PlayClassFilter implements ClassFilter {
public boolean matches(Class clazz) {
if(clazz.getSimpleName().equals("Play"))
return true;
return false;
}
}
//PlayMethodMatcher的定义
class PlayMethodMatcher implements MethodMatcher {
public boolean isRuntime() {
return true;
}
public boolean matches(Method method, Class c) {
if(c.getSimpleName().equals("Play")&&method.getName().contains("Service"))
return true;
return false;
}
public boolean matches(Method method, Class c, Object[] args) {
if(c.getSimpleName().equals("Play")&&method.getName().contains("Service"))
return true;
return false;
}
}
4、编写目标类
public class Play {
public void playService(String what){
System.out.println("play "+what);
}
}
5、在配置文件中配置
<bean id="adviceBean" class="com.hss.sp.aop.PlayAdvice"/>
<bean id="pointcutBean" class="com.hss.sp.aop.PlayPointcut"/>
<bean id="playService" class="com.hss.sp.service.Play"/>
<bean
class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="adviceBean"></property>
<property name="pointcut" ref="pointcutBean"></property>
</bean>
6、测试,结果
BeanFactory bf=new ClassPathXmlApplicationContext("applicationContext.xml");
Play play=(Play)bf.getBean("playService");
play.playService("pingpong");
输出:
my before advice
play pingpong
分享到:
相关推荐
通常,我们会创建一个切面类(Aspect),在这个类中定义pointcut和advice,然后在Spring配置文件中声明这个切面,使其生效。例如: ```java @Aspect public class LoggingAspect { @Before("execution(* ...
在示例中,`<aop:advisor>`元素使用了`<tx:advice>`来定义事务管理策略。`<tx:method>`元素用于指定不同方法名前缀(如`delete*`,`save*`,`update*`)对应的事务属性,如回滚规则。通过将这些配置与切入点表达式`...
### Spring中的Aspect与Advisor区别详解 #### 一、引言 在Spring框架中,面向切面编程(AOP)是一种非常强大的技术,它允许开发者将横切关注点(如日志记录、安全性检查等)从业务逻辑中分离出来。本文旨在深入...
在 Spring AOP 中,Advisor 是一个组合了通知(Advice)和切入点(Pointcut)的对象,它定义了何时以及如何执行特定的操作。 首先,我们要理解 AOP(面向切面编程)的核心概念。AOP 是一种编程范式,旨在减少代码...
Advice在Spring AOP中扮演着关键角色,它是切面的具体实现,即在特定连接点(Join Point)执行的代码片段。 **Advice类型** 1. **Before Advice**:在目标方法被调用之前执行,可以用来进行预处理或验证。例如,它...
总之,Spring AOP是Java开发中实现关注点分离的强大工具,通过理解advice、pointcut和advisor这三个核心概念,我们可以有效地利用它来提高代码的可维护性和可扩展性。对于初学者来说,通过实践和理解这些概念,可以...
Advisor是Pointcut和Advice的组合,它将Pointcut表达式与Advice逻辑结合起来,使得在满足Pointcut条件的连接点上应用Advice变得简单。 4. **准备工作**: 在使用Spring AOP之前,需要设置开发环境,包括JDK、...
在Spring AOP中,主要有三个核心概念:Advice、Pointcut和Advisor。 1. Advice(通知): Advice描述了在特定连接点(Join Point)上执行的动作。在Spring AOP中,Advice主要与方法调用相关,用于向现有方法添加...
在Spring AOP框架中,Pointcut(切入点)是AOP的核心概念之一,它定义了哪些Joinpoint(连接点)会被通知(Advice)所影响。在实际开发过程中,我们常常需要对切入点进行更精细的控制,例如只对某些方法或类应用增强...
Spring AOP的配置通常在Spring的XML配置文件中完成,通过`<aop:config>`标签开启AOP支持,然后使用`<aop:advisor>`定义Advisor,指定advice和pointcut。在例子中,BeanImpl类的theMethod()方法会在执行前调用`...
总的来说,Spring AOP通过组合Advice、Pointcut和Advisor,以及使用`ProxyFactoryBean`生成的代理对象,实现了面向切面的编程。这种机制使得我们可以优雅地解耦关注点,提高代码的可维护性和可扩展性。通过深入理解...
在源码中,`Advisor`、`Pointcut`和`Advice`等接口是描述切面的关键,而`ProxyFactoryBean`或`AspectJAutoProxyCreator`则是创建代理对象的工具。 Spring还提供了大量的模块,如数据访问/集成(DAO)、Web MVC、JMS...
Spring AOP的配置通常是在Spring的XML配置文件中完成的,通过`<aop:config>`标签定义Advisor,`<aop:pointcut>`定义Pointcut,并使用`<aop:advisor>`将Advice和Pointcut关联起来。此外,Spring还支持基于注解的AOP...
7.4. Spring里的advisor(Advisor) API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”...
是pointcut和advice的装配器,是将advice注入主程序中预定义位置的代码 三、AOP实现方式 依据织入方式的不同,分为 1、编译期织入 2、类加载器织入 3、动态代理织入 AspectJ:1,2 Spring AOP:3
在本篇博文中,我们将深入探讨Spring AOP(面向切面编程)的使用,特别是如何通过Advisor指定切入点。Spring AOP是Spring框架的核心组件之一,它允许我们在不修改业务代码的情况下,实现对程序运行时行为的拦截和...
<aop:advisor pointcut-ref="businessServiceMethods" advice-ref="transactionAdvice"/> ``` 上述配置表示,所有`com.example.service`包下的类的所有公共方法都将应用事务通知。 4. **被注入的目标对象**:...
Advice PointCut (次要业务) (目标对象和目标方法) ClassFilter MethodMatcher (判断当前被拦截对象是不是当前顾问需要管理对象) (当前被拦截的方法是不是我们所需要主要业务方法) person对象。eat()
<aop:advisor advice-ref="txAdvice" pointcut-ref="businessServicePointcut"/> ``` 这段代码配置了一个事务管理器,并定义了一个事务顾问(`tx:advice`),该顾问指定了不同方法名前缀对应的不同事务传播行为。...