一、创建一个接口
public interface MyMath {
public int add(int i,int j);
public void sub(int i,int j);
public void mul(int i,int j);
public void div(int i,int j);
}
二、创建一个接口的实现类
@Component public class MathCalculatorImp limplements MyMath{ @Override public int add(int i, int j) { int result=i+j; System.out.println("目标方法add执行了, "+result); return result; } @Override public void sub(int i, int j) { // TODO Auto-generated method stub int result=i-j; System.out.println("目标方法sub执行了, "+result); } @Override public void mul(int i, int j) { // TODO Auto-generated method stub int result=i*j; System.out.println("目标方法mul执行了, "+result); } @Override public void div(int i, int j) { // TODO Auto-generated method stub int result=i/j; System.out.println("目标方法div执行了, "+result); } }
三、创建切面类
@Aspect//表示这是一个切面类
@Component//将本类对象加入到IOC容器中!
public class LogAspect {
public void showBeginLog(){
System.out.println("AOP日志开始");
}
public void showReturnLog(){
System.out.println("AOP方法返回");
}
public void showExceptionLog(){
System.out.println("AOP方法异常");
}
public void showAfterLog(){
System.out.println("AOP方法结束");
}
}
或者环绕通知
.环绕通知:@Around
1.环绕通知需要在方法的参数中指定JoinPoint的子接口类型ProceedingJoinPoint为参数
2.环绕通知会将其他4个通知能干的,自己都给干了!
注意:@Around修饰的方法一定要将方法的返回值返回!本身相当于代理!
public Object around(ProceedingJoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
Signature signature = joinPoint.getSignature();
String methodName = signature.getName();
List<Object> list = Arrays.asList(args);
Object result = null;
try {
//目标方法之前要执行的操作
System.out.println("[环绕日志]"+methodName+"开始了,参数为:"+list);
//调用目标方法
result = joinPoint.proceed(args);
//目标方法正常执行之后的操作
System.out.println("[环绕日志]"+methodName+"返回了,返回值为:"+result);
} catch (Throwable e) {
//目标方法抛出异常信息之后的操作
System.out.println("[环绕日志]"+methodName+"出异常了,异常对象为:"+e);
throw new RuntimeException(e.getMessage());
}finally{
//方法最终结束时执行的操作!
System.out.println("[环绕日志]"+methodName+"结束了!");
}
return result;
}
四、xml的配置
<!-- 1.将需要加载到IOC容器中的bean配置好 -->
<bean id="logAspect" class="com.neuedu.aop.proxy.LogAspect"></bean>
<bean id="txAspect" class="com.neuedu.aop.target.TxAspect"></bean>
<bean id="calculator" class="com.neuedu.aop.target.MathCalculatorImpl"></bean>
<!-- 2.配置AOP,需要导入AOP名称空间 -->
<aop:config>
<!-- 声明切入点表达式 -->
<aop:pointcut expression="execution(* com.neuedu.aop.target.MathCalculatorImpl.*(..))" id="myPointCut"/>
<!-- 配置日志切面类,引用前面的类 ,通过order属性控制优先级-->
<aop:aspect ref="logAspect" order="25">
<!-- 通过method属性指定切面类的切面方法,通过pointcut-ref指定切入点表达式 -->
<aop:before method="showBeginLog" pointcut-ref="myPointCut"/>
<aop:after method="showAfterLog" pointcut-ref="myPointCut"/>
<aop:after-throwing method="showExceptionLog" pointcut-ref="myPointCut" throwing="ex"/>
<aop:after-returning method="showReturnLog" pointcut-ref="myPointCut" returning="result"/>
<aop:around method="around" pointcut-ref="myPointCut"/>
</aop:aspect>
<!-- 配置事务切面类,引用前面的类 -->
<aop:aspect ref="txAspect" order="20">
<aop:around method="around" pointcut-ref="myPointCut"/>
</aop:aspect>
</aop:config>