ssm三大框架基础总结

什么是框架?框架就是程序的架子

SpringIOC
Spring框架的俩大核心(IOC(DI依赖注入)(控制反转),AOP(面向切面编程))
IOC:把对象交给spring去管理(作用是降低耦合)
Spring获取对象的方式通过id或者通过bean获取

Spring原理:初始化spring容器时,加载spring核心配置文件时,会发现bean标签,利用反射去创建该对象,然后将创建出的对象放到spring内置的Map中,键就是id值就是该对象,然后利用指定的getbean或者getid去获取对象,找不到就抛出异常

Spring创建对象的方式:spring底层默认通过反射去创建对象,前提必须有无参构造,如果没有可通过静态工厂,实例工厂,spring工厂(需要实现FactoryBean接口)去创建对象,

Spring的单例模式:spring创建对象默认单例模式 单例模式可以减少对象的创建,减少资源的浪费(配置方法:在Applicationcontext.xml下配置scop标签)

Spring的懒加载:spring大多数创建对象都是单例模式,容器初始化就开始创建对象。当创建了大量对象储存在Map中就会造成内存消耗,资源浪费的问题,为了防止不必要的对象创建,需要在创建,而不是初始化就创建,可以使用懒加载(配置方式:在Applicationcontext.xml下配置,需要懒加载的对象 )
注(多例模式懒加载无用)

对象的初始化和销毁:在spring中把对象的初始化和销毁交给了spring容器管理(配置方法 )

SpringDI:注入有三种方法1.设置器注入(前提bean对象有set方法)2.基于构造器注入
自定义bean的注入,自动装配 3.接口注入

注解方式IOC :需要在配置文件引进context约束,配置包扫描,在需要创建的bean加上注解@Component,也可在后面指定Id,不指定自动推断id

注解方式DI,需要开启注解方式
自定义bean的注入:@Autowired 先按照类型匹配,找到唯一的类就注入,找到多个或者没有找到就开始按照id进行匹配。找到注入。找不到失败,可以用@Qualifire强制指定id

Spring其他注解:单例@Scope(value=“singleton/prototype”)@Lazy懒加载机制@PostConstruct @PreDestroy配置初始化和销毁方法 @Controller 控制层@Service service层 @Repository dao层@Component

SpringAOP
什么是SpringAop:基于动态代理技术,在层与层之间增强功能,在不改变目标层的代码,这样夹在层与层之间的叫切面,这种开发技术叫做面向切面编程技术(高内聚)
SpringAOP的基本概念:
切入点表达式:within粗粒度表达式只能匹配到类
Execution细粒度表达式,可以匹配到方法

连接点:对目标层方法的调用
切入点:根据切入点规则,动态代理拦截下来的连接点
切面:把这些动态拦截下的切入点交给类去管理,这个类叫做切面
通知:切面中真正增强功能的方法叫做通知
目标对象:被真真正调用的对象叫做目标对象
织入:将切面逻辑真正加到原有逻辑的叫做切面

五大通知:前置通知:目标执行前的通知,可以接受一个Joinpoint参数必须放在第一位可以通过这个jionpoint来获取目标方法和对象的信息。
环绕通知:目标方法执行前和后的通知,必须手动调用目标方法,不然不执行,得到的返回值必须返回给目标对象,也可以改变返回的信息。也可以接受一个ProceedJoinpoint参数来获取目标方法和对象的信息,
后置通知 :目标方法执行后的通知,注(必须目标方法执行成功)可以接受一个Joinpoint参数必须放在第一位可以通过这个jionpoint来获取目标方法和对象的信息。可以获取目标方法执行后的返回值
异常通知:可以接受一个Joinpoint参数必须放在第一位可以通过这个jionpoint来获取目标方法和对象的信息。可以获取目标方法执行异常的返回值
最终通知:目标方法执行后的通知,无论成功与否,都要执行,可以接受一个Joinpoint参数必须放在第一位可以通过这个jionpoint来获取目标方法和对象的信息,
注(通知执行的顺序和配置顺序有关)
注解配置AOP:

要想一个类成为切面在该类用@Aspect

通知的注解:

代理设计模式
静态代理:优点:结构清晰,易于理解,
缺点,如果被代理者有多个方法,需要开发多个方法,造成代码冗杂
Java内置的动态代理:不需要静态代理的代码实现,避免了代码的冗杂,但是他和代理者实 现相同的接口,如果被代理者有接口没有的方法,代理者就无法代理
Cglib代理:他是第三方动态代理,他基于继承,只有被代理者有的方法。他都可以代理,不仅仅受制与接口
Spring的事务
通过编程方式去管理事务,这样的方式很灵活,但是也很难维护,将事务管理和务代码分离,只需要用注解和配置xml来管理(注:重点)

SpringMVC
注(重点)SpringMVC控制器是单例模式,这样会如果有多线程访问的时候会有线程安全的问题。不要用同步,会降低性能
解决方案:在控制器不能写字段
什么是SpringMVC?springMvc是控制层一个框架,主要用来负责和客户端的交互和业务逻辑的调用。
为什么有了sevlet还要用SpringMvc? 因为selvlet配置文件太多,每个servlet只能开发一个功能,当功能多了 ,会产生大量servlet,造成臃肿,在开发中有很多不便的地方

MVC的流程及组件:

具体配置看下图:

