概述
Spring的两大核心思想:
IOC
IOC(Inversion of Control) 控制反转
:对象的创建 由原来代码中new的方法 转移到 spring的配置文件中,由spring工 厂进行创建。
spring不仅提供了对 对象的管理,而且对象和对象 间的依赖关系 也提供了 完美的解决方案–即,DI(Dependency Injection)依赖注入
。
AOP
面向切面编程
AOP的使用场景:在主要功能上 增加 可有可用的额外功能时 使用。
AOP的一般使用
依赖坐标
`<!--aop启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--注解式开发-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
开发切面整合切入点
以一个执行日志记录为示例
package com.baizhi.aspect;
import com.baizhi.entity.LogEntity;
import com.baizhi.service.LogService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.UUID;
@Component //将此类交给工厂管理
@Aspect //定义切面
@Slf4j //引入日志
public class TestBeforeAdvice {
@Autowired
HttpServletRequest request; //此对象可由工厂自动管理
//定义切入点,因为此注解只可用在方法上,所以随机定义一个无意义的方法
@Pointcut(value = "execution(* com.baizhi.service.*.*(..))")
public void pt() {
}
//配置环绕通知
@Around(value = "pt()")
//ProceedingJoinPoint 参数是 JoinPoint 连接点 的子类
public Object testAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("this is around before");
try {
proceed = proceedingJoinPoint.proceed(); //调用目标方法,必须proceed,目标方法才可执行
return proceed; //此对象包含了原目标方法中的方法名、参数信息、方法对象等信息...
} catch (Throwable throwable) {
/*这里不直接抛出异常,是因为 业务层事务的关系,相当与这里有2层事务,当执行有误后,日志可以正常记录,而保证业务层事务正常,所有捕获到执行失败,本次日志将记录,同时,不会让外层事务得不到异常*/
throw throwable;
} finally {
log.info("执行完毕”);
}
}
自定义注解开发
注意:
自定义注解时,需要改变代理类的实现方式为CGLIB
.
AOP动态代理有两种实现方式
-
- Proxy JDK的反射包,aop默认采用 动态代理类 实现(目标类实现的)接口。
-
- CGLIB 开源(对