AOP思想:
不影响原有业务类的情况下,实现动态增强。
1.导入依赖包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
2.导入aop约束
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
3.创建接口及实现接口
package com.spring.qq.service;
public interface UserService {
public void add(double y);
public void div(double y);
public void multi(double y);
public void minus(double y);
}
package com.spring.qq.service;
public class UserServiceImpl implements UserService{
private double x = 1;
public void add(double y) {
x = x+y;
System.out.println("x = "+x);
}
public void div(double y) {
x = x/y;
System.out.println("x = "+x);
}
public void multi(double y) {
x = x *y;
System.out.println("x = "+x);
}
public void minus(double y) {
x = x-y;
System.out.println("x = "+x);
}
}
4.创建切入类 (前切、后切)
package com.spring.qq.addition;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
public class AfterMethods implements AfterReturningAdvice {
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println(target.getClass().getName()+"执行了"+method.getName()+"方法,返回结果为:"+returnValue);
}
}
package com.spring.qq.addition;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class BeforeMethods implements MethodBeforeAdvice {
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println(target.getClass().getName()+"的"+method.getName()+"将要被执行");
}
}
5.配置aop
<!-- 配置aop-->
<aop:config>
<!-- 切入点-->
<aop:pointcut id="pointcut" expression="execution(* com.spring.qq.service.UserServiceImpl.*(..))"/>
<!-- 执行环绕增加-->
<aop:advisor advice-ref="beforeMethods" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterMethods" pointcut-ref="pointcut"/>
</aop:config>
6.测试
package com.spring.qq.mytest;
import com.spring.qq.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
UserService userService = context.getBean("userServiceImpl", UserService.class);
userService.add(3);
userService.multi(3);
}
}
输出结果为:
com.spring.qq.service.UserServiceImpl的add将要被执行
x = 4.0
com.spring.qq.service.UserServiceImpl执行了add方法,返回结果为:null
com.spring.qq.service.UserServiceImpl的multi将要被执行
x = 12.0
com.spring.qq.service.UserServiceImpl执行了multi方法,返回结果为:null