SSM框架:
Spring:
Spring是一个粘合剂,可以整合其他框架进行工作
Spring的主要技术是IOC和AOP
IOC:
依赖注入,控制反转,简单来说就是将对象的创建权力和生命周期管理过程交由Spring来处理,在开发过程中不在需要关注对象的创建和生命周期管理,
而是在需要时从Spring容器中获取,这个由Spring来创建对象和管理对象生命周期的机制称为控制反转
IOC不是技术,而是一种设计思想,IOC意味着将你设计好的对象给容器控制,而不是传统的在你的对象内部直接控制,
IOC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么对象都是主动创建,
但是在IOC/DI思想中,应用程序就变成被动的了,被动的等待IOC容器来创建并注入它需要的对象
IOC很好的体现了面向对象的设计法则:由IOC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找
注入方式:接口注入 && set方法注入 && 构造器注入 && 注解注入
接口注入:
接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。
set方法注入:
对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。
构造器注入:
在构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。
注解注入:
@Resource先会按照名称到spring容器中查找,如果查找不到,就回退按照类型匹配,如果再没有匹配到,就会抛出异常。如果在开发的时候,建议大家都是用@Resource(name=”userDao”),此时只能够按照名称匹配
无论是控制反转还是依赖注入对编程带来最大的影响不是从代码上,而是思想上转变,发生了“主从换位”的变化。应用程序原本是老大,
要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC/DI容器来创建并注入她所需要的资源了。
这一举动,有效的分离了对象和她所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
AOP:
AOP面向切面编程,OOP面向对象编程,AOP是OOP的延伸
OOP引入封装、继承和多态性(重载/重写)等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。
当我们需要为分散的对象引入公共行为的时候,OOP显得无能为力,oop允许你定义从上到下的关系,但并不适合定义从左到右的关系。
例如日志、异常、安全性、性能统计、事务处理等功能。日志代码往往水平地散布在所有对象层次中,而与对象的核心功能毫无关系。
这种散布在各处的无关的代码被称为横切代码,在oop设计中,它导致了大量代码的重复,模块间的耦合度高,而不利于各个模块的复用
简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,减少重复代码,降低模块间的耦合度,有利于未来的扩展性和可维护性。
切面:一个关注点的模块化,这个关注点可能会横切多个对象。基于@Aspect注解的方式来实现。
@Aspect:把当前类标记为一个切面类
@Pointcut:切入点,例如定义切入点表达式 execution (* com.sample.service.impl…*. (…))
execution()是最常用的切点函数,其语法如下所示:
整个表达式可以分为五个部分:
1、execution(): 表达式主体。
2、第一个号:表示返回类型, 号表示所有的类型。
3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
4、第二个号:表示类名,号表示所有的类。
5、(…):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数
@Before:标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有
@After: final增强,不管是抛出异常或者正常退出都会执行
@AfterThrowing:异常抛出增强,相当于ThrowsAdvice
@AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行
@Around:环绕增强,相当于MethodInterceptor
Bean的生命周期:
①通过构造器或工厂方法创建bean实例
②为bean的属性设置值和对其他bean的引用
③将bean实例传递给bean后置处理器的postProcessBeforeInitialization()方法
④调用bean的初始化方法
⑤将bean实例传递给bean后置处理器的postProcessAfterInitialization()方法
⑥bean可以使用了
⑦当容器关闭时调用bean的销毁方法
SpringMVC:
SpringMVC是一个WEB层框架,主要用来负责与页面的交互
Spring整合SpringMVC可以做到无缝集成。特点就是简单易用性能佳
SpringMVC和Spring的关系:
SPringMVC是SpringWeb框架的一部分
SpringMVC是一个MVC的Web层框架
SpringMVC和Spring是父子容器,浑然天成;而struts2等是需要单独进行整合;
请求流程:
1.前端请求被DispatcherServlet(前段控制器)接受
2.DispartcherServlet调用HandleMapping,HandleMapping中有个Map,在程序启动时根据xml配置文件或者注解加载Handle到Map容器,
根据请求的URI在Map中匹配查找Handler处理器
3.生成Handler以及handlerInterceptor
4.返回HandlerExecutionChain(Handler+HandlerInterceptor)
5.DispatcherServlet通过HandlerAdapter去执行相应的Handler
6.Handler返回一个ModelAndView
7.通过ViewResolver(视图解析器)进行解析
8.视图解析器返回填充了模型数据的视图View,最后展示给前端
SpringMVC的组件:
前端控制器(DispatcherServlet)
本质上是一个Servlet,相当于一个中转站,所有的访问都会走到这个Servlet中,再根据配置进行中转到相应的Handler(Controller)中进行处理,获取到数据和视图后,在使用相应视图做出响应。
处理器映射器(HandlerMapping)
本质上就是一段映射关系,将访问路径和对应的Handler(Controller)存储为映射关系,在请求时匹配查询Handler。
处理器适配器(HandlerAdapter)
本质上是一个适配器,可以根据要求找到对应的Handler(Controller)并执行。前端控制器通过处理器映射器找到对应的Handler信息之后,将请求响应和对应的Handler信息交由处理器适配器处理,处理器适配器找到真正handler执行后,将结果即model和view返回给前端控制器
视图解析器(ViewResolver)
本质上也是一种映射关系,可以将视图名称映射到真正的视图地址。前端控制器调用处理器适配完成后得到model和view,将view信息传给视图解析器得到真正的view。
Mybatis:
MyBatis是一个半自动ORM的持久层框架。
常见的数据层访问方式比较
JDBC:
1.java原生的关系型数据库访问方式
2.每次操作数据库都需要获取连接关闭连接,在大量访问数据库时,频繁的开关连接消耗性能。
3.需要手动编写sql,有学习成本
4.查询出的结果需要手动进行封装到bean
5.没有缓存处理机制
6.sql语句写死在程序中,需要修改sql必须修改源文件
Hibernate
1.基于面向对象理念设计的DAO层框架,基本理念就是维护对象到表的映射关系,通过操作对象操作表中的数据,从而可以减少甚至杜绝sql的使用
2.相对比较沉重,效率不好
3.当涉及到比较复杂的查询时Hibernate的操作对象的方式用起来非常麻烦,甚至无法实现,只能用sql操作
4.底层需要频繁的拼接sql,产生大量冗余的sql
MyBatis
特点:
mybatis是一种持久层框架,也属于半自动ORM映射。前身是ibatis。
相比于hibernate为全自动化,配置文件书写之后不需要书写sql语句,但是欠缺灵活,很多时候需要优化;
mybatis为半自动化,需要自己书写sql语句,需要自己定义映射。增加了程序员的一些操作,但是带来了设计上的灵活,
并且也是支持hibernate的一些特性,如延迟加载,缓存和映射等;对数据库的兼容性比hibernate差。移植性不好,
但是可编写灵活和高性能的sql语句。
优缺点:
1.sql语句与代码分离,存放于xml配置文件中:
优点:便于维护管理,不用在java代码中找这些语句;
缺点: JDBC方式可以用用打断点的方式调试,但是Mybatis不能,需要通过log4j日志输出日志信息帮助调试,然后在配置文件中修改。
2.用逻辑标签控制动态SQL的拼接:
优点:用标签代替编写逻辑代码;
缺点:拼接复杂SQL语句时,没有代码灵活,拼写比较复杂。不要使用变通的手段来应对这种复杂的语句。
3.查询的结果集与java对象自动映射:
优点:保证名称相同,配置好映射关系即可自动映射或者,不配置映射关系,通过配置列名=字段名也可完成自动映射。
缺点:对开发人员所写的SQL依赖很强。
4.编写原声SQL:
优点:接近JDBC,比较灵活。
缺点:对SQL语句依赖程度很高;并且属于半自动,数据库移植比较麻烦,比如mysql数据库编程Oracle数据库,部分的sql语句需要调整。
MyBatis的缓存机制:
缓存机制可以减轻数据库的压力,原理是在第一查询时,将查询结果缓存起来,之后再查询同样的sql,不是真的去查询数据库,而是直接返回缓存中的结果。
缓存可以降低数据库的压力,但同时可能无法得到最新的结果数据。
MyBatis的一级缓存
MyBatis的一级缓存默认就是开启的,也可以通过配置禁用一级缓存
MyBatis的二级缓存
MyBatis的二级缓存默认是关闭的
接口的使用
为了简化MyBatis的使用,MyBatis提供了接口方式 自动化 生成调用过程,可以大大简化MyBatis的开发
开发接口:接口的名字和映射文件的名字相同,接口中方法的名字和要调用的映射文件中的标签的id相同,方法的参数和被调用的标签中的sql中需要的参数对应
真正的开发中,都是使用这种接口+配置文件方式,实现MyBatis的使用。
常用的标签:
select insert update delete if foreach selectKey include sql where trim set choose collection
其他:#{}取值自动增加双引号,能够防止sql注入,而且#{}格式的sql能够预编译,能再内存中保存sql语法,不用重新组装sql语法
${}取值不带双引号,如需传入表明、排序字段名可使用,但不安全,有sql注入风险
————————————————
版权声明:本文为CSDN博主「usernamehui」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/usernamehui/article/details/106240137