在牛客网刷的题目,类似于补基础了?
这里按照知识点进行分类,因为发现有些同样的知识点不同的题目还是很痛苦。
这里就不用颜色标记了,因为我觉得都要记。
Spring容器篇
Spring容器也叫做Ioc容器(Ioc,在我之前写的随笔里面也有谈到),本质上就是一个工厂。
Spring容器不仅可以管理Bean,还能管理Bean的生命周期、作用域。
(放链接时想要大家都可以去看,作为记录这里只是写一些简短内容,链接通常会有更加复杂的内容。)
一文读懂 Spring Bean 的生命周期_spring bean的生命周期-CSDN博客
Bean的生命周期:
-
- 实例化 Instantiation
- 属性赋值 Populate
- 初始化 Initialization
- 销毁 Destruction
具体的代码:
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { // 实例化阶段 instanceWrapper = this.createBeanInstance(beanName, mbd, args); } ... Object exposedObject = bean; try { // 属性赋值阶段 this.populateBean(beanName, mbd, instanceWrapper); // 初始化阶段 exposedObject = this.initializeBean(beanName, exposedObject, mbd); } catch (Throwable var18) { ... } ... }
Bean的作用域:
singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。(SpringBean的默认作用范围)
prototype : 每次请求都会创建一个新的 bean 实例。
request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
global-session: 全局 session 作用域,仅仅在基于 Portlet 的 web 应用中才有意义,Spring5 已经没有了。Portlet 是能够生成语义代码(例如:HTML)片段的小型 Java Web 插件。它们基于 portlet 容器,可以像 servlet 一样处理 HTTP 请求。但是,与 servlet 不同,每个 portlet 都有不同的会话。
Spring容器一般是自动创建的,一个类实现ApplicationContextAware接口,重写setApplicationContext方法就可以获取到ApplicationContext对象。
Spring容器的顶层接口时BeanFactory,而常用的接口是ApplicationContext。
在BeanFactory定义方法中,getBean(String name)方法是从Spring容器中获取对应Bean对象的方法,如存在,则返回该对象。containsBean(String name)方法用于判断Spring容器中是否存在该对象。isSingleton(String name)方法用于判断Bean对象是否为单例对象。而getBean用来获取Bean的Class类型。
SpringAOP篇:
(来自于牛客网用户Mr丶PYK)
aop的五类通知: 前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
异常返回通知[After throwing advice]:在连接点抛出异常后执行。
返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。
环绕通知可以决定目标方法的调用也可以控制返回对象。
Spring事务:
Spring规定的7种类型的事务传播行为:
做题的时候记得看清楚(凝视)。
spring事务隔离级别;
幻读脏读什么的在隔壁的mysql刷题中也有提到。
补充知识: 事务属性的种类: 传播行为、隔离级别、只读和事务超时。
Spring注解篇:
(该篇主要是写一些注解的源码内容的)
@RequestMapping注解的属性包括 method , value , params等。
@Conditional是SpringMVC的注解,条件装配。
Spring @Conditional注解 详细讲解及示例_spring conditional-CSDN博客
@Autowired注解,如果一个类有多种类型,那么容器注入时就会有困扰。此时可以使用@Primary和@Qualifier注解。
(以下来自牛客网用户 李橙子)
@Autowired
注入声明的SpringBean对象,根据一定的规则首先按照注入的类型去查找,如果没有找到安装注入的名称去匹配你要注入的属性名称,如果都没有找到启动项目时抛出异常,@Autowired(required = false) 表示没有找到注入对象时,不抛异常,注入null。
@Primary
如果有多个相同类型的SpringBean,我们可以使用@Primary注解,优先注入带该注解标识的类,@Primary可以在多个类上标注,那就会抛异常。
@Quelifier
使用SpringBean的名称(SpringBean的名称都是唯一的)进行注入。
以下是Spring MVC注解的讨论:
@ControllerAdvice用于定义控制器的通知类,它可以对指定的控制器进行增强。
@InitBinder用于定义控制器参数绑定规则,如转换规则,它会在参数转换之前执行。
@ModelAttribute用于定义控制器方法执行之前,对数据模型的操作。
@ExceptionHandler用于定义控制器发生异常后的操作。
end;
@PostContruct是给Bean初始化,@PreDestroy是销毁,这俩控制Bean生命周期
@EnableAutoConfiguration注解,该注解结构如下:
以上的总结成四句话:该注解由组合注解@SpringBootApplication引入。该注解作用是开启Spring Boot自动配置。该注解会扫描各个jar包下的spring.factories文件,并加载文件中注册的AutoConfiguration类等。@EnableAutoConfiguration的关键功能是通过@Import注解导入的ImportSelector来完成的。
(补充知识:
.class文件理解:详解.class文件-CSDN博客
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题并且保留了解释型语言可移植的特点,而通过即时编译器(jit)又有编译型语言执行效率高的特点。所以 Java 程序运行时比较高效。Java通过字节码文件和虚拟机jvm之间的关系,做到了平台无关性,一次编译,各平台都可运行。
补充Clojure(Lisp 语言的一种方言)、Groovy、Scala 等语言都是运行在 Java 虚拟机之上。下图展示了不同的语言被不同的编译器编译成.class文件最终运行在 Java 虚拟机之上。
)对于class我就是理解成了另一种形式的缓存文件。
SpringBoot注解中,主要功能是启动Spring应用程序上下文时进行自动配置的注解是@EnableAutoConfiguration(原因如上)。
@Autowired是Spring提供的注解,@Resource是JDK提供的注解。它们的区别是,@Autowired只能按类型注入,@Resource默认按名称注入,也支持按类型注入。
@Autowired注解可以用于成员变量,方法,构造方法上。
@Qualifier用于声明Bean的名称,可以引用默认名称,能引用Bean的自定义名称。(Bean注解可以指定名称,写了就是自定义名称,不写就是默认名称)
@Bean注解可以用于装配任何Bean。
Spring MVC:
在控制器的方法中,我们可以直接使用Request、Response对象处理请求与响应(有印象,是那个参数)
ModelAndView对象,既可以存储模型数据,又可以存储模板路径。
Model对象只能存放模型数据,对象可以被自动实例化。
Spring MVC的核心组件是DispatcherServlet,负责分发所有的请求。
View是视图的顶层接口(在做的时候脑子蒙蒙的,现在想起来就是这样子的)
AbstractJackson2View不是逻辑视图,它不依赖ViewResolver的定位,直接将模型渲染为json。
AbstractUrlBasedView是逻辑视图,它依赖ViewResolver定位模板,然后将模型传入模板并渲染。
在Spring MVC中,Model、ModelMap、ModelAndView都可以作为数据模型对象,以上述类型作为控制器的方法参数时,Spring MVC会自动实例化这些类型。ModelAttribute是注解,用于定义控制器方法执行之前,对数据模型的操作。
Spring MVC拦截器包含三个方法:preHandle()、postHandle()、afterCompletion()。
(拦截器,理解成断点类似的就可以了)
参考链接:
https://blog.csdn.net/riemann_/article/details/118500805
https://blog.csdn.net/xcy1193068639/article/details/81491071
https://blog.csdn.net/isbn0123/article/details/118642699
标签:容器,Spring,bean,Bean,continue,spring,注解,执行,刷题 From: https://www.cnblogs.com/clina/p/18179366