目录
一、Spring框架的基本理解
二、Spring框架主要由哪些模块组成
三、 Spring IOC的理解
四、SpringIOC容器的理解
五、SpringDi的理解
六、什么是Spring的Bean
七、将一个类声明为bean的注解有哪些
八、@Compontent 和 @Bean 的区别
九、@Autowired和@Resource的区别
十、Spring框架常见的注入方式有几种
十一、Spring中常见的ApplicaionContext实现类有哪些
十二、BeanFactory和ApplicationContext有什么区别
十三、Spring框架中Bean的作用域
十四、Spring框架中Bean的线程安全
十五、Spring框架中Bean的生命周期
十六、Spring框架如何解决循环依赖
十七、Spring框架有哪些注解
十八、Spring框架中用到的设计模式
十九、Spring框架中AOP的基本理解
二十、Spring AOP 和 AspectJ AOP 有什么区别
二十一、SpringAop有哪些通知类型
二十二、Spring管理事务的方式有几种
二十三、Spring事务中有哪几种事务传播行为
二十四、Spring事务有哪些隔离级别
二十五、Spring事务在什么情况下会失效
二十六、谈谈对SpringMVC的理解
二十七、SpringMVC的执行流程
二十八、SpringMVC的核心组件有哪些
Spring框架他是一个轻量级框架,他的核心思想是IOC控制反转和AOP面向切面编程,他的主要作用是用于解耦,还可以简化一些第三方中间件的使用比如说,任务调度、缓存等。
核心模块 Core
测试模块 Testing
数据访问模块 Date Access
基于Servlet的应用程序开发 Web Servlet
企业级系统集成模块 Integration
Spring IOC 是控制反转 是指将创建对象的权力交给Spring管理,由Spring框架根据配置文件或者注解的方式,来创建Bean对象并对Bean对象之间的依赖关系进行管理,以达到松散耦合的关系,实现解耦。
IOC容器主要用于创建bean对象,并管理bean对象的生命周期,以及bean之间的依赖关系,以达到bean的注入。他的底层是通过ConCurrentHashMap来存储的,key是bean对象Id,value是对象本身。
Di是指依赖注入,指每一个Bean在被IOC从容器注入前都会依赖于一个她所需要的另一个Bean对象。
bean是ioc容器管理的对象
Controller层 用 @Controller
Service层用 @Service
Dao层用 @Repostory
通用 @Component
@Compontent 是用于类 而@Bean是用于方法
@Compontent是通过类路径扫描来完成将Bean自动装配到IOC容器中。
@Bean是通过@Bean注解来告诉IOC容器该方法的返回值是一个Bean。
@Autowired是Spring提供的自动注入注解 他是按类型完成注入,
@Resource是Jdk提供的 他是按名称完成注入。
构造方法注入。
setter方法注入。
成员属性注入,他是通过反射实现,破坏封装不推荐。
ClassPathXmlApplicationContext 这个是根据classpath下的配置文件加载bean
FileSystemXmlApplicatioContext 这个是根据当前磁盘下的绝对路径加载bean
AnnotationConfigApplicationContext 这个是根据读取到的注解加载bean
WabApplicationContext 这个是Web容器下按照配置文件加载bean
BeanFactory和ApplicationContext都是Spring的两大核心接口,都可以当Spring的容器
BeanFactory是最底层的接口 他定了Ioc的基本功能,比如bean的定义、加载、实例化等。
ApplicationContext接口则是BeanFactory的子接口,除了有BeanFactory的功能以外,还有一些其他功能,可以同时加载多个配置文件、可以监听bean的生命周期等。
BeanFactory的话 他是通过延迟加载的,就是只有用到这个bean时,才会对这个bean进行实例化,这样的话就不会提前发现一些不从在的spring配置问题。
而ApplicationContext是在容器启动时,一次性创建了所有的bean,这样就会提前发现spring中存在的配置错误,有利于检查所依赖属性是否注入。
singleton 单例模式 spring对该bean只会创建唯一实例,默认为单例。
prototype 原型模式 每次获取bean,都会创建一个新的bean实例。
session 会话模式 不同的HTTP会话,都会创建一个新的bean实例。
request 请求模式 不同的请求,都会创建一个新的bean实例。
使用 prototype作用域的话是不存在线程安全的,因为会原型模式的话,每次获取bean都会创建新的实例,不存在bean的共享。
使用singleton作用域的话会是存在线程安全的,因为只会创建一次实例,会发生资源的竞争。
解决方案:
尽量避免定义可以变的成员变量。
定义一个ThreadLocal成员变量,将需要可变的成员变量存在ThreadLocal中。
首先是Bean的实例化,通过配置文件或者注解对Bean的定义,利用反射来创建Bean的实例化。
注入对象依赖的属性值。
处理各种Aware接口
执行BeanPostProcessor前置处理,可以通过实现这个接口,可以进行一些自定义的前置处理。
执行InitializingBean初始化方法。
执行init-method自定义初始化方法。
执行BeanPostProcessor后置处理。
最后执行DisposableBean销毁Bean。
执行destory-method自定义销毁方法。
循环依赖指的是类与类之间的依赖关系形成了闭环,则会导致循环依赖问题的产生。
解决方法:
在Spring中设有三级缓存存储,可以通过三级缓存来解决循环依赖。
当A实例化对象但尚未初始化,先将A存储到三级缓存中。
在A进行属性注入时,需要B,则从缓存中查找,没有找到B。
当B实例化对象也未初始化,先将B也存储到三级缓存中。
B进行属性注入时,需要A,可以从三级缓存中获取到A,则A从三级缓存进入二级缓存。
B在执行完其他生命周期后,最终成为一个完整的Bean,存入到一级缓存中,删除掉二三级缓存。
这时A就可从一级缓存中获取到B,完成注入。
A执行完其他生命周期后,会从二级缓存存入一级缓存,删除掉二三级缓存。
首先声明Bean的注解
@Component @Controller @Service @Repository
用于注入的注解
@Autowired
声明配置、扫描、启动的注解
@Configuration 声明配置类
@ComponentScan 用于扫描 装配
@EnableScheduling 启动任务调度
@EnableAspectJAutoProxy 启动自动代理工厂
工厂模式 spring使用工厂模式,通过ApplicationContext和BeanFactory来创建对象。
单例模式 Bean默认的作用域基于单例模式实现。
代理模式 Spring的AOP实现就是依靠动态代理。
策略模式 Resource的实现类,针对不同的资源文件,实现不同方式的资源获取策略。
适配器模式 SpringAop的增强或通知使用到了适配器模式。
模板方法 Spring提供了JdbcTemplate、RedisTemplate等模板对象,将相同操作进行封装。
Aop指的是面向切面编程,其底层是使用动态代理来实现的,将那些逻辑相同的代码封装起来,形成一个可重用的模块,主要是为了防止代码冗余,降低耦合性。
如果这个被代理对象已经实现了某个接口,则是通过反射的方式来创建一个代理对象。
如果没有实现某个接口,则只能通过继承的方式来创建一个子类来做代理对象。
AspectJ是java提供的一个基于面向对象编程的一个独立框架,而Spring AOP是基于这个来实现的,AspectJ的功能更加强大,Spring AOP的话是使用起来比价简单。
SpringAop是运行时增强的,基于动态代理实现。而ASpectJAOP是编译时增强,基于字节码实现。
前置通知 指代码逻辑执行前发生
后置通知 指代码逻辑全部执行后 如果抛出异常 则不发生
异常通知 出现异常时发生
环绕通知 在方法的调用前后自定义发生
一种是通过@Transactional注解来声明事务 一般都是用这种
另一种是自己通过代码手动管理事务
TransactionDefinition.PROPAGATION_REQUIRED
指如果当前存在事务,则使用当前事务,不存在,则创建一个新的事务
TransactionDefinition.PROPAGATION_REQUIRES_NEW
创建一个新的事务,如果当前存在事务,则当前事务挂起,若不存在,则使用新事物。
TransactionDefinition.PROPAGATION_NESTED
如果当前存在事务,则创建一个新的事务做为该事务的嵌套事务,如果不存在,是使用该事务。
TransactionDefinition.PROPAGATION_MANDATORY
如果当前存在事务,则使用当前事务,如果不存在则抛异常。
TransactionDefinition.PROPAGATION_SUPPORT
如果当前存在事务,则使用当前事务,如果不存在,则不使用事务。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED
不使用事务,如果当前存在事务,则挂起。
TransactionDefinition.PROPAGATION_NEVER
不使用事务,如果当前存在事务,则抛出异常。
读未提交 指允许读尚未提交的数据
最低隔离级别,是可能发生脏读、幻读、不可重复读。
读已提交 允许读已经提交的数据
可以预防脏读、但仍然可能发生幻读和不可重复读,这个是Oracle的默认隔离级别。
可重复读 对一段数据多次读取结果是重复的 除非自身修改该数据
可以预防脏读和可重复读,可能发生幻读,这个是MySql的默认隔离级别。
串行化 所有事务依次执行
最高隔离级别,可以预防脏读、幻读、不可重复读。
数据不支持事务。
事务方法未被Spring管理,就是事务方法所在的类没有加载到IOC容器中。
方法没有被public修饰。
同一个类中方法相互调用,指A方法声明了事务注解,B方法调用A方法,则B方法事务失效。
没有配置事务管理器。
方法的事务传播类型不支持事务,比如说PROPAGATION_NOT_SUPPORTED和PROPAGATION_NEVER这两种事务传播方式。
不正常的捕获异常。
错误的标注异常类型。
首先MVC分别为模型、视图、控制器的简写。他的核心思想就是同过控制器请求、业务逻辑、数据封装、数据显示等节点的流程来写代码。所以这是一种设计模式,SpringMVC就是根据这种设计模式创建的一种框架,能够帮助我们进行更简洁的Web开发。
客户端发起请求,由核心处理器来拦截请求,核心处理器调用处理器映射器,处理器映射器根据uri取匹配查找能处理的请求处理器,将涉及到的拦截器和请求处理器一起封装。核心处理器调用处理器适配器适配执行请求处理器。请求处理器处理完用户请求后,返回一个模型视图对象给核心处理器,其中包含了数据模型以及视图信息。视图解析器会根据视图名称来解析视图文件,并根据视图解析器返回的数据模型传给视图文件,进行渲染,由核心处理器传给客户端浏览器。
DispatcherServlet 核心处理器 负责接收请求并转发给其他控制器 最后响应客户端。
HandlerMapping 处理器映射器 根据uri 查找匹配相应的请求处理器,并将拦截器和请求处理器一起封装。
HandlerAdapter 处理器适配器 适配执行对应的请求处理器
Handler 请求处理器 处理实际请求的处理器
ViewResolver 视图解析器 根据返回的逻辑视图名称,解析并渲染真正的视图文件,传递给核心处理器
注:本篇文章都是我自己的理解,可能用词和语句不够严谨,如有错误请评论指正,谢谢!(持续更新中......)