# notesnew **Repository Path**: SonicBrother/notesnew ## Basic Information - **Project Name**: notesnew - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-28 - **Last Updated**: 2021-11-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # notesnew for tomorrow ### 事务不生效原因 注解标注位置 入口方法public 只对runtimeexception 数据库引擎 未开启事务支持 类是否被代理 业务和事务在同一个线程 service方法中调用本类方法 ### 配置类生效顺序 spring.factories,AutoconfigurationBefore ### Full模式和Lite模式 #### Lite模式 当`@Bean`方法在没有使用`@Configuration`注释的类中声明时,它们被称为**在Lite模式下处理**。它包括:在`@Component`中声明的`@Bean`方法,甚至只是在一个非常普通的类中声明的Bean方法。 和Full模式的`@Configuration`不同,Lite模式的`@Bean`方法**不能声明Bean之间的依赖关系**。因此,这样的`@Bean`方法**不应该调用其他@Bean方法**。 #### 何时为Lite模式 有如下case均认为是Lite模式的配置类: 1. 类上标注有`@Component`注解 2. 类上标注有`@ComponentScan`注解 3. 类上标注有`@Import`注解 4. 类上标注有`@ImportResource`注解 5. **若类上没有任何注解**,但类内存在@Bean方法 6. 以上case的前提均是类上没有被标注`@Configuration`,在**Spring 5.2之后**新增了一种case也算作Lite模式: 1. 标注有`@Configuration(proxyBeanMethods = false)`,注意:此值默认是true哦,需要显示改为false才算是Lite模式 细心的你会发现,自Spring5.2(对应Spring Boot 2.2.0)开始,内置的几乎所有的`@Configuration`配置类都被修改为了`@Configuration(proxyBeanMethods = false)`,目的何为?答:以此来降低启动时间,为Cloud Native继续做准备。 #### 小总结 - 该模式下,配置类本身不会被CGLIB增强,放进IoC容器内的就是本尊 - 该模式下,对于内部类是没有限制的:可以是Full模式或者Lite模式 - 该模式下,配置类内部**不能通过方法调用**来处理依赖,否则每次生成的都是一个新实例而并非IoC容器内的单例 - 该模式下,配置类就是一普通类嘛,所以@Bean方法可以使用`private/final`等进行修饰(static自然也是可以的) #### Full模式 在常见的场景中,`@Bean`方法都会在标注有`@Configuration`的类中声明,以确保总是使用“Full模式”, #### 何时为Full模式 标注有`@Configuration`注解的类被称为full模式的配置类。自Spring5.2后这句话改为下面这样我觉得更为精确些: - 标注有`@Configuration`或者`@Configuration(proxyBeanMethods = true)`的类被称为Full模式的配置类 #### 小总结 - 该模式下,配置类会被CGLIB增强(生成代理对象),放进IoC容器内的是代理 - 该模式下,对于内部类是没有限制的:可以是Full模式或者Lite模式 - 该模式下,配置类内部**可以通过方法调用**来处理依赖,并且能够保证是同一个实例,都指向IoC内的那个单例 - 该模式下,@Bean方法不能被`private/final`等进行修饰(很简单,因为方法需要被复写嘛,所以不能私有和final。defualt/protected/public都可以哦),否则启动报错(其实IDEA编译器在编译器就提示可以提示你了): ### 异常 `Throwable`:分为Error和Exception两大分支 异常Exception它本身还分为两大重要的分支:Checked Exception(可检查异常,如IOException)和Unchecked Exception(不可检查异常,如RuntimeException) #### 1.AbstractHandlerExceptionResolver 可以看到所有其它子类的实现都是此抽象类的子类,所以若我们自定义异常处理器, ~~~java @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void extendHandlerExceptionResolvers(List exceptionResolvers) { // 自定义异常处理器一般请放在首位 exceptionResolvers.add(0, new AbstractHandlerExceptionResolver() { @Override} ~~~ #### 2.ExceptionHandler