首页 > 技术文章 > 知识总结

wanjx 2019-05-07 17:03 原文

Spring IOC,DI

IOC是一种设计思想,将对象的控制权由程序本身交给Spring Bean容器来管理
这种控制反转的思想极大的降低了对象间的耦合度,提高了代码的灵活性和重用性。
DI是实现这种思想的一种依赖注入机制

在平时的java应用开发中,我们要实现某一个功能可能需要多个对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作对象的主动权和创建时机是由自己把控的,而这样就会使得对象间的耦合度高了,A对象需要使用合作对象B来共同完成一件事,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起,而使用了Spring之后就不一样了,创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题,A得到Spring给我们的对象之后,两个人一起协作完成要完成的工作即可。所以控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。
DI(依赖注入)其实就是IOC的另外一种说法,DI是由Martin Fowler 在2004年初的一篇论文中首次提出的。他总结:控制的什么被反转了?就是:获得依赖对象的方式反转了。
IoC是设计思想,IoC有三个核心:BeanFactory、反射、DI。BeanFactory利用反射实现对象的创建,DI实现对象关系管理。
IOC Bean容器(配置文件,工厂,容器,全局访问点)
spring容器初始化resouceLoader读取配置文件,通过流读取,把BeanDefinition放到map中然后交给beanFactory底层通过反射来创建实例对象放在map中,如果是延迟加载在需要的时候才会创建实例,如果bean配置不是singleton它不会把实例放到map中,在第二次要使用时就会从map中取.


Spring Aop:
Aop是一种面向切面设计思想,它是OOP的完善,在对象运行的过程中,动态的切入功能,实现业务扩展和解耦,控制对象的执行
它实现了OCP原则 对扩展开放,对修改关闭,不修改原先的类
AOP主要用在,日志的处理,事务处理,权限处理,缓存处理等等
反射:是java一种技术,基于这个技术提供若干个api,通过这种api能够动态的取获取类,类属性和方法, 动态的去调用这些属性和方法,这种机制我们通常把它称之为自省机制,通过这种机制能够在对象动态运行过程当中控制对象. 然后动态的控制方法的执行,或者调用方法,改变对象的值等等...

三个核心:
  定义切面Aspect
  定义通知方式
  定义切入点表达式

实现方式:
  基于XML配置的Spring AOP
    大致流程:配置文件中配置切入点 在java中用编写实际的切面类, 针对切入点进行相关的业务处理
  使用注解配置AOP
    大致流程和上一种基本相似,只是将切入点表达式用注解的方式直接在切面类中声明

Spring MVC
主要是一种分层思想,让程序各个层级达到了各司其职各尽所能的效果
mvc工作流程:
用户发送请求至前端控制器DispatcherServlet
DispatcherServlet收到请求调用HandlerMapping处理器映射器。
处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
执行处理器(Controller,也叫后端控制器)。
Controller执行完成返回ModelAndView
HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
DispatcherServlet将ModelAndView传给ViewReslover视图解析器
ViewReslover解析后返回具体View
DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
DispatcherServlet响应用户


mybatis框架:
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。它消除了大部分的 JDBC 代码和参数的手工设置以及结果集的检索。
1、 简化JDBC的开发
2、 能够更好的完成ORM(对象关系映射)

流程:
SqlMapConfig.xml:此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
UserMapper.xml:sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
SqlSessionFactory:通过mybatis环境等配置信息构造会话工厂对象
SqlSession:由会话工厂创建会话,操作数据库需要通过SqlSession进行。
User:Executor把执行sql后的内容输出映射到java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
Mybatis框架是由一个核心配置文件config.xml和一个Mapper.xml映射文件,通过SqlSessionFactory这个会话工厂类,生产出一个sqlSession会话对象,用此会话对象执行Mapper.xml中相应的sql语句操作数据库,把结果集映射相应的实体类对象,完成高级映射。

mybatis的缓存机制,一级,二级介绍一下
一级缓存
默认开启
SqlSession级别的缓存,实现在同一个会话中数据的共享
一级缓存的生命周期和SqlSession一致
当有多个SqlSession或者分布式环境下,数据库写操作会引起脏数据。
二级缓存
默认不开启,需手动开启
SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量
可自定义存储源,如Ehcache
当开启缓存后,数据查询的执行的流程是:二级缓存>一级缓存>数据库
不同于一级缓存,二级缓存可设置是否允许刷新和刷新频率实现
  要求pojo对象必须实现Serializable接口
  配置:在核心配置文件中的<setings>中<setting>标签将name指定为cacheEnabled将value指定为true,在需要缓存操作的mapper.xml文件中配置<cache>标签


shiro框架:
  shiro的核心组件:
    组件:subject、security Manager、session Manager、cache Manager、Authenticator、Authorizer、realms、cryptography密码管理
认证的具体流程分析如下:
1)系统调用subject的login方法将用户信息提交给SecurityManager
2)SecurityManager(它只是对外的一个窗口)将认证操作委托给认证器对象Authenticator(认证管理器需要将客户端传来的信息和Realm从数据库查询的数据进行比对)
3)Authenticator将身份信息传递给Realm。 继承AuthorizingRealm
4)Realm访问数据库获取用户信息然后对信息进行封装并返回(Authenticator)。
5)Authenticator 对realm返回的信息进行身份认证。

授权的具体流程分析如下:
1)系统调用subject相关方法将用户信息(例如isPermitted)递交给SecurityManager
2)SecurityManager将权限检测操作委托给Authorizer对象
3)Authorizer将用户信息委托给realm. 继承AuthorizingRealm
4)Realm访问数据库获取用户权限信息并封装。
5) Authorizer对用户授权信息进行判定。

配置:
1.添加shiro框架依赖(spring整合shiro)
2.Shiro 基本组件配置:Spring 集成shiro框架的基本应用(@Bean("securityManager")、@Bean("shiroFilterFactory"))
3.Shiro 核心过滤器配置
4.在注解启动类(AppWebInitializer)中,重写onStartup方法,完成过滤器的注册


Spring Boot:
  概念:Spring Boot可以轻松创建独立的,生产级的基于Spring的应用程序,springBoot内部提供了非常简单的整合工具包,如果需要整合第三方程序,只需要简单的配置即可.  
  特点:
    1.内嵌Tomcat可独立运行
    2.可在在yml配置文件中切换运行环境
    4.整合第三方框架容易.
    5.SpringBoot提倡使用配置类,减少配置文件的使用.
  配置文件说明:
    1.springBoot程序在启动时会默认加载名称为application.properties的配置文件.
    2.如果使用properties文件配置,引用较为繁琐.没有层次感.
    3.官方建议使用yml文件编辑.


Spring Cloud:
  概念:主要提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。 可以跟spring boot框架一起使用。

推荐阅读