准备工作:
本demo使用的是配置文件的方式,没有用注解
需要的jar包有 spring核心包,aspectj,aspectjweaver,spring-aop
代码:
1.待切入的类
package com.ssm.controller;
import org.springframework.stereotype.Controller;
@Controller("helloController")
public class HelloController {
public String foo(String a){
System.out.println("----"+a+"----");
return a;
}
}
2.切面类
package com.ssm.utils;
import org.aspectj.lang.JoinPoint;
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 java.util.Arrays;
public class LogAspect {
public void begin(JoinPoint jp){
System.out.println("###############################################");
System.out.println("开始执行"+jp.getTarget()+"类的"+jp.getSignature().getName()+"方法");
System.out.println("传入参数为:"+ Arrays.toString(jp.getArgs()));
}
public void end(JoinPoint jp,Object rvt){
System.out.println(jp.getTarget()+"类的"+jp.getSignature().getName()+"方法执行成功,返回值为:"+rvt);
}
}
3.
spring配置文件
<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" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package="com.ssm.controller"/>
<!-- Spring AOP-->
<bean id="logAspect" class="com.ssm.utils.LogAspect"></bean>
<aop:config>
<aop:aspect id="myaop" ref="logAspect" order="2">
<aop:before method="begin" pointcut="execution(* com.ssm.controller.*.*(..))"/>
<aop:after-returning method="end" pointcut="execution(* com.ssm.controller.*.*(..))" returning="rvt"/>
</aop:aspect>
</aop:config>
</beans>
4.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<!-- 加载spring bean -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
5.测试类
package test;
import com.ssm.controller.HelloController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class a {
public static void main(String[] args){
ApplicationContext ctx= new ClassPathXmlApplicationContext("spring/spring.xml");
// for(String e:ctx.getBeanDefinitionNames())
// System.out.println(e);
HelloController h= (HelloController) ctx.getBean("helloController");
h.foo("asdasd");
}
}
执行结果:
遇到的问题:
最开始的时候我在切面类还写了一个查看被切入方法是否抛出异常的函数,在本demo种就是检测HelloController的foo()方法会抛出何种异常,然而我的foo()方法本来就不会抛出异常,所以导致我的程序跑不起来。原来的切面类是下面这样写的
package com.ssm.utils;
import org.aspectj.lang.JoinPoint;
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 java.util.Arrays;
@Aspect
public class LogAspect {
@Before("execution(* com.ssm.serviceImpl.*.*(..))")
public void begin(JoinPoint jp){
System.out.println("###############################################");
System.out.println("开始执行"+jp.getTarget()+"类的"+jp.getSignature().getName()+"方法");
System.out.println("传入参数为:"+ Arrays.toString(jp.getArgs()));
}
@AfterReturning(pointcut = "execution(* com.ssm.serviceImpl..*.*(..))",returning = "rvt")
public void end(JoinPoint jp,Object rvt){
System.out.println(jp.getTarget()+"类的"+jp.getSignature().getName()+"方法执行成功,返回值为:"+rvt);
}
@AfterThrowing(throwing = "ex",pointcut = "execution(* com.ssm.serviceImpl.*.*(..))")
public void error(Throwable ex,JoinPoint jp){
System.out.println(jp.getTarget()+"类的"+jp.getSignature().getName()+"方法抛出异常"+ex);
}//针对有抛出异常的方法才行
}