Spring
1.Spring的理解
1.狭义上
指SpringFramework,特别的控制反转、依赖注入、面向切面、等特性
2.广义上
Spring家族的一系列产品,像SpringMVC、SpringBoot、SpringCloud等
2.aop
🌟面试题(aop):
简单介绍一下AOP?
-
aop就是面向切面编程,是一种编程思想,是对oop的延续
-
可以使我们在不改变源码的情况下,对类中的方法功能进行增强
-
可以使增强的代码具备复用性、提高开发效率、提高代码的维护性
1.相关属性
-
目标类:被增强的方法所在的类
-
连接点:目标类中所有的方法
-
切入点:目标类中被增强的方法
-
通知:增强的功能
-
前置通知 @Before :执行目标方法前要增强的功能
-
执行目标方法
proceed = proceedingJoinPoint.proceed();
-
返回后通知 @AfterReturning:目标方法正确执行后要增强的功能
-
异常通知 @AfterThrowing:目标方法执行出错要增强的功能
-
⭐环绕通知 @Around:可以实现其他通知的功能
-
后置通知 @After:最后执行的通知
-
-
切面:@Aspect:通知+切入点
2.AOP底层原理
1.动态代理
1.JDK的动态代理
要求被代理的类实现接口
2.cglib的动态代理
被代理的类可以不实现接口
3.定义切入点的方式
1.使用切入点表达式
java
@Component
@Aspect
@Slf4j
public class AopAspect1 {
@Before("execution(public * com.atguigu.gmall.item.service..*.*(..))")
public void before() { // 前置通知
log.info("AopAspect1.....before....方法执行了");
}
@After("execution(public * com.atguigu.gmall.item.service..*.*(..))")
public void after() { // 后置通知
log.info("AopAspect1.....after....方法执行了");
}
@AfterReturning("execution(public * com.atguigu.gmall.item.service..*.*(..))")
public void afterReturning() { // 返回后通知,只有方法正常返回了,那么此时才会执行该方法
log.info("AopAspect1.....afterReturning....方法执行了");
}
@AfterThrowing("execution(public * com.atguigu.gmall.item.service..*.*(..))")
public void afterThrowing() { // 异常后通知,只有方法产生异常以后,才会执行该方法
log.info("AopAspect1.....afterThrowing....方法执行了");
}
/**
* 一个环绕通知可以实现其他的四种通知的全部功能
* @param proceedingJoinPoint
* @return
* @throws Throwable
*/
@Around("execution(public * com.atguigu.gmall.item.service..*.*(..))")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { // 环绕通知
log.info("AopAspect1.....around..前..方法执行了");
Object proceed = null ;
try {
proceed = proceedingJoinPoint.proceed();
log.info("AopAspect1.....around..后..方法执行了");
}catch (Exception e) {
e.printStackTrace(); // 异常后通知
} finally {
// 最终通知
}
System.out.println(proceed);
return proceed ;
}
}
2.使用自定义注解
java
// com.atguigu.gmall.item.anno,自定义注解
@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface GmallCache {
}
// 在AopService切入点方法上添加自定义注解
@GmallCache
@Override
public SkuInfo findSkuById(long skuId) {
log.info("AopServiceImpl....findSkuById方法执行了.....");
SkuInfo skuInfo = new SkuInfo() ;
skuInfo.setSkuName("小米 CC9 PLUS 手机 美颜自拍 游戏手机 仙女渐变色(美图定制版) 4G全网通 6GB+128GB");
return skuInfo;
}
// 定义基于注解进行拦截器的环绕通知
@Component
@Aspect
@Slf4j
public class AopAspect2 {
@Around("@annotation(gmallCache)")
public Object around(ProceedingJoinPoint proceedingJoinPoint , GmallCache gmallCache) throws Throwable { // 环绕通知
log.info("AopAspect2.....around..前..方法执行了");
Object proceed = null ;
try {
proceed = proceedingJoinPoint.proceed();
log.info("AopAspect2.....around..后..方法执行了");
}catch (Exception e) {
e.printStackTrace(); // 异常后通知
} finally {
// 最终通知
}
System.out.println(proceed);
return proceed ;
}
}
4.多切面相关
🌟面试题(事务失效):
在使用多切面的情况下,自定义切面类捕捉到了目标方法的异常,但是因为没有吧异常抛出,导致事务切面类获取不到异常信息,事务切面类认为业务方法正常执行了,事务就不会进行回滚,从而导致了事务失效