Spring 切面编程(AOP)

tech2025-10-22  5

Spring笔记四:

AOP:

1、在不破坏原有代码的基础上,利用"织入"的模式来实现代码的动态配置 2、实现方式: 准备: UserService接口:

package com.itcast.service; public interface UserService { public void addUser(); public void deleteUser(); public void updateUser(); public void selectUser(); }

UserServiceImpl实现:

package com.itcast.serviceImpl; import com.itcast.service.UserService; public class UserServiceImpl implements UserService { @Override public void addUser() { System.out.println("添加用户"); } @Override public void deleteUser() { System.out.println("删除用户"); } @Override public void updateUser() { System.out.println("更新用户"); } @Override public void selectUser() { System.out.println("查询用户"); } }

增加日志 ①原生的spring API接口 BeforeLog:

package com.itcast.log; import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; public class BeforeLog implements MethodBeforeAdvice { @Override //method 要执行的目标对象方法 //objects (args) 参数 //o (target) 目标对象 public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println(target.getClass().getName()+"对象方法"+method.getName()+"执行了"); } }

AfterLog:

package com.itcast.log; import org.springframework.aop.AfterReturningAdvice; import java.lang.reflect.Method; public class AfterLog implements AfterReturningAdvice { @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("执行了"+method.getClass().getName()+"的"+method.getName()+"方法,结果为"+returnValue); } }

在*.xml注册bean:

<bean name="userServiceImpl" class="com.itcast.serviceImpl.UserServiceImpl"/> <bean name="afterLog" class="com.itcast.log.AfterLog"/> <bean name="beforeLog" class="com.itcast.log.BeforeLog"/>

*.xml实现aop:

<aop:config> <!--切入点 expression表达式:execution要执行的位置(*[修饰词] *[返回值] *[类名] *[方法名] *[参数])--> <aop:pointcut id="pointcut" expression="execution(* com.Lutra.ServiceImpl.UserServiceImpl.*(..))"/> <!--执行增强--> <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/> <aop:advisor advice-ref="beforeLog" pointcut-ref="pointcut"/> </aop:config>

测试: ②自定义方法类 自定义一个方法类:

package com.itcast.DIY; public class DiyPointCut { public void Before(){ System.out.println("Before..."); } public void After(){ System.out.println("After..."); } }

将自定义类注册到bean中:

<bean name="DiyPointCut" class="com.itcast.DIY.DiyPointCut"/>

实现AOP:

<aop:config> <aop:aspect ref="DiyPointCut"> <aop:pointcut id="pointCut" expression="execution(* com.itcast.serviceImpl.UserServiceImpl.*(..))"/> <aop:after method="After" pointcut-ref="pointCut"/> <aop:before method="Before" pointcut-ref="pointCut"/> </aop:aspect> </aop:config>

测试:

③注解

package com.itcast.annotation; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect//标注是一个切面 @Component public class AnnotationPointCut { @Before("execution(* com.itcast.serviceImpl.UserServiceImpl.*(..))")//切入点 public void Before(){ System.out.println("---前---"); } @After("execution(* com.itcast.serviceImpl.UserServiceImpl.*(..))") public void After(){ System.out.println("---后---"); } }

*.xml开启注解支持:

<context:annotation-config/> <context:component-scan base-package="com.itcast.annotation"/> <aop:aspectj-autoproxy/>

测试:

最新回复(0)