一、spring IOC
- tomcat 在启动的时候,直接会启动spring 容器
- spring ioc,spring 容器,根据xml配置,或者是你的注解,去实例化你的一些bean对象,然后根据xml配置或者注解,去对bean对象之间的引用,去进行依赖的注入
- 底层的核心技术,反射,他会通过反射的技术,直接根据你的类去自己构建对应的对象出来,用的就是反射技术
- 使用 spring ioc ,系统的类与类之间彻底解耦了。
二、spring AOP
- spring 核心框架里面,最关键的两个机制,就是ioc和aop,根据xml配置或者注解,去实例化我们所有的bean,管理bean之间的依赖注入,让类与类之间解耦,维护代码的时候可以更加轻松便利。
spring 已经管理了我们代码里所有的这个类的对象实例,bean
- 事务,MySQL,数据库里都提供一个事务机制,我们如果开启一个事务,在这个事务里执行多条增删改的SQL语句,在这个过程中,如果任何一个sql语句失败了,都会导致这个事务的回滚,把其他sql做的数据更改都恢复过去
在一个事务里的所有SQL,要么一起成功,要么一起失败,事务功能可以保证我们的数据的一致性,在业务逻辑组件里去加入这个事务
- 做一个切面,如何定义呢?MyserviceXXX 这种类,在这类的所有方法中,都织入一些代码,在所有这些方法刚开始运行的时候,都先去开启一个事务,在所有这些方法运行完毕之后,去根据是否抛出异常来判断一下,如果抛出异常,就回滚事务,如果没有异常,就提交事务
- 面相切面编程,aspect
- spring 在运行的时候,动态代理技术,aop的核心技术,就是动态代理
它会给你的那些类生成动态代理
controller 注入的是动态代理的对象实例
重复的代码
三、java bean
java bean 绝对不可能是线程安全的,spring bean 默认来说,singleton,都是线程不安全的,java web 系统,一般来说很少在spring bean 放一些实例变量,一般来说都是多个组件互相调用,最终去访问数据库。
四、事务机制
事务的实现原理,事务传播机制,如果说你加了一个@Transactional注解 此时spring就会使用aop思想,对你的这个方法在执行之前,先去开启事务,执行完毕之后,根据你方法是否报错,来决定回滚还是提交事务
五、spring boot 核心框架
spring 框架,mybatis , spring mvc ,去做一些开发,打包到线上的tomcat里去,tomcat启动了,他就会接收http请求,转发给spring mvc 框架,调用 controller->service->dao->mybatis (sql)
java web 开发的时候,在这里整合进来redis,elasticsearch,还有很多其他的一些东西,rabbitmq,等等,诸如此类
国外的spring开源社区,就发起了一个项目,spring boot,我们基于spring boot直接进行开发,里面还是使用spring+spring mvc + mybatis一些框架,我们可以一定程度上来简化我们之前的开发流程
spring 做很多配置,自己去定义一些bean,流程比较繁琐
spring boot 内嵌一个tomcat 直接让我们直接将写好的java web 系统启动起来
自动装配,比如说我们可以引入mybatis,其实主要引入一个starter依赖,他会一定程度上自动完成mybatis的一些配置和定义,不需要我们手工去做大量配置,一定程度上简化搭建工程的成本
引入一些mybatis 的jar 包,还有mybatis依赖的一些其他jar包,然后动手编写一些xml配置文件。然后定义一些bean,写一些sql,写一写dao。
spring boot 只要引入一个starter,他会自动给你引入需要的jar包,非常简单的,必须的配置,比如数据库的地址,几乎就不用你做太多的其他额外的配置了,他会自动帮你去进行一些配置,定义和生成对应的bean
生成的bean 自动注入到你的dao中,让你免去一些手工配置+定义bean的一些工作
spring boot + spring + spring mvc + mybatis + XXX 之类的技术去进行开发,后续很多配置和定义的一些繁琐的复杂的工作就免去了,自动装配一些的一些功能,自动给你把一些事情干完了,不需要你去做。
六、spring boot 关键原理
- spring bean 生命周期,从创建–> 使用–>销毁
- 你在系统里用xml或者注解,定义一大堆的bean
- 设置对象属性(依赖注入):他需要去看看,你的这个bean依赖了谁,把你依赖的bean也创建出来,给你进行一个注入,比如说通过构造函数
- 接着,spring会检测该对象是否实现了xxxAware 接口,并将相关的xxxAware实例注入给bean:
a. 如果这个bean 已经实现了beanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是spring 配置文件中的id值
b. 如果这个bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是spring 工厂自身
c. 如果这个Bean已经实现了ApplicationContextAware接口,spring 容器就会调用bean的setApplicationContext(ApplicationContext)方法,传入spring上下文
d. beanPostProcessor:如果想对bean进行一些自定义的处理,那么可以然bean实现了beanPostProcessor接口,那将会调用postProcessorBeforeInitializtion(Object obj,String s)方法。
e. InitializingBean与init-method:如果bean 在spring配置文件中配置了init-method 属性,则会自动调用其配置的初始化
七、spring中使用了哪些设计模式
工厂,单例,代理
- 工厂模式,spring ioc 核心的设计模式的思想体现,他自己就是一个大工厂,把所有的bean实例都给放在了spring容器里(大工厂),如果你要使用bean,就找spring容器就可以了
- spring默认来说,对每个bean走的都是一个单例模式,确保说你的一个类在系统运行期间只有一个示例对象,只有一个bean
- 代理模式:如果说你要对一些类的方法切入一些增强的代码,会创建一些动态代理的对象,让你对那些目标对象的访问,先经过动态代理对象,动态代理对象先做一些增强的代码,调用你的目标对象
在设计模式里,就是一个代理模式的体现和运用,让动态代理的对象,去代理你的目标对象,在这个过程中做一些增强
七、spring mvc 核心架构
核心 : servlet:DispatcherServlet
- tomcat 的工作线程将请求转交给spring mvc 框架的 DispatcherServlet
- DispatcherServlet 根据请求信息调用 HanderMapping, 解析请求对应的Handler(查找@Controller ),我们一般会给controller 加上 @RequestMapping 注解,标注哪些controller用来处理哪些请求,此时根据请求的uri,定位到controller进行处理
- 解析到对应的Handler后,开始由HandlerAdapter适配器处理。(查找@RequestMapping ),对每个方法一般也会加@RequestMapping
- 他会直接调用controller 的某个方法来处理请求
- 我们的controller方法有一个返回值,以前的时候走jsp、模板技术,返回一个模板页面,spring mvc使用模板技术,对html页面做一个渲染;现在返回一个 json 串,前后端分离
- 再把渲染以后的 html 页面返回给浏览器去进行显示;前端负责把html页面渲染给浏览器
八、spring cloud 核心架构
spring boot、spring、spring mvc,让你开发那种单体架构的系统,spring cloud让你开发分布式系统,让你把系统拆分为很多子系统,子系统互相之间进行请求和调用,