Spring 框架的 AOP
第一种方式
接口
package com.yms.service;
/**
- @Author 杨明书
- @PackageName: com.yms.service
- @ClassName: UserService
- @Description:
- @Date: 2021/12/30 10:43
*/
public interface UserService {
void insert();
void delete();
void update();
void query();
}
实现类
package com.yms.service.impl;
import com.yms.service.UserService;
/**
-
@Author 杨明书
-
@PackageName: com.yms.service.impl
-
@ClassName: UserServiceImpl
-
@Description:
-
@Date: 2021/12/30 10:45
*/
public class UserServiceImpl implements UserService {
@Override
public void insert() {
System.out.println("增减了一个用户");
}@Override
public void delete() {
System.out.println("删除了一个用户");}
@Override
public void update() {
System.out.println("修改了一个用户");}
@Override
public void query() {
System.out.println("查询一个用户");}
}
两个日志
package com.yms.log;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
/**
- @Author 杨明书
- @PackageName: com.yms.log
- @ClassName: Log
- @Description:
- @Date: 2021/12/30 10:47
/
public class Log implements MethodBeforeAdvice {
/*-
@param method 需要执行的方法
-
@param objects 参数
-
@param target 目标对象
-
@throws Throwable
*/
@Override
public void before(Method method, Object[] objects, Object target) throws Throwable {System.out.println("什么东西呗执行了:"+target.getClass().getName());
System.out.println("执行了什么方法:"+method.getName());
}
}
-
package com.yms.log;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
/**
- @Author 杨明书
- @PackageName: com.yms.log
- @ClassName: AfterLog
- @Description:
- @Date: 2021/12/30 10:53
*/
public class AfterLog implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("执行的方法为:"+method.getName());
System.out.println("返回的结构为" + returnValue);
}
}
配置文件
<!-- 注册bean-->
<bean id="userServiceImpl" class="com.yms.service.impl.UserServiceImpl"></bean>
<bean id="log" class="com.yms.log.Log"></bean>
<bean id="afterLog" class="com.yms.log.AfterLog"></bean>
<!-- 方式一-->
<!-- 配置aop,需要导入aop的约束-->
<aop:config>
<!-- 切入点expression="execution()"-->
<aop:pointcut id="pointcut" expression="execution(* com.yms.service.impl.UserServiceImpl.*(..))"/>
<!-- 执行环绕增强 -->
<aop:advisor advice-ref="log" pointcut-ref="pointcut"></aop:advisor>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"></aop:advisor>
</aop:config>
<!-- 方式二-->
<bean id="div" class="com.yms.div.DivPointCut"/>
<aop:config>
<!-- 定义切面,ref引用切面-->
<aop:aspect ref="div">
<aop:pointcut id="point" expression="execution(* com.yms.service.impl.UserServiceImpl.*(..))"/>
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
<!-- 方式三-->
<bean id="annotationPointCut" class="com.yms.div.AnnotationPointCut"/>
<!-- 开启注解支持-->
<aop:aspectj-autoproxy/>
方式二单纯切入
package com.yms.div;
/**
-
@Author 杨明书
-
@PackageName: com.yms.div
-
@ClassName: DivPointCut
-
@Description:
-
@Date: 2021/12/30 11:18
*/
public class DivPointCut {
public void before(){
System.out.println("方法执行之前==");
}public void after(){
System.out.println("方法执行后====");
}
}
方式三注解aop
package com.yms.div;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
/**
-
@Author 杨明书
-
@PackageName: com.yms.div
-
@ClassName: AnnotationPointCut
-
@Description:
-
@Date: 2021/12/30 11:32
-
使用注解的方式进行aop
-
@Aspect 标注这个类为一个切面
/
@Aspect
public class AnnotationPointCut {
@Before("execution( com.yms.service.impl.UserServiceImpl.*(..))")
public void before(){
System.out.println("-----------------------方法执行前---------------------");
}@After("execution(* com.yms.service.impl.UserServiceImpl.*(..))")
public void after(){
System.out.println("-----------------------方法执行后---------------------");
}/**
- 环绕挣钱中,我们可以给定一个参数,代表我们
/
@Around("execution( com.yms.service.impl.UserServiceImpl.*(..))")
public void around(ProceedingJoinPoint jp) throws Throwable {
System.out.println("环绕前");
System.out.println("获得签名:"+jp.getSignature());
//执行方法
Object proceed = jp.proceed();
System.out.println("环绕后");
System.out.println(proceed);
}
- 环绕挣钱中,我们可以给定一个参数,代表我们
}
测试类
import com.yms.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
- @Author 杨明书
- @PackageName: PACKAGE_NAME
- @ClassName: MyTest
- @Description:
- @Date: 2021/12/30 11:07
*/
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("springApplication.xml");
//动态代理,代理的是接口
UserService userServiceImpl = (UserService) context.getBean("userServiceImpl");
userServiceImpl.insert();
}
}