前端控制器:本质是一个servlet,相当于一个中转站,所有请求都会到这,他在根据配置去找到相应的handler去进行处理,获取视图和模型进行返回
处理器映射器:把对应的路径和handler 作为映射,当有需求时返回
处理适配器:前端控制器根据处理器映射器找到他,要他执行handler,并将model和view返回给前端控制器
视图解析器:本身就是一个映射器,可以将视图名称找到真正的视图地址,前端控制器拿到view去找它,得到真正的view进行返回
视图渲染:将得model封装在得到的view中,向客户端做出响应
@RequestMapping:路径到处理器方法的映射。可以用在类或者方法上
@RequestParam: 对应到真实参数名字
@PathViriable 对restfull风格地址中的参数获取
@RequestBody 实现将请求参数的json转成java对象
@ResponeBody 将对象转换成字符串直接返回给对象
请求重定向 redirect:(地址例www.baidu.com)
请求转发 forward:返回值
Method属性是提交用什么请求

Params属性,只有参数中有这些请求才处理

必须用该名称的请求头

怎么解决乱码:get每次发送请求都要对Url编码,post可以在web.xml配置一个过滤器。标改成utf-8
SpringMV怎么和ajax相互调用的,通过Jackson框架就可以把Java里面的对象直接换成Js可以识别的对象,具体步骤

  1. 加入Jackson.jar
  2. 在配置文件中配置json的 映射
  3. 在接受 ajax方法上面加上ResponseBody注解。那么就可以直接返回对象等,

Springmvc 如何做异常处理 ?
可以将异常抛给Spring框架,由Spring框架来处理;自定义实现spring的全局异常解析器HandlerExceptionResolver,在异常处理器中添视图页面即可。

Springmvc 怎么样把ModelMap里面的数据放入Session里面?
可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。

. Springmvc 和struts2的区别有哪些?
springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
Springmvc 用什么对象从后台向前台传递数据的?
通过ModelMap对象,可以在这个对象里面用put方法,把对象加到里面,前台就可以通过el表达式拿到。

Springmvc 中对于文件的上传有哪些需要注意
在页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart类型的数据进行解析。
在springmvc.xml中配置multipart类型解析器。
方法中使用:MultipartFile attach (单个文件上传) 或者 MultipartFile[] attachs (多个文件上传)

mybatis

什么是mybatis?
(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

Mybaits的优点:
(1)基于SQL语句编程,相当灵活, SQL写在XML里,解除sql与程序代码的耦合,于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
(3)很好的与各种数据库兼容(只要JDBC支持的数据库MyBatis都支持)。
(4)能够与Spring很好的集成;
(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

myBatis框架的缺点:
(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

MyBatis与Hibernate有哪些不同?
Mybatis 可以手写 SQL 来完成与数据库的交互,灵活性比较强,但是代码不易维护,简单的 CRUD 操作也需要编写 SQL 来完成,,对于多表关联查询,需要自定义 SQL 来实现,对于简单的 CRUD 也是不需要编写 SQL 就可以完成的,最主要的特点就是轻量级、灵活性高。

Hibernate 是对象/关系数据库映射,它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想,并且透明持久化,简洁的HQL编程,相对于 Mybatis 较为笨重,Hibernate 在批量数据处理的时候是有弱势,而 Mybatis 就可以轻松搞定。

两者各有所长,如果你的业务逻辑比较复杂,而且多变,灵活性强,建议使用 Mybatis,如果业务逻辑相对较为固定,对 SQL 灵活性要求不高建议使用 Hibernate,这个要根据你的具体业务进行选择。

Mybatis 的配置。

通过 SqlSessionFactoryBuilder 从 mybatis-config.xml 配置文件中构建出 SqlS essionFactory。 SqlSessionFactory开启一个SqlSession,通过SqlSession实例获得Mapper对 象并且运行Mapper映射的Sql语句。 完成数据库的CRUD操作和事务提交,关闭SqlSession。

#{}与${}的区别
如果是数字的话他俩没有区别,
#{}在引用时,如果发现目标是一个字符串,则会将其值作为一个字符串拼接在sql上,即拼接时自动包裹引号
${}在引用时,即使发现目标是一个字符串,也不会作为字符串处理,拼接在sql时不会自动包裹引号

手动映射结果集
MyBatis可以自动将查询结果封装到bean中,前提条件是bean的属性名和查询的结果列名相同, 就会依次对应存储。
如果查询结果的列名和bean的属性名不一致,则需要手动映射结果集

当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

MyBatis的缓存机制
缓存机制可以减轻数据库的压力,原理是在第一查询时,将查询结果缓存起来,之后再查询同样的sql,不是真的去查询数据库,而是直接返回缓存中的结果。缓存可以降低数据库的压力,但同时可能无法得到最新的结果数据。

数据库缓存的实现:通过第三方工具实现缓存:Redis内存数据库 - 可以实现缓存
通过MyBatis提供的缓存机制来实现缓存:
一级缓存:
缓存只在一个事务中有效,即同一个事务中先后执行多次同一个查询,只在第一次真正去查库,并将结果缓存,之后的查询都直接获取缓存中的中数据。如果是不同的事务,则缓存是隔离的。
二级缓存:
缓存在全局有效,一个事务查询一个sql得到结果,会被缓存起来,之后只要缓存未被清除,则其他事务如果查询同一个sql,得到的将会是之前缓存的结果。二级缓存作用范围大,作用时间长,可能造成的危害也更大,所以在开发中一般很少启用Mybatis的二级缓存。
MyBatis的一级缓存
MyBatis的一级缓存默认就是开启状态,且无法手动关闭。
,mybatis 的二级缓存默认是关闭的需要手动开启。

mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

为了简化MyBatis的使用,MyBatis提供了接口方式 自动化 生成调用过程的机制,可以大大简化MyBatis的开发
接口的全路径名应为映射文件中声明的名称空间
接口中应该声明和映射文件中sql对应的id相同名称的方法
方法接收的参数应该和sql中接收的参数一致
方法的返回值应该和sql中声明的返回值类型一致

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值