文章目录
1.什么是Spring?Spring的特性是什么?
Spring是一个简化企业级应用开发的轻量级的开源框架。
Spring有两大特性,分别是IOC(控制反转)和AOP(面向切面编程)
IOC:控制反转,将对象的创建过程或创建对象的权限交给Spring容器,我们不用再通过new的方式来创建JavaBean对象,这个过程就叫做IOC。(工厂模式/反射机制)
AOP:面向切面编程,对关注点进行模块化,通过对某一功能点进行编程,比如记录日志,有很多个类都需要记日志的方法,则创建记录日志的代理方法,需要调用该功能是只需要调用代理方法,这就是AOP。(动态代理)
2.为什么用工厂创建对象,有什么好处?
我们通常调用各层级对象的时候,需要不断创建对象,一次访问就需要创建两个对象;如果我们使用Spring容器,将不同层级的对象放入容器中,每次使用的时候调用容器中的对象,就不用创建那么多对象,达到节约内存空间的目的。简单来讲,Spring容器就是存储JavaBean对象的容器。
3.IOC 在项目中的作用?
解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度。
4.spring配置bean实例化有哪些方式?
1)使用类构造器实例化(默认无参数)
<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>
2)使用静态工厂方法实例化(简单工厂模式)
<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2"></bean>
3)使用实例工厂方法实例化(工厂方法模式)
<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
5.介绍一下Spring的事物管理
事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。
开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管 理,可以通过Spring的注入(@Transactional)来完成此功能。
Spring支持如下两种方式的事务管理(一般选择声明式事务管理,跟应用程序关联少):
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。
6.Spring DI有哪几种方式?
- 接口注入
- 构造器注入,通过构造方法初始化。
- setter注入,通过setter方法初始化注入、(常用)
7.Spring中用到哪些设计模式?
-
工厂模式(BeanFactory中)
简单工厂模式:又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
抽象工厂模式:是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。(不常用) -
单例模式(Spring中默认bean为单例)(单例模式分为:饱汉模式,饥汉模式)
保证一个类仅有一个实例,并提供一个访问它的全局访问点。 -
适配器模式(HandlerAdater)
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 -
包装器模式(Decorator)
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 -
代理模式 (静态代理,动态代理)(AOP中用到JDK动态代理)
为其他对象提供一种代理以控制对这个对象的访问。 -
观察者模式(listener的实现,例如ApplicationListener)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 -
策略模式(定义一系列的算法,把它们一个个的封装起来,并且使它们可以相互替换。在实例化对象时用到)
封装算法,根据情况自由切换算法。 -
模板模式(jdbcTemplate)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
8.Spring的配置文件中的内容?
- 开启事务注解驱动
- 事务管理器
- 开启注解功能,并配置扫描包
- 配置数据库
- 配置SQL会话工厂,别名,映射文件
- 不用编写Dao层的实现类
9.SpringMvc的工作原理?
-
用户发送请求至前端控制器DispatcherServlet
-
DispatcherServlet收到请求调用HandlerMapping处理器映射器。
-
处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
-
DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
-
执行处理器(Controller,也叫后端控制器)。
-
Controller执行完成返回ModelAndView
-
HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
-
DispatcherServlet将ModelAndView传给ViewReslover视图解析器
-
ViewReslover解析后返回具体View
-
DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
-
DispatcherServlet响应用户
10.Spring下的注解?
注册:@Controller @Service @Component
注入:@Autowired @Resourcebr/>
请求地址:@RequestMapping
返回具体数据类型而非跳转:@ResponseBody
11.简单介绍下你对mybatis的理解?
-
mybatis配置
-
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
-
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
-
通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
-
由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
-
mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
-
Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
-
Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
-
Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
12.Mybatis的好处?
- 把Sql语句从Java中独立出来。
- 封装了底层的JDBC,API的调用,并且能够将结果集自动转换成JavaBean对象,简化了Java数据库编程的重复工作。
- 自己编写Sql语句,更加的灵活。
- 入参无需用对象封装(或者map封装),使用@Param注解
13.${} 和 #{}的区别?
&{}:简单字符串替换,把${}直接替换成变量的值,不做任何转换,这种是取值以后再去编译SQL语句。
#{}:预编译处理,sql中的#{}替换成?,补全预编译语句,有效的防止Sql语句注入,这种取值是编译好SQL语句再取值。(一般用#{}来进行列的代替 )
14.Mybatis和Hibernate的区别?
-
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
-
Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
-
Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
-
总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
15.Mybatis工作原理?
原理:
- 通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory。
- SqlSessionFactory开启一个SqlSession,通过SqlSession实例获得Mapper对象并且运行Mapper映射的Sql语句。
- 完成数据库的CRUD操作和事务提交,关闭SqlSession。