1.maven 依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--aop-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
2.接口和实现定义
接口定义:
package com.aop.api;
/**
* Created by zhangzh on 2016/8/5.
*/
public interface Service {
public void save(String info);
}
接口实现:
package com.aop.impl;
import com.aop.api.Service;
/**
* Created by zhangzh on 2016/8/5.
*/
public class ServiceImpl implements Service {
public void save(String info) {
System.out.println("save info:" + info);
}
}
3.采用before和after方式进行切面操作:
切面类
package com.aop.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* Created by zhangzh on 2016/8/5.
*/
public class aspect {
public void before(JoinPoint call) {
String className = call.getTarget().getClass().getName();
String methodName = call.getSignature().getName();
Object[] args = call.getArgs();
for(Object obj:args) {
if(obj instanceof String) {
System.out.println(methodName +"的执行参数为:" + obj);
}
}
System.out.println("前置通知:" + className + "类的" + methodName + "开始执行了......");
}
public void after() {
System.out.println("最终通知:不管方法有没有正常执行完成,一定会返回的");
}
}
aopContext.xml配置:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns="http://www.springframework.org/schema/beans"
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.xsd">
<bean id="service" class="com.aop.impl.ServiceImpl"/>
<bean id="aspect" class="com.aop.aspect.aspect"/>
<aop:config>
<aop:aspect id="logAspect" ref="aspect">
<aop:pointcut id="allMethod" expression="execution(* com.aop.api.Service.*(..))"/>
<aop:before method="before" pointcut-ref="allMethod"/>
<aop:after method="after" pointcut-ref="allMethod"/>
<!--<aop:after-throwing method="afterThrowing" pointcut-ref="allMethod"/>-->
<!--<aop:around method="doAround" pointcut-ref="allMethod"/>-->
</aop:aspect>
</aop:config>
</beans>
test类:
import com.aop.api.Service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by zhangzh on 2016/8/5.
*/
public class AopTest {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("META-INF/aopContext.xml");
Service service = ac.getBean("service",Service.class);
service.save("### 1232536 #########");
}
}
输出结果:
save的执行参数为:### 1232536 #########
前置通知:com.aop.impl.ServiceImpl类的save开始执行了......
save info:### 1232536 #########
最终通知:不管方法有没有正常执行完成,一定会返回的
切面类:
package com.aop.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* Created by zhangzh on 2016/8/5.
*/
public class aspect {
public void before(JoinPoint call) {
String className = call.getTarget().getClass().getName();
String methodName = call.getSignature().getName();
Object[] args = call.getArgs();
for(Object obj:args) {
if(obj instanceof String) {
System.out.println(methodName +"的执行参数为:" + obj);
}
}
System.out.println("前置通知:" + className + "类的" + methodName + "开始执行了......");
}
public void afterReturn() {
System.out.println("后置通知:方法正常结束了");
}
public void after() {
System.out.println("最终通知:不管方法有没有正常执行完成,一定会返回的");
}
public void afterThrowing() {
System.out.println("异常抛出后通知:方法执行时出异常了");
}
//用来做环绕通知的方法可以第一个参数定义为org.aspectj.lang.ProceedingJoinPoint类型
public Object doAround(ProceedingJoinPoint call) throws Throwable {
Object result = null;
this.before(call);//相当于前置通知
try {
result = call.proceed();
this.afterReturn(); //相当于后置通知
} catch (Throwable e) {
this.afterThrowing(); //相当于异常抛出后通知
throw e;
} finally {
this.after(); //相当于最终通知
}
return result;
}
}
aopContext.xml配置:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns="http://www.springframework.org/schema/beans"
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.xsd">
<bean id="service" class="com.aop.impl.ServiceImpl"/>
<bean id="aspect" class="com.aop.aspect.aspect"/>
<aop:config>
<aop:aspect id="logAspect" ref="aspect">
<aop:pointcut id="allMethod" expression="execution(* com.aop.api.Service.*(..))"/>
<!--<aop:before method="before" pointcut-ref="allMethod"/>-->
<!--<aop:after method="after" pointcut-ref="allMethod"/>-->
<!--<aop:after-throwing method="afterThrowing" pointcut-ref="allMethod"/>-->
<aop:around method="doAround" pointcut-ref="allMethod"/>
</aop:aspect>
</aop:config>
</beans>
test类:
import com.aop.api.Service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by zhangzh on 2016/8/5.
*/
public class AopTest {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("META-INF/aopContext.xml");
Service service = ac.getBean("service",Service.class);
service.save("### 1232536 #########");
}
}
输出结果:
save的执行参数为:### 1232536 #########
前置通知:com.aop.impl.ServiceImpl类的save开始执行了......
save info:### 1232536 #########
后置通知:方法正常结束了
最终通知:不管方法有没有正常执行完成,一定会返回的