[SSM] SSM基础

介绍一下SSM 和SpringBoot

spring的核心是IOC和AOP,IOC就是控制反转,IOC为我们提供了一个bean容器,用来帮助我们创建对象,不需要程序员手动的去创建,IOC有一个强大的功能叫DI依赖注入,我们可以通过写Java代码或者XML配置的方式把我们对象所依赖的一些其他的bean注入进去,正是因为有了依赖注入,IOC就有了一个强大的功能,就是解耦。AOP是面向切面编程,在我们平常的开发过程中,不同功能间会遇到很多重复性的代码,比如事务比如日志,我们在每个功能里面都得把这些代码写进去,有了AOP之后,就可以将这些共有的代码抽象出来,然后横切到我们想要的地方,这样能够减少冗余代码的编写提高代码复用。

SpringMVC是基于Spring功能之上添加的Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦。SpringMVC主要包括一个前端控制器DispatcherServlet和三个核心组件处理器映射器,处理器适配器和视图解析器,使我们开发web应用变得很容易

MyBatis内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接等繁杂的过程。程序员直接编写原生态 sql就行。

SpringBoot引入自动配置的概念,让项目配置变得更容易,引入了starter,在约定大于配置的理念下,解决了Spring依赖管理配置复杂的问题。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),我们几乎可以零配置的开箱即用(out-of-the-box),大部分的SpringBoot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。而且SpringBoot内置Tomcat服务器容器,通过@SpringBootApplication中注解类中main函数就可以直接启动程序。

Spring启动大致流程

  1. 启动Spring时:
    a. ⾸先会进⾏扫描,扫描得到所有的BeanDefinition对象,并存在⼀个Map中
    b. 然后筛选出⾮懒加载的单例BeanDefinition进⾏创建Bean,对于多例Bean不需要在启动过程中去进⾏创建,对于多例Bean会在每次获取Bean时利⽤BeanDefinition去创建
    c. 利⽤BeanDefinition创建Bean就是Bean的创建⽣命周期,这期间包括了合并BeanDefinition、推断构造⽅法、实例化、属性填充、初始化前、初始化、初始化后等步骤,其中AOP就是发⽣在初始化后这⼀步骤中
  2. 单例Bean创建完了之后,Spring会发布⼀个容器启动事件
  3. Spring启动结束
  4. 在源码中会更复杂,⽐如源码中会提供⼀些模板⽅法,让⼦类来实现,⽐如源码中还涉及到⼀些BeanFactoryPostProcessor和BeanPostProcessor的注册,Spring的扫描就是通过BenaFactoryPostProcessor来实现的,依赖注⼊就是通过BeanPostProcessor来实现的
  5. 在Spring启动过程中还会去处理@Import等注解

7、Spring 中 BeanFactory 和 ApplicationContext 的区别?

概念:

  • BeanFactory 是 spring 中比较原始,比较古老的 Factory。因为比较古老,所以 BeanFactory无法支持 spring 插件,例如:AOP、Web 应用等功能。

  • ApplicationContext继承了BeanFactory接口,拥有BeanFactory的全部功能,并且扩展了很多高级特性,以一种更面向框架的工作方式以及对上下文进行分层和实现继承:

    • MessageSource, 提供国际化的消息访问
    • 资源访问(如 URL 和文件)
    • 事件传递
    • Bean 的自动装配
    • 各种不同应用层的 Context 实现

区别:

  • 当使用 BeanFactory 实例化对象时,配置的 bean 不会马上被实例化,而是等到你使用该 bean 的时候(getBean)才会被实例化。好处是节约内存,坏处是速度比较慢。多用于移动设备的开发。ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;
  • 没有特殊要求的情况下,应该使用 ApplicationContext 完成。因为 BeanFactory 能完成的事情,ApplicationContext 都能完成,并且提供了更多接近现在开发的功能。

beanfactory和factorybean

上面讲了beanfactory,这里讲下factorybean

FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程。

在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似

mybatis的优缺点

优点

  1. 基于sql语句编程,sql写在XML里,解除了sql与程序代码的藕和,方便管理,并且可以重用而且支持动态sql
  2. 消除了JDBC大量冗余的代码,不需要手动开关连接
  3. 能够与各种数据库兼容,能与spring很好的集成
  4. 提供映射标签,支持对象与数据库的ORM字段关系映射

缺点

  1. SQL语句编写工作量较大,尤其是当字段多,关联表多
  2. sql语句依赖于数据库,导致数据库移植性差,不能随便更换数据库

1、解释一下 MyBatis 中命名空间(namespace)的作用。

在大型项目中,可能存在大量的 SQL 语句,这时候为每个 SQL 语句起一个唯一的标识(ID)就变得并不容易了。为了解决这个问题,在 MyBatis 中,可以为每个映射文件起一个唯一的命名空间,这样定义在这个映射文件中的每个 SQL 语句就成了定义在这个命名空间中的一个 ID。只要我们能够保证每个命名空间中这个 ID 是唯一的,即使在不同映射文件中的语句 ID 相同,也不会再产生冲突了。

2、MyBatis 中的动态 SQL 是什么意思?

对于一些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在,需要根据用户指定的条件动态生成 SQL 语句。如果不使用持久层框架我们可能需要自己拼装 SQL语句,还好 MyBatis 提供了动态 SQL 的功能来解决这个问题。MyBatis 中用于实现动态 SQL 的元素主要有:

  • if
  • choose / when / otherwise
  • trim
  • where
  • set
  • foreach

6、#{}和${}的区别是什么?

#{}是预编译处理,${}是字符串替换。
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set 方法来赋值;
Mybatis 在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止 SQL 注入,提高系统安全性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值