AOP
Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在业务流程执行过程中,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。有三种实现方式
在实现AOP之前首先配置AOP约束
约束配置
‘’’
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">
‘’’
再配置需要响应的Bean
一:使用Spring API接口
实现接口MethodBeforeAdvice , AfterReturningAdvice等
public class BeforeLog implements MethodBeforeAdvice {
//前置日志
public void before(Method method, Object[] objects, Object o) throws Throwable {
//method被执行的目标的方法 objects参数 o:目标对象
System.out.println(o.getClass().getName()+"的"+method.getName()+"方法被执行了");
}
}
public class AfterLog implements AfterReturningAdvice {
//o:返回值
public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
System.out.println("执行了"+method.getName()+"方法,返回值为"+o);
}
}
配置AOP
‘’’
<aop:config>
<!--配置切入点.就是设置切入到什么地方-->
<aop:pointcut id="point" expression="execution(* com.lss.pojo.UserServiceImpl.*(..))"/>
<!--执行环绕,将设置的前置日志和后置日志切入到设置好的切入点中-->
<aop:advisor advice-ref="before" pointcut-ref="point" />
<aop:advisor advice-ref="after" pointcut-ref="point" />
</aop:config>
‘’’
二:自定义切面
自定义类,当作前置日志和后置日志
public class DiyPoint {
public void before(){
System.out.println("=====执行方法前=====");
}
public void after(){
System.out.println("=====执行方法后=====");
}
}
aop配置,自定义切入点
<bean id="diypoint" class="com.lss.DIY2.DiyPoint" />
aop:config>
<!--aspect:切面-->
<aop:aspect ref="diypoint">
<!-设置切入点-->
<aop:pointcut id="diy" expression="execution(* com.lss.pojo.UserServiceImpl.*(..))"/>
<aop:before method="before" pointcut-ref="diy" />
<aop:after method="after" pointcut-ref="diy" />
</aop:aspect>
</aop:config>
三:使用注解
自定义前置日志和后置日志等其他
@Aspect
//注解该类为一个切面
public class Auto {
//execution(* com.lss.pojo.UserServiceImpl.*(..))切入点,即切入到什么地方
@Before("execution(* com.lss.pojo.UserServiceImpl.*(..))")
public void before(){
System.out.println("执行前"); }
@After("execution(* com.lss.pojo.UserServiceImpl.*(..))")
public void after(){
System.out.println("执行后"); }}'''
再xml中开启注解支持,并注册Bean
<bean id="auto" class="com.lss.Auto.Auto" />
<aop:aspectj-autoproxy/>
统一测试方法
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationConfig.xml");
//动态代理代理的是接口
UserService userService = (UserService) context.getBean("userService");
//serService.add();测试方法是否输出前置和后置信息
userService.delete();