版权声明:博客知识产权来源命运的信徒,切勿侵权 https://blog.csdn.net/qq_37591637/article/details/85164267
知识点如下
实例如下
接口类
package cn.com.day02;
public interface Calculator {
/*
* author:命运的信徒 date:2018/12/21 arm:aop基础
* 这里是四个方法;返回的结果是Int类型
*/
// +
int add(int i, int j);
// -
int sub(int i, int j);
// *
int take(int i, int j);
// 除法
int div(int i, int j);
}
实现类
package cn.com.day02;
import org.springframework.stereotype.Component;
@Component
public class CalculatorImp implements Calculator {
/*
* 自带日志的
*/
@Override
public int add(int i, int j) {
int result = i + j;
return result;
}
@Override
public int sub(int i, int j) {
int result = i - j;
return result;
}
@Override
public int take(int i, int j) {
int result = i * j;
return result;
}
@Override
public int div(int i, int j) {
// TODO Auto-generated method stub
int result = i / j;
return result;
}
}
切面 类(环绕通知)
package cn.com.day02;
import java.util.Arrays;
import org.aspectj.lang.ProceedingJoinPoint;
public class AroundAspect {
public Object aroundMethod(ProceedingJoinPoint pcj){
//前置通知
String name=pcj.getSignature().getName();
Object [] arg=pcj.getArgs();
System.out.println("#####the method "+name+"is begin"+Arrays.asList(arg));
//返回通知
Object o=null;
try {
o=pcj.proceed();
System.out.println("#####the method "+name+"is return"+o);
} catch (Throwable e) {
//异常通知
System.out.println("#####the method "+name+"is error"+e);
}
//后置通知
System.out.println("#####the method "+name+"is end");
return o;
}
}
切面类(四个分开了写的)
package cn.com.day02;
import java.util.Arrays;
import java.util.List;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
//切面优先级,值越小,优先级越高
public class AspectClass {
public void getLogging(JoinPoint joinpoint) {
// 根据连接点获取方法名
String methodname = joinpoint.getSignature().getName();
// 获取参数名称
List<Object> args = Arrays.asList(joinpoint.getArgs());
System.out.println("the method " + methodname + "is begins with "
+ args);
}
public void after(JoinPoint joinpoint){
String name=joinpoint.getSignature().getName();
System.out.println("the method " + name + "is end");
}
//返回通知
//只有在正常运行的情况下才会执行的,这个方法可以返回结果值
public void afterReturn(JoinPoint joinpoint,Object result){
String name=joinpoint.getSignature().getName();
System.out.println("the method " + name + "is end"+result);
}
//异常通知,只有报错的时候才会执行的方法,可以访问到异常
public void afterThrow(JoinPoint joinpoint,Exception ex){
String name=joinpoint.getSignature().getName();
System.out.println("the method " + name + "is throw error"+ex);
}
}
配置文件
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 通过xml文件的形式配置AOP -->
<bean id="ca" class="cn.com.day02.CalculatorImp"></bean>
<bean id="as" class="cn.com.day02.AspectClass"></bean>
<bean id="ar" class="cn.com.day02.AroundAspect"></bean>
<!-- 用基于 XML 的配置声明切面 -->
<aop:config proxy-target-class="true">
<aop:pointcut id="pointcut" expression="execution(* cn.com.day02.CalculatorImp.*(..))" />
<aop:aspect order="1" ref="as" id="aspect1">
<aop:before method="getLogging" pointcut-ref="pointcut" />
<aop:after method="after" pointcut-ref="pointcut" />
<aop:after-returning method="afterReturn" pointcut-ref="pointcut" returning="result"/>
<aop:after-throwing method="afterThrow" pointcut-ref="pointcut" throwing="ex"/>
</aop:aspect>
<aop:aspect id="aspect2" order="1" ref="ar">
<aop:around method="aroundMethod" pointcut-ref="pointcut" />
</aop:aspect>
</aop:config>
</beans>
测试类
package cn.com.day02;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ioc = new ClassPathXmlApplicationContext(
"applicationContext.aop.xml");
CalculatorImp cx = (CalculatorImp) ioc.getBean("ca");
int result = cx.add(12, 4);
int re = cx.div(12, 2);
}
}