以前,在看Spring AOP代理时,老是不明白书上说的Point Cut(切入点),Join Point(连接点), Advice(通知), Advisor(配置器),这些词倒底是什么意思,最近,看了好多遍,反复的测试,终于明白一些了.
Point Cut (切入点) = (Join Point 连接点的集合)
Advice (通知) 是要执行代理的代码
Advisor = Point Cut + Advice
其实一个类TestDaoImpl,如果想实现代理,首先要实现一个接口TestDao,然后再要有一个代理类,如日志代理 (MyLoggerProxy), MyLoggerProxy这个类要实现 Advice(通知)其中的一个方法,Advice有五种类型 Interception, Around,Before, After Running, Throw , Introduction. 然后再在bean配置文件中,配置一下。具体代码如下:
TestDaoImpl.java (以下的连接点1 + 连接点2 + 连接点3 = Point Cut )
public class TestDaoImpl implements TestDao{
public void doFristTask() //这里就是一个 Join Point (连接点1)
{
// do task 1
}
public void doSecondTask() //这里就又是一个 Join Point (连接点2)
{
// do task 2
}
public void doThreeTask() //这里就又是一个 Join Point (连接点3)
{
// do task 3
}
}
MyLoggerProxy.java
public class MyLoggerProxy implements MethodInterceptor {
private Logger logger = Logger.getLogger(this.getClass());
//通知Advice
public Object invoke(MethodInvocation in) throws Throwable {
logger.log(Level.INFO, "代理类之前执行...");
Object result = in.proceed(); //这里执行了 target 类
logger.log(Level.INFO, "代理类之后执行...");
return result;
}
}
第一种在application.xml文件中配置的方法:(这里是针对所有的方法)
<bean id="testDao" class="com.gc.dao.TestDao"/>
<bean id="myLoggerProxy" class="com.gc.dao.MyLoggerProxy"/>
<bean id="logProxy"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">//代理接口
<value>com.gc.dao.TestDao</value>
</property>
<property name="target">//要代理的类,实现了TestDao接口
<ref bean="testDao" />
</property>
<property name="interceptorNames">//代理类
<list>
<value>myLoggerProxy</value>
</list>
</property>
</bean>
第二种在application.xml文件中配置的方法:(这里是针对特定的方法)
<bean id="testDao" class="com.gc.dao.TestDao"/>
<bean id="myLoggerProxy" class="com.gc.dao.MyLoggerProxy"/>
<!--配置器-->
<bean id="logAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="myLoggerProxy" />
</property>
<property name="patterns">
<value>.*do.*</value>
</property>
</bean>
<!--代理类-->
<bean id="logProxy"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.gc.dao.TestDaoImpl</value> <!--如果是CGLIB代理,设置proxyTargetClass为true-->
</property>
<property name="target">
<ref bean="testDao" />
</property>
<property name="interceptorNames">
<list>
<value>logAdvisor</value>
</list>
</property>
</bean>
测试类:
ApplicationContext actx = new FileSystemXmlApplicationContext("src/applicationContext.xml");
TestDao test = (TestDao) actx.getBean("logProxy");
test.doFristTask();//这里doFristTask是testDaoImpl里的一个方法
//结果:
Info --- 代理类之前执行.
// Do Task 1
Info --- 代理类之后执行
//完成测试
分享到:
相关推荐
Spring AOP代理详细介绍 前言: 一开始我对spring AOP还是属于一知半解的状态,这几天遇到一个问题,加上又查看了一些Spring相关知识,感觉对这个问题有了更深刻的认识。所以写下来分享一下。 我们知道,Spring支持...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
### Spring AOP 代理模式详解 #### 一、Spring AOP 概述 Spring AOP(面向切面编程)是Spring框架中的一个核心组件之一,主要用于实现横切关注点(Cross-cutting Concerns)的模块化。在软件开发中,常常会遇到...
Spring AOP代理是框架为实现切面功能创建的对象,它在运行时实现切面协议。Spring提供了两种代理方式:JDK动态代理和CGLIB代理。JDK代理适用于那些实现了接口的类,而CGLIB代理则适用于没有实现接口的类。 引介...
Spring AOP 代理一、两种代理方式1. JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。二
在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...
描述中的"自己写的aop代理spring"意味着我们将学习如何自定义AOP代理来增强Spring的功能。在Spring中,有两种类型的代理:JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的类,而CGLIB代理则用于没有接口或者...
Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中...
`aop-jar`这个压缩包可能包含了Spring AOP的实现类、接口、以及其他相关的辅助类,例如动态代理类、切点匹配器等。在项目中,我们通常会将这个jar包引入到类路径下,以便使用Spring AOP的功能。 总的来说,Spring ...
在Spring AOP中,有两种主要的代理方式:静态代理和动态代理。 1. **静态代理**:在静态代理中,我们需要手动创建一个代理类来包裹原始对象,并在代理类中实现相同的方法。例如,在给定的示例中,`UserImpl`是原始...
Spring AOP会为每个目标对象创建一个子类,并覆盖其方法,添加AOP代理逻辑。 4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置...
package com.gc.aop下为:aop方式ProxyFactoryBean代理 package com.gc.aop下为:aop方式ProxyFactoryBean代理 package com.gc.autoproxy下为:aop方式自动代理 package com.gc.cglib下为:aop方式cglib代理 ...
1. **代理**:Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK代理用于实现了接口的类,而CGLIB代理则用于没有接口或不希望使用接口的类。代理对象在调用目标方法时会执行切面逻辑。 2. **织入**:织入...
5. **理解代理行为**:理解Spring AOP代理的工作方式很重要,因为这可能影响到何时以及如何调用通知。例如,直接通过`@Autowired`注入的bean之间的相互调用不会触发AOP通知,除非显式地通过代理引用进行调用。 6. *...
三、Spring AOP代理原理 Spring AOP通过两种代理机制实现: 1. JDK动态代理:只能代理实现了接口的目标对象,性能相对较低,需要指定代理接口。 2. CGLIB代理:可代理接口和非final的类,性能较高,通过生成字节...
在测试方法中,可以注入需要的bean,然后调用方法来触发AOP代理。这样,通知将在适当的时候被调用,我们可以验证其预期行为。 为了更深入地理解这些概念,你可以查看压缩包中的具体代码,例如,`ExampleAspect`类...
现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...
动态代理则是Spring AOP实现的核心技术之一,它允许我们在运行时创建具有额外行为的对象。下面将详细阐述Spring AOP的配置以及动态代理的实现。 一、Spring AOP基础知识 1. **什么是AOP**:AOP是一种编程范式,...
这个组件使得Spring AOP能够与未修改的第三方库无缝集成,因为Spring AOP可以利用AspectJ Weaver来处理那些不支持代理的对象。 3. **cglib-nodep-2.1_3.jar**:CGLIB(Code Generation Library)是一个高性能的代码...
总之,Spring AOP通过代理技术实现了面向切面编程,使得开发者能够更专注于业务逻辑,而将通用的横切关注点剥离出来,提高了代码的可读性和可维护性。通过深入理解Spring AOP的实现机制,我们可以更好地利用这一强大...