一、创建一个接口
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>