Spring 基础知识

Spring Framework

Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以整合众多Web框架使用。

Spring Framework共有12个组件,真正核心组件有3个:SpringCore、Contenxt 和 Bean。它们为Spring打下了基础,支撑了Spring的框架结构。Spring的其他功能特性,如Web、AOP、JDBC等都是基于它而开发的。

Spring是一个基于控制反转和面向切面的容器框架。
Spring框架主要由七部分组成,分别是 Spring Core、Spring AOP、Spring ORM、Spring DAO、Spring Context、Spring Web 和 Spring Web MVC。
Spring 基础知识_第1张图片

Spring 的核心?

容器,是Spring框架最核心的部分。容器管理着Spring应用中bean的创建、配置和管理。
https://www.cnblogs.com/walkinhalo/p/9601226.html
https://www.cnblogs.com/vince66/p/9244580.html

IoC 与 DI

IoC 控制反转(Inversion of Control),不是什么技术,是一种设计思想。

DI 依赖注入(Dependency Injection),是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。

IoC 是将对象的创建的权力及对象的生命周期的管理过程交由Spring框架来处理,从此在开发过程中不在需要关注对象的创建和生命周期的管理,而是在需要的时候由Spring框架提供,这个由Spring框架管理对象创建和生命周期的机制称之为控制反转
而在创建对象的过程中Spring可以依据配置对象的属性进行设置,这个过程称之为依赖注入

Spring的核心是IOC,作用有三:
1.创建对象;
2.管理对象的依赖关系;
3.避免了大量单例模式和工厂模式的泛滥。

容器 Spring Context

容器和应用上下文

容器是Spring框架实现功能的核心,它负责了对象整个的生命周期的管理——创建、装配、销毁。

容器通过DI管理Spring应用的对象。Spring负责应用程序中对象的创建,依赖关系,组装与配置。Spring中的容器有多种,大致可以分为BeanFactory工厂类和ApplicationContext应用上下文两大类。BeanFactory 提供了基本的DI支持,ApplicationContext 基于BeanFactory构建, 提供应用框架级别的服务。

DI只描述对象的创建方式,不负责创建.

Tomcat正是一个运行Servlet的web容器,而Spring要想实现依赖注入功能,就离不开对象生产的容器。关于Spring的这个容器你最常听到就是IOC容器。

实际上,容器里面什么都没有,决定容器里面放什么对象的是我们自己,决定对象之间的依赖关系的,也是我们自己,容器只是给我们提供一个管理对象的空间而已。那么,我们怎么向容器中放入我们需要容器代为管理的对象呢?这就涉及到Spring的应用上下文了。

Bean的生命周期

1.bean实例化
2.bean注入属性
3.调用BeanNameAware.setBeanName()
4.调用BeanFactoryAware.setBeanFactory()方法
5.调用ApplicatioonContextAware.setApplicationContext()方法
6.调用BeanPostProcessor.postProcessBeforeInitializaion()方法
7.调用InitializingBean.afterPropertiesSet()方法,如果使用init-method声明了初始化方法,则也会调用初始化方法
8.调用BeanPostProcessor.postProcessAfterInitialization()方法
9.bean就绪,存在上下文中
10.调用DisposableBean.destroy()方法, 如果destroy-method方法被声明, 也同时调用

ApplicationContextAware接口

一、这个接口有什么用?
当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean。换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象。
http://blog.csdn.net/kaiwii/article/details/6872642

ApplicationContext

应用上下文,就是将你需要Spring帮你管理的对象放入容器的一种容器对象,应用上下文即是Spring容器的一种抽象化表述;而我们常见的ApplicationContext本质上说就是一个维护Bean定义以及对象之间协作关系的高级接口。这里,我们必须明确,Spring的核心是容器,而容器并不唯一,框架本身就提供了很多个容器的实现,大概分为两种类型:一种是不常用的BeanFactory,这是最简单的容器,只能提供基本的DI功能;还有一种就是继承了BeanFactory后派生而来的应用上下文,其抽象接口也就是我们经常用的ApplicationContext,它能提供更多企业级的服务,例如解析配置文本信息等等,这也是应用上下文实例对象最常见的应用场景。有了上下文对象,我们就能向容器注册需要Spring管理的对象了。对于上下文抽象接口,Spring也为我们提供了多种类型的容器实现,供我们在不同的应用场景选择——
  ① AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;
  ② ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;
  ③ FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;
  ④ AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;
  ⑤ XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。
  有了以上理解,问题就很好办了。你只要将你需要IOC容器替你管理的对象基于xml也罢,java注解也好,总之你要将需要管理的对象(Spring中我们都称之问bean)、bean之间的协作关系配置好,然后利用应用上下文对象加载进我们的Spring容器,容器就能为你的程序提供你想要的对象管理服务了。

