1.重定向和转发的区别:
-
重定向:
- 地址栏发生变化
- 重定向可以访问其他站点
- 重定向是两次请求
-
转发:
- 地址栏不变
- 转发只能访问当前服务器下的资源
- 转发是一次请求,可以使用request共享数据
2.Session和Cookie的区别:
- Session存储数据在服务器端,Cookie在客户端
- Session没有数据大小限制,Cookie有限制
- Session数据安全,Cookie相对不安全
6.简单介绍Spring:
- Spring是分层的Java SE/EE应用full-stack轻量级开源框架,是一种容器
- 以loC(Inverse Of Control:反转控制)和AOP(Aspect Oriental Programming:面向切面编程)为内核
- IOC的作用:将对象的创建交给Spring容器,维护了对象之间的依赖关系,降低对象之间的耦合度
- AOP的作用:它可以对业务逻辑的各个部分进行隔离,降低耦合,提高代码的复用性
7.说一下使用Spring的优势:
- 方便解耦,简化开发: Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 管理
- 方便集成各种优秀框架:Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持
- 降低 Java EE API 的使用难度:Spring 对 Java EE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了封装,使这些 API 应用的难度大大降低
- 方便程序的测试:Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序
- AOP 编程的支持:Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
- 声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无须手动编程
8.Spring是如何简化开发的:
- 基于POJO的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式代码。
11.Spring容器启动流程:
- 初始化Spring容器,注册内置的BeanPostProcessor接口(后置处理器)的BeanDefinition接口(描述了一个bean的实例)到容器中
- 将配置类的BeanDefinition注册到容器中
- 调用refresh()方法刷新容器
2.说说你对AOP的理解:
- AOP的概念:AOP是一种编程思想,意为面向切面编程,是对OOP(面向对象)的补充;OOP时从上到下的过程,AOP是从左到右的过程
- 是通过预编译方式和运行期动态代理方式实现的,
- 不修改源代码的情况下给程序动态统一添加功能的技术,是Spring容器两大核心功能之一
- AOP的作用:它可以对业务逻辑的各个部分进行隔离,降低耦合,提高代码的复用性
- 它的底层是通过动态代理实现的,分为:JDK动态代理和CGlib动态代理
- 应用场景:事务,日志管理等
3.说说你对IOC的理解:
- IOC是一种面向对象编程的设计思想,意为控制反转,是Spring容器的两大核心功能之一、
- 控制反转:将对象的创建交给Spring容器,维护了对象之间的依赖关系,降低对象之间的耦合度
- 依赖注入的三种方式:1.构造器,2.setter,3.接口注入
5.说说Spring Bean的生命周期:
- Spring Bean生命周期四大部分:1.Bean定义,2.Bean的初始化,3.Bean的调用,4.Bean的销毁
6.Spring如何实现单例?:
- 在定义Bean的时候,指定它的取值范围scope="singleton",Spring bean 默认是单例模式。
6.实例化Bean的四种方式:
-
无参数构造器:
public class Bean1 { }<bean id="userDao" class="快速入门.factory.Bean1"></bean> -
工厂静态方法:
public class StaticFactory { public static UserDao getUserDao() { return new UserDaoImpl(); } }<bean id="userDao" class="快速入门.factory.StaticFactory" factory-method="getUserDao"></bean> -
工厂实例方法:
public class DynamicFactory { public UserDao getUserDao() { return new UserDaoImpl(); } }<bean id="factory" class="快速入门.factory.DynamicFactory"></bean> <bean id="userDao" factory-bean="factory" factory-method="getUserDao"/> -
FactoryBean:
public class UserDaoFactory implements FactoryBean<UserDao>{ public UserDao getobject() throws Exception { return new UserDao(); } }<bean id="factory" class="快速入门.factory.UserDaoFactory"></bean>
10.说说@Autowired和@Resource注解的区别:
- 注解来源:@Autowired时Spring提供的注解,@Resource是JDK提供的注解
- 注入方式:@Autowired是只能按类型注入,@Resource默认按名称注入,也支持按类型注入
11.@Component和@Bean的区别:
- 作用对象不同:@Componment作用类,@Bean作用方法
- 作用方法不同:@Componment是直接标注到类上声明使用。@Bean是需要和configuration注解配 合使用
- 实现不同:@Componment是直接扫描类路径来自动侦测,@Bean是通常是在标有configuration下 定义产生bean
- 灵活型不同:@Bean比@Componment更加灵活
17.说说BeanFactory和FactoryBean的区别:
- BeanFactory:BeanFactory是所有的SpringBean的容器根接口,也就是IOC容器或对象工厂
- FactoryBean:Factory只是SpringIOC容器创建Bean的一种形式
18.BeanFactory和ApplicationContext有什么区别:
-
相同点:
- Spring提供了两种不同的IOC 容器,一个是BeanFactory,另外一个是ApplicationContext,它们都是Java接口
- 它们都可以用来配置XML属性,也支持属性的自动注入
- BeanFactory 和 ApplicationContext 都提供了一种方式,使用getBean("bean name")获取bean
-
不同点:
- BeanFactory是StringBean的容器根接口,ApplicationContext代表应用上下文
- BeanFactory调用getBean()方法时仅实例化bean;而ApplicationContext 在启动容器的时候实例化单例bean,不会等待调用getBean()方法时再实例化。
- BeanFactory不支持国际化,即i18n,但ApplicationContext提供了对它的支持
- BeanFactory 的一个核心实现是XMLBeanFactory 而ApplicationContext 的一个核心实现是ClassPathXmlApplicationContext(获取配置文件路径)
16.说说Bean的作用域,以及默认的作用域:
- singleton:默认值,单例的
- prototype:多例的
- request:Web项目中,Spring创建一个Bean的对象,将对象存入到request域中
- session:Web项目中,Spring创建一个Bean的对象,将对象存入到session域中
- global session:Web项目中,应用Protlet环境,如果没有Protlet环境那么global Session相当于Session
7.Spring中的Bean是否安全:
- 无状态Bean:就是有实例变量的对象,可以保存数据,线程安全
- 有状态Bean:就是没有实例变量的对象,不能保存数据,线程不安全
6.Spring的依赖注入:
- 接口注入(Spring4后废除),Setter方法注入,构造器注入
- Setter方法注入:容器通过触发一个类的构造器来实现
- 构造器注入:容器通过调用无参构造器或者无参static工厂方法Bean之后,调用该Bean的setter方法来实现
6.说一下构造器注入和set注入的区别:
| 构造函数注入 | setter注入 |
|---|---|
| 没有部分注入 | 有部分注入 |
| 不会覆盖setter属性 | 会覆盖setter属性 |
| 任意修改都会创建一个新实例 | 任意修改不会创建一个新实例 |
| 适用设置很多属性 | 适用于设置少量属性 |
7.Spring如何解决循环依赖:
-
依赖循环:循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环
-
Spring解决循环依赖的理论依据其实是基于Java的引用传递
-
Spring为了解决单例的循环依赖问题,使用了三级缓存:
- singletonObjects:单例对象的cache
- singletonFactories : 单例对象工厂的cache
- earlySingletonObjects :提前曝光的单例对象的Cache
15.说说Spring事务管理:
- 两种事务管理:1.编程式事务,2.声明式事务
- 编程式事务:有用户自己通过代码来控制事务的处理逻辑
- 声明式事务:十分方便,我们只需在方法上加上@Transactional注解
16.spring事务的隔离级别有哪些:
| 事务的隔离级别 | 说明 |
|---|---|
| 读未提交( read uncommitted ) | 不能解决任何问题 |
| 读已提交( read committed ) | 脏读 |
| 可重复读( repeatable read ) | 脏读,不可重复读 |
| 串行化( serializable ) | 脏读,不可重复读,幻读 |
| 事务存在的问题 | 说明 |
|---|---|
| 脏读 | 一个事务,读取到另一个事务中没有提交的数据 |
| 不可重复读(虚读) | 在同一事务中,两次读取到的数据不一样 |
| 幻读 | 一个事务操作(DML)数据表中的所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改 |
- 注意:隔离级别从小到大安全性越来越大,但是效率越来越低
8.spring事务什么时候会失效 | @Transactional 不生效的场景:
- bean对象没有被spring容器管理
- 方法的访问修饰符不是public
- 自身调用问题
- 数据源没有配置事务管理器
- 数据库不支持事务
- 异常被捕获
- 异常类型错误或者配置错误
7.Spring事务的传播机制:
- 多个事务方法相互调用时,事务如何在这些方法之间进行传播,spring中提供了7中不同的传播特性
- required,supports,mandatory,requers_new,not_suported,never,nested,超时时间,是否可读
- required:默认的传播特性,如果当前没有事务,则新建一个事务;如果当前存在事务,则加入这个事务
11.Spring框架中使用了哪些设计模式:
- 单例模式,比如在创建bean的时候
- 代理模式,Spring AOP
- 工厂模式,BeanFactory,FactoryBean
1.说说你对MVC的理解:
-
MVC是一种设计模式,在这种模式下软件被分为三层,即Model( 模型 ),View( 视图 ),Controller( 控制器 )
- Model:代表的是数据,View代表的是用户界面
- Controller代表的是数据的处理逻辑
-
Controller是Model和View这两层的桥接
-
软件分层的好处:降低对象之间的耦合度,便于代码的维护
-
SpringMVC框架是基于Java实现了MVC框架模式的请求驱动类型的轻量级框架
12.Springmvc的九大组件有哪些:
| MVC相关组件 | 说明 |
|---|---|
| DispatcherServlet | 前端控制器(核心组件)负责分发所有的请求 |
| HandlerMapping | 处理器映射器,解析我们SpringMVC定义的请求地址,@RequestMapping |
| HandlerAdapter | 处理器适配器,按照特定规则(HandlerAdapter要求的规则)去执行Controlle |
| View Resovler | 视图解析器 |
| HandlerExceptionResolver | 处理器异常解析器,对异常的处理 |
| RequestToViewNameTranslator | 视图名称翻译器,从request中获取ViewName |
| LocaleResolver | 当前环境处理器,从request中解析出Locale,根据Locale,对不同地址的用户,显示不同的信息 |
| ThemeResolver | 主题解析器,更换主题 |
| MultipartResolver | 文件解析器,处理上传请求 |
| FlashMapManager | 参数传递管理器,用于管理FlashMap,FlashMap用于在redirect重定向中传递参数 |
12.介绍一下SpringMVC的执行流程:
| MVC相关组件 | 说明 |
|---|---|
| DispatcherServlet | 前端控制器(核心组件)负责分发所有的请求 |
| HandlerMapping | 处理器映射器,根据请求的url查找Handler(解析我们SpringMVC定义的请求地址)@RequestMapping |
| HandlerAdapter | 处理器适配器,按照特定规则(HandlerAdapter要求的规则)去执行Controller |
| Handler(controller) | 处理器,把逻辑视图名解析成真正的物理视图 |
| View Resovler | 视图解析器 |
- 流程视图:
-
文字流程:
- 用户发送请求到前端控制器
- 前端控制器请求处理器映射器
- 处理器映射器解析我们定义的地址,返回给前端控制器一个条处理器执行链
- 前端控制器请求处理器适配器,适配器根据指定的规则调用controller
- controller返回ModelAndView给处理器适配器
- 处理器适配器返回ModelAndView给前端控制器
- 前端控制器把ModelAndView传给视图解析器
- 视图解析器解析后返回前端控制器View
- 前端控制器根据View渲染视图,响应给用户