通过Spring使用AOP
必要条件:
1、增强工具类(提供增强方法)
2、被代理增强类(提供需要被增强的方法)
①接口类
public interface ISpringAopInterface {
public void add();
public void delete();
public void update();
public void query();
}
②被代理类
public class SpringAopClass implements ISpringAopInterface {
public SpringAopClass(){
System.out.println("SpringAopClass 被创建了");
}
@Override
public void add() {
System.out.println("增加");
}
@Override
public void delete() {
System.out.println("删除");
}
@Override
public void update() {
System.out.println("改");
}
@Override
public void query() {
System.out.println("查");
}
}
③增强工具类
package com.mobao.springaop;
import org.aspectj.lang.ProceedingJoinPoint;
public class Logger {
public void before() {
System.out.println("before");
}
public void after() {
System.out.println("after");
}
public void afterreturning() {
System.out.println("afterreturning");
}
public void afterthrowing() {
System.out.println("afterthrowing");
}
public Object around(ProceedingJoinPoint pjp) {
System.out.println("around");
Object rvalue = null;
try {
Object[] paras = pjp.getArgs();
System.out.println("拦截前");
rvalue = pjp.proceed(paras);
System.out.println("拦截后");
return rvalue;
}catch (Throwable t){
throw new RuntimeException(t);
}finally {
System.out.println("最终");
}
}
}
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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="springAopClass" class="com.mobao.springaop.SpringAopClass"/>
<bean id="logger" class="com.mobao.springaop.Logger"/>
<!-- false 接口动态代理 生成的对象应用接口类型修饰 true 子类动态代理(此时需要cglib第三方库提供支持) 生成的对象应用子类类型修饰-->
<aop:config proxy-target-class="false">
<!-- 配置表达式-->
<aop:pointcut id="expression" expression="execution(public void com.mobao.springaop.ISpringAopInterface.add())"/>
<aop:pointcut id="updateid" expression="execution(public void com.mobao.springaop.ISpringAopInterface.update())"/>
<!-- <aop:config proxy-target-class="true">-->
<!-- id 设置id名 ref增强工具类-->
<aop:aspect id="logAdvice" ref="logger">
<!-- 直接使用pointcut 配置表达式-->
<aop:before method="before" pointcut="execution(public void com.mobao.springaop.ISpringAopInterface.add())"></aop:before>
<!-- 使用设置好的表达式-->
<aop:after-returning method="afterreturning" pointcut-ref="expression"></aop:after-returning>
<aop:after method="after" pointcut-ref="expression"></aop:after>
<!-- 被增强的方法执行报错抛出异常时 会被执行-->
<aop:after-throwing method="afterthrowing" pointcut-ref="expression"></aop:after-throwing>
<!-- 环绕通知 通过环绕通知可细化到具体的方法拦截 详细配置到 增强工具类 around方法查看-->
<!-- update方法被调用时,logger类的around方法会拦截到该方法-->
<aop:around method="around" pointcut-ref="updateid"></aop:around>
</aop:aspect>
</aop:config>
</beans>
程序运行代码
public class SpringAop {
public static void main(String[] args) {
// SpringAopClass springAopClass = new SpringAopClass();
// springAopClass.add();
// springAopClass.delete();
// springAopClass.update();
// springAopClass.query();
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
Object obj = ac.getBean("springAopClass");
// <aop:config proxy-target-class="false"> false表示接口动态代理,则生成的对象应用接口类型修饰
ISpringAopInterface iSpringAopInterface = (ISpringAopInterface)obj;
iSpringAopInterface.add();
iSpringAopInterface.update();
//// <aop:config proxy-target-class="true"> true,则生成的对象应用对象类型修饰
// SpringAopClass springAopClass = (SpringAopClass)obj;
// springAopClass.add();
}
}
注解形式的AOP
1、增强工具类添加注解
//bean注解
@Component
//表示当前类是一个注解类
@Aspect
public class Logger {
// 表达式 表示要拦截的方法
@Pointcut("execution(public void com.mobao.springaop.SpringAopClass.add())")
// 配置一个方法,在注解后写入
public void pt(){
}
// 注解拦截方法时,执行方法
@Before("pt()")
public void before() {
System.out.println("before");
}
// 注解拦截方法时,执行方法
@After("pt()")
public void after() {
System.out.println("after");
}
// 注解拦截方法时,执行方法
@AfterReturning("pt()")
public void afterreturning() {
System.out.println("afterreturning");
}
// 注解拦截方法时,执行方法
@AfterThrowing("pt()")
public void afterthrowing() {
System.out.println("afterthrowing");
}
// 注解拦截方法时,执行方法
// @Around("pt()")
public Object around(ProceedingJoinPoint pjp) {
System.out.println("around环绕通知拦截的方法");
Object rvalue = null;
try {
// 获取参数
Object[] paras = pjp.getArgs();
System.out.println("拦截前");
// 执行原方法
rvalue = pjp.proceed(paras);
System.out.println("拦截后");
return rvalue;
}catch (Throwable t){
throw new RuntimeException(t);
}finally {
System.out.println("最终");
}
}
}
2、①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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.mobao.springaop"></context:component-scan>
<aop:config proxy-target-class="false">
</aop:config>
<!-- 开启spring aop注解支持 如果不用xml文件也可使用配置类表示-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
②配置类
@Configuration
@ComponentScan("com.mobao")
@EnableAspectJAutoProxy
public class BeanConfigClass {
}
主要调用方法
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(BeanConfigClass.class);
ISpringAopInterface iSpringAopInterface = (ISpringAopInterface) ac.getBean("springAopClass");
iSpringAopInterface.add();
网友评论