Spring实现AOP的方式
来源:互联网 发布:网络电视遥控器配对 编辑:程序博客网 时间:2024/05/19 03:22
一、经典的基于代理的AOP
1、Spring支持五种类型的通知:
(1)Before(前)
(2)After-returning(返回后) org.springframework.aop.AfterReturningAdvice
(3)After-throwing(抛出后) org.springframework.aop.ThrowsAdvice
(4)Arround(周围) org.aopaliance.intercept.MethodInterceptor
(5)Introduction(引入) org.springframework.aop.IntroductionInterceptor
2、步骤:
(1)创建通知:实现这几个接口,把其中的方法实现了
(2)定义切点和通知者:在Spring配制文件中配置这些信息
(3)使用ProxyFactoryBean来生成代理
3、具体做法:
(1)创建通知:
a、接口Sleepable:
package com.makocn.aop.spring;
public interface Sleepable {
}
b、人类Human:
package com.makocn.aop.spring;
public class Human implements Sleepable {
}
c、拦截类SleepHelper
package com.makocn.aop.spring;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice {
}
d、spring配置文件applicationContext0.xml
(2)定义切点和通知者:
定义切点的常用的两种方式:1)使用正则表达式 2)使用AspectJ表达式。这里用正则表达式
在spring配置文件里添加:
(3)使用ProxyFactoryBean来生成代理
切入点和通知都配置完成,接下来该调用ProxyFactoryBean产生代理对象,可以把它转换为proxyInterfaces中指定的实现该interface的代理对象。在spring配置文件里添加:
(4)测试类Test:
package com.makocn.aop.spring;
import org.apache.xbean.spring.context.ClassPathXmlApplicationC
import org.springframework.context.ApplicationContext;
public class Test {
}
(5)测试结果:
通常情况下睡觉之前要脱衣服!
睡觉了!梦中自有颜如玉!
起床后要先穿衣服!
applicationContext0.xml文件全部内容:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
<beans>
</beans>
上面配置切点跟通知有点麻烦,Spring提供了一种自动代理的功能,让切点跟通知自动进行匹配
applicationContext1.xml文件内容:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
<beans>
</beans>
测试类Test:
package com.makocn.aop.spring;
import org.apache.xbean.spring.context.ClassPathXmlApplicationC
import org.springframework.context.ApplicationContext;
public class Test {
}
二、@AspectJ注解驱动的切面
1、拦截类AspectSleepHelper :
package com.makocn.aop.spring;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class AspectSleepHelper {
}
用@Aspect的注解来标识切面,注意不要把它漏了,否则Spring创建代理的时候会找不到它,@Pointcut注解指定了切点,@Before和@AfterReturning指定了运行时的通知,注意的是要在注解中传入切点的名称
2、Spring配置文件:
<?xml version="1.0" encoding="gb2312"?>
<beans xmlns="http://www.springframework.org/schema/beans"
</beans>
3、测试类Test:
package com.makocn.aop.spring;
import org.apache.xbean.spring.context.ClassPathXmlApplicationC
import org.springframework.context.ApplicationContext;
public class Test {
}
三、使用Spring来定义纯粹的POJO切面
前面我们用到了<aop:aspectj-autoproxy/>标签,Spring在aop的命名空间里面还提供了其他的配置元素:
<aop:advisor> 定义一个AOP通知者
<aop:after> 后通知
<aop:after-returning> 返回后通知
<aop:after-throwing> 抛出后通知
<aop:around> 周围通知
<aop:aspect>定义一个切面
<aop:before>前通知
<aop:config>顶级配置元素,类似于<beans>这种东西
<aop:pointcut>定义一个切点
1、拦截类POJOSleepHelper
package com.makocn.aop.spring;
public class POJOSleepHelper {
}
2、Spring的配置applicationContext3.xml文件:
<?xml version="1.0" encoding="gb2312"?>
<beans xmlns="http://www.springframework.org/schema/beans"
</beans>
3、测试类
package com.makocn.aop.spring;
import org.apache.xbean.spring.context.ClassPathXmlApplicationC
import org.springframework.context.ApplicationContext;
public class Test {
}
四、注入式AspectJ切面
该方式通过Spring集成AspectJ;AspectJ采用编译期织入和类加载期织入的方式织入切面,是语言级的AOP实现,提供了完备的AOP支持。它用AspectJ语言定义切面,在编译期或类加载期将切面织入到Java类中。
因需另外搭建具体环境,具体实现可查看网上例子。
- Spring实现AOP的方式
- Spring实现AOP的方式
- Spring实现AOP的方式
- spring实现AOP的方式
- Spring AOP实现的方式
- Spring实现AOP的方式
- Spring AOP实现方式
- Spring AOP实现方式
- Spring AOP实现方式
- Spring的Aop的实现方式
- Spring实现AOP的4种方式
- Spring实现AOP的4种方式
- Spring实现AOP的4种方式
- Spring实现AOP的4种方式
- 使用Spring的注解方式实现AOP
- 使用Spring的注解方式实现AOP
- Spring---->采用Annotation的方式实现AOP
- 使用Spring的注解方式实现AOP
- (简单模拟——筛选法模拟2.2.1)POJ 1316 Self Numbers(生成数、自数)
- 开始学习java
- jboss7静态变量由于不同的类加载器在两个模块中不相同
- glew的安装
- ruby取url内容并json解码
- Spring实现AOP的方式
- MySQL控制台快捷方式建立:操作如下:
- OCP-1Z0-053-V12.02-235题
- 5分钟学会十进制转换成二进制的快速口算方法 & Java输出二进制的代码
- Git 常用命令速查表
- vs2005使用总结
- 视频去广告
- 将CSTring 转化成 char数组
- cannot be cast to android.widget.HeaderViewListAdapter