JAVA全系列 教程
3762个小节阅读:7089.1k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
除了AspectJ,Spring本身也是可以实现AOP的。
Spring原生方式实现AOP时,只支持四种通知类型:
通知类型 | 实现接口 |
---|---|
前置通知 | MethodBeforeAdvice |
后置通知 | AfterReturningAdvice |
异常通知 | ThrowsAdvice |
环绕通知 | MethodInterceptor |
引入依赖
xxxxxxxxxx
<!-- AOP -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>6.0.11</version>
</dependency>
编写通知类
xxxxxxxxxx
// Spring原生Aop通知类
public class SpringAopAdvice implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice, MethodInterceptor {
/**
* 前置通知
* @param method 目标方法
* @param args 目标方法的参数列表
* @param target 目标对象
* @throws Throwable
*/
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("前置通知");
}
/**
* 后置通知
* @param returnValue 目标方法的返回值
* @param method 目标方法
* @param args 目标方法的参数列表
* @param target 目标对象
* @throws Throwable
*/
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("后置通知");
}
/**
* 环绕通知
* @param invocation 目标方法
* @return
* @throws Throwable
*/
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("环绕前");
Object proceed = invocation.proceed();
System.out.println("环绕后");
return proceed;
}
/**
* 异常通知
* @param ex 异常对象
*/
public void afterThrowing(Exception ex){
System.out.println("发生异常了!");
}
}
编写配置类
xxxxxxxxxx
<!-- 包扫描 -->
<context:component-scan base-package="com.itbaizhan"></context:component-scan>
<!-- 通知对象 -->
<bean id="springAopAdvice" class="com.itbaizhan.advice.SpringAopAdvice"></bean>
<!-- 配置代理对象 -->
<bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 配置目标对象 -->
<property name="target" ref="userDao"></property>
<!-- 配置通知 -->
<property name="interceptorNames">
<list>
<value>springAopAdvice</value>
</list>
</property>
<!-- 代理对象的生成方式 true:使用CGLib false:使用原生JDK生成 -->
<property name="proxyTargetClass" value="true"></property>
</bean>
编写测试类
xxxxxxxxxx
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext3.xml")
public class UserDaoTest4 {
@Autowired
@Qualifier("userDaoProxy")
private UserDao userDao;
@Test
public void testAdd(){
userDao.add(1);
}
}
1.Spring原生方式实现AOP比AspectJ实现AOP少的通知类型是
A 环绕通知
B 最终通知
C 前置通知
D 后置通知
答案
1=>B