ApplicationContext:核心接口定义.继承了环境信息,工厂信息,事件发布,资源加载接口
AbstractApplicationContext:提供ApplicationContext的基本实现,最主要定义了refresh方法,也就是刷新流程定义,让子类重写钩子即可完成拓展,非常的灵活
AbstractRefreshableApplicationContext:提供了refreshBeanFactory()抽象方法的实现,使用DefaultListableBeanFactory为默认的BeanFactory,提供
loadBeanDefinitions抽象方法,让子类专注于通过各种方式加载BeanDefinition
AbstractXmlApplicationContext和ClassPathXmlApplicationContext:loadBeanDefinitions实现从classpath路径下载入xml解析BeanDefinition方式
AnnotationConfigWebApplicationContext:目前使用较多的容器对象,loadBeanDefinitions实现为扫描注解加载BeanDefinition

AOP 使用场景

1. Authentication 权限认证
2. Logging 日志
3. Transaction 事务
4. Lazy Loading 懒加载
5. Context Process 上下文处理
6. Error Handler 错误跟踪
7. Cache 缓存

HandlerInterceptor 实现主题与多语言监听器

Spring AOP实现原理

AOP为Aspect Oriented Programming面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

Spring中的设计模式-适配器模式

Spring中的设计模式-适配器模式
https://blog.csdn.net/adoocoke/article/details/8286902

Spring中也有适配器模式的典型应用。
在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即生成被代理类的代理类,并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。

Advice(通知)的类型有:BeforeAdvice、AfterReturningAdvice、ThreowSadvice的。
在每个类型Advice(通知)都有对应的拦截器,MethodBeforeAdviceInterceptor、AfterReturningAdviceInterceptor、ThrowsAdviceInterceptor。

Spring需要将每个Advice(通知)都封装成对应的拦截器类型,返回给容器,所以需要使用适配器模式对Advice进行转换。

mian Shi Ti

描述一下Bean的生命周期

Spring 基础知识_第2张图片

Spring 的 AOP 底层代码是如何实现的?
循环引用问题,以及Spring中使用到的设计模式
Spring的事务是如何回滚的?
Spring是如何解决循环依赖的问题的?
Spring IOC的原理以及底层实现?
Bean Factory与FactoryBean 的区别?@Bean这个注解是如何实现Bean的注入的?

BeanFactory 是Spring IoC容器的基本功能规范,是IoC容器所应遵守的最底层和最基本的编程规范。

谈一下Spring 事务传播

.

Spring事务会失效的几种情况

1.Bean没有纳入Spring容器管理;
2.自调用,即调用当前类的方法,比如用this调用当前类的方法;
3.异常没有抛出,被try catch了;
4.抛出的不是RuntimeException 且没有指定rollbackFor=异常类型;
5.事务方法不是public的;
6.事务方法内启动新线程进行异步操作;
7.数据库不支持事务。

理解 Spring ApplicationListener 和 CommandLineRunner

https://blog.csdn.net/qq_38962655/article/details/112985006

Mian Shi Ti 2

1、spring中bean的生命周期
2、spring创建bean的流程
3、什么是spring的循环依赖问题
4、spring循环依赖问题如何解决
5、为什么spring使用三级缓存解决循环依赖问题
6、spring循环依赖源码解析
7、修改spring源码尝试二级缓存是否解决循环依赖问题

Mian Shi Ti 3

为什么要使用Spring,Spring的优缺点有哪些
Spring的IOC容器初始化流程
Spring的IOC容器实现原理,为什么可以通过byName和ByType找到Bean
Spring注解Resource和Autowired区别对比详解
Spring中Qualifier用处,处理注入不准确的问题

过滤器 和 拦截器

http://www.bubuko.com/infodetail-3079641.html

(0)过滤器是J2EE标准,是在请求之前进入容器之后,还未进入Servlet之前进行预处理。而拦截器是被包裹在过滤器之中的。
(1)Filter需要在web.xml中配置,依赖于容器;Interceptor在SpringMVC中配置,依赖于框架;
(2)拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。
(3)Filter的执行顺序在Interceptor之前。在Action生命周期中,拦截器可以被多次调用;而过滤器只能在容器初始化时执行一次。
(4)过滤器和拦截器的底层都是一样的,就是分了不同的功能实现,一个是拦截所有,一个是拦截具体的url;并且拦截器可以拦截静态资源。
(5)拦截器可以访问Action上下文,值栈里面的对象;过滤器不可以。拦截器可以获取IOC容器的各个bean,过滤器不行。

其他区别:
(1)从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。
(2)Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。

参考资料

Spring 的 BeanFactory 和 FactoryBean
https://mp.weixin.qq.com/s/pS96RmLll4XeKLyHHbd05Q

spring官方文档的解读
https://blog.csdn.net/li1376417539/article/details/104951358/

Spring-Context
https://www.jianshu.com/p/e1a4d38be670

你可能感兴趣的:(Spring,spring)