spring总结
什么是AOP?
面向切面编程。
他里面包含几个概念,分别是JoinPoint、PointCut和Advice。
JoinPoint:可以被切入的方法。
PointCut:切入的那些方法。
Advice:通知。分为前置通知、后置通知、异常通知、最终通知和后置通知。
spring中aop的应用:拦截器就是aop的例子。
用法示例:
package learnFromBilibili.util;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class LoggerAnnotation {
/**
* 用户打印日志,计划让其在切入点方法执行之前执行(切入点方法就是业务层方法)
*/
public void printLog(){
System.out.println("Logger类中的printLog方法开始记录日志了...");
}
/**切入点*/
@Pointcut("execution(* learnFromBilibili.service.impl.*.*(..))")
private void pt1(){}
/**
* 前置通知
*/
@Before("pt1()")
public void beforePrintLog(){
System.out.println("前置通知");
}
/**
* 后置通知
*/
@AfterReturning("pt1()")
public void afterReturningPrintLog(){
System.out.println("后置通知");
}
/**
* 异常通知
*/
@AfterThrowing("pt1()")
public void afterThrowingPrintLog(){
System.out.println("异常通知");
}
/**
* 最终通知
*/
@After("pt1()")
public void afterPrintLog(){
System.out.println("最终通知");
}
/**环绕通知*/
@Around("pt1()")
public Object aroundPrintLog(ProceedingJoinPoint pjp){
Object rtValue = null;
try {
Object[] args = pjp.getArgs();
System.out.println("环绕通知。。。前置");
rtValue = pjp.proceed(args);
System.out.println("环绕通知。。。后置");
return rtValue;
} catch (Throwable throwable) {
System.out.println("环绕通知。。。异常");
throw new RuntimeException(throwable);
} finally {
System.out.println("环绕通知。。。最终");
}
}
}
什么是IoC?
Inversion of Control 控制反转
将对象的创建交给容器,利用工厂模式,使用反射创建新对象。
spring中注入的两种方式:注解和构造函数。
spring中的两种IoC容器:BeanFactory和ApplicationContext。
BeanFactory常用:XmlBeanFactory(已过时 Deprecated,我就用)。
ApplicationContext常用:ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、XmlWebApplicationContext和ConfigServletWebServerApplicationContext(spring boot中使用)。
IoC的好处:
它将最小化应用程序中的代码量。
它以最小的影响和最少的侵入机制促进松耦合。
它支持即时的实例化和延迟加载 Bean 对象。
它将使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例或 JNDI 查找机制。
事务?
事务:是指开启、提交、回滚和释放这一系列操作,目的是控制对数据库的操作。
事务类型:Spring中包含声明式和编程式,也就是用注解还是自己写。
事务的传播级别:事务传播行为是为了解决业务层方法之间互相调用的事务问题。
在Spring中事务的传播级别一共有7种。
支持当前事务的情况 3种
PROPAGATION_REQUIRED
1、如果当前存在事务,则使用该事务。如果当前没有事务,则创建一个新的事务。
有任何方法有异常,两个事务都回滚。
PROPAGATION_SUPPORTS (不常用,不回滚)
2、如果当前存在事务,则使用该事务。如果当前没有事务,则以非事务的方式继续运行。
PROPAGATION_MANDATORY
3、如果当前存在事务,则使用该事务。如果当前没有事务,则抛出异常。
不支持当前事务的情况 3种
PROPAGATION_REQUIRES_NEW
1、如果当前没有事务,创建一个新的事务。如果当前存在事务,则把当前事务挂起。
开启子事务,父事务回滚,子事务不回滚。但如果子事务发生符合父事务回滚要求的异常,父事务会回滚。
PROPAGATION_NOT_SUPPORTED (不常用,不回滚)
2、如果当前没有事务,以非事务方式运行。如果当前存在事务,则把当前事务挂起。
PROPAGATION_NEVER (不常用,不回滚)
3、如果当前没有事务,以非事务方式运行。如果当前存在事务,则抛出异常。
其他情况 1种
PROPAGATION_NESTED
1、如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行。如果当前没有事务,则等价于PROPAGATION_REQUIRED。
父事务回滚,子事务也回滚。子事务回滚,父事务不回滚。
事务的回滚规则:默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚。但是可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。
// 常用方式
@Transactional(rollbackFor = Exception.class)
public void save() {
......
}