介绍一下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启动大致流程
- 启动Spring时:
a. ⾸先会进⾏扫描,扫描得到所有的BeanDefinition对象,并存在⼀个Map中
b. 然后筛选出⾮懒加载的单例BeanDefinition进⾏创建Bean,对于多例Bean不需要在启动过程中去进⾏创建,对于多例Bean会在每次获取Bean时利⽤BeanDefinition去创建
c. 利⽤BeanDefinition创建Bean就是Bean的创建⽣命周期,这期间包括了合并BeanDefinition、推断构造⽅法、实例化、属性填充、初始化前、初始化、初始化后等步骤,其中AOP就是发⽣在初始化后这⼀步骤中 - 单例Bean创建完了之后,Spring会发布⼀个容器启动事件
- Spring启动结束
- 在源码中会更复杂,⽐如源码中会提供⼀些模板⽅法,让⼦类来实现,⽐如源码中还涉及到⼀些BeanFactoryPostProcessor和BeanPostProcessor的注册,Spring的扫描就是通过BenaFactoryPostProcessor来实现的,依赖注⼊就是通过BeanPostProcessor来实现的
- 在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的优缺点
优点
- 基于sql语句编程,sql写在XML里,解除了sql与程序代码的藕和,方便管理,并且可以重用而且支持动态sql
- 消除了JDBC大量冗余的代码,不需要手动开关连接
- 能够与各种数据库兼容,能与spring很好的集成
- 提供映射标签,支持对象与数据库的ORM字段关系映射
缺点
- SQL语句编写工作量较大,尤其是当字段多,关联表多
- 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 注入,提高系统安全性