本文是Spring框架AOP相关的知识点,欢迎阅读,学习一起进步。
初识Spring框架请参考:Spring框架基础
Spring-IOC框架请参考:IOC详解
public interface UserService {
void login();
void loginOut();
}
//实现类
public class UserServiceImpl implements UserService {
public void login() {
System.out.println("login方法触发");
}
public void loginOut() {
System.out.println("loginOut方法触发");
}
}
public class PerformHandler implements InvocationHandler {
private Object target; //目标对象
public PerformHandler(Object target){
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//本方法中的其他输出输入增强
System.out.println("方法触发了");
//执行被代理类 原方法
Object invoke = method.invoke(target, args);
System.out.println("执行完毕了");
return invoke;
}
}
@Test
public void test1(){
//测试JDK动态代理技术
UserService userService = new UserServiceImpl();
PerformHandler performHandler = new PerformHandler(userService);
userService = (UserService)
Proxy.newProxyInstance(userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(),
performHandler
);
userService.login();
}
public class CglibProxy implements MethodInterceptor{
private Enhancer enhancer = new Enhancer();
//设置被代理对象
public Object getProxy(Class clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object obj, Method method,
Object[] objects,
MethodProxy methodProxy) throws Throwable {
System.out.println("CGLig代理之前之前");
Object invoke = methodProxy.invokeSuper(obj,objects);
System.out.println("CGLig代理之前之后");
return invoke;
}
}
测试
@Test
public void test2(){
//TODO CGlib实现
CglibProxy cglibProxy = new CglibProxy();
UserServiceImpl userService= (UserServiceImpl)
cglibProxy.getProxy(UserServiceImpl.class);
userService.login();
}
测试结果: 在调用接口方法的前后都会添加代理类的方法!
public interface UserService {
void save();
void delete();
void update();
void select();
}
public class UserServiceImpl implements UserService {
public void save() {
System.out.println("保存用户");
}
public void delete() {
System.out.println("删除用户");
}
public void update() {
System.out.println("更新用户");
}
public void select() {
System.out.println("查找用户");
}
}
public class MyAdivce {
/**
//前置通知:目标方法运行之前调用
//后置通知(如果出现异常不会调用):在目标方法运行之后调用
//环绕通知:在目标方法之前和之后都调用
//异常拦截通知:如果出现异常,就会调用
//后置通知(无论是否出现 异常都会调用):在目标方法运行之后调用
*/
//前置通知
public void before(){
System.out.println("这是前置通知");
}
//后置通知
public void afterReturning(){
System.out.println("这是后置通知(方法不出现异常)");
}
public Object around(ProceedingJoinPoint point) throws Throwable {
System.out.println("这是环绕通知之前部分!!");
Object object = point.proceed(); //调用目标方法
System.out.println("这是环绕通知之后的部分!!");
return object;
}
public void afterException(){
System.out.println("异常通知!");
}
public void after(){
System.out.println("这也是后置通知,就算方法发生异常也会调用!");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">
<bean name="userService" class="com.it.spring.service.UserServiceImpl" />
<!--配置通知对象-->
<bean name="myAdvice" class="com.it.spring.aop.MyAdivce" />
<!-- 配置将增强织入目标对象 使用注解的方式-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
//后置通知
@AfterReturning("execution(* com..service.*ServiceImpl.*(..))")
public void afterReturning(){
System.out.println("这是后置通知(如果出现异常不会调用)!!");
}
@Pointcut("execution(* com..service.*ServiceImpl.*(..))")
public void pc(){}
//前置通知
//指定该方法是前置通知,并制定切入点
@Before("MyAdvice.pc()")
public void before(){
System.out.println("这是前置通知!!");
}
@Aspect
public class MyAdivce {
/**
//前置通知:目标方法运行之前调用
//后置通知(如果出现异常不会调用):在目标方法运行之后调用
//环绕通知:在目标方法之前和之后都调用
//异常拦截通知:如果出现异常,就会调用
//后置通知(无论是否出现 异常都会调用):在目标方法运行之后调用
*/
@Pointcut("execution(* com.itqf.spring.service.*ServiceImpl.*(..))")
public void pc(){
}
//前置通知
@Before("MyAdivce.pc()")
public void before(){
System.out.println("这是前置通知");
}
//后置通知
@AfterReturning("execution(* com..*ServiceImpl.*(..))")
public void afterReturning(){
System.out.println("这是后置通知(方法不出现异常)");
}
public Object around(ProceedingJoinPoint point) throws Throwable {
System.out.println("这是环绕通知之前部分!!");
Object object = point.proceed(); //调用目标方法
System.out.println("这是环绕通知之后的部分!!");
return object;
}
public void afterException(){
System.out.println("异常通知!");
}
public void after(){
System.out.println("这也是后置通知,就算方法发生异常也会调用!");
}
}
The best investment for young people is to invest in yourself
2020.03.26 来自辰兮的第37篇博客