spring面试宝典
什么是 Spring 框架?Spring 框架有哪些主要模块?
Spring是一个控制反转和面向切面的容器框架
Spring有七大功能模块:
1、Core:Core模块是Spring的核心类库,Core实现了IOC功能。
2、AOP:Apring AOP模块是Spring的AOP库,提供了AOP(拦截器)机制,并提供常见的拦截器,供用户自定义和配置。
3、orm:提供对常用ORM框架的管理和支持,hibernate、mybatis等。
4、Dao:Spring提供对JDBC的支持,对JDBC进行封装。
5、Web:对Struts2的支持。
6、Context:Context模块提供框架式的Bean的访问方式,其它程序可以通过Context访问Spring的Bean资源,相当于资源注入。
7、MVC:MVC模块为spring提供了一套轻量级的MVC实现,即Spring MVC。
Spring 框架能带来哪些好处
1、轻量级框架、容器:Spring是一个容器,管理对象的生命周期和配置
2、控制反转IOC:Spring通过控制反转实现松耦合。
3、支持AOP:Spring提供对AOP的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高了程序的复用性。
4、方便测试:Spring提供Junit4的支持,可以通过注解方便测试spring程序。
5、对Java中很多API进行了封装
6、方便集成各种优秀框架:如Struts、hibernate、mybstis。
7、支持声明式事务处理:只需通过配置就可以完成对事务的管理,而无须手动编程。
Spring IOC、AOP举例说明
为了解决对象之间的耦合度过高的问题,提出了IOC理论
IOC中最基本的技术就是“反射(Reflection)”根据给出的类名(字符串方式)来动态地生成对象。这种编程方式可以让对象在生成时才决定到底是哪一种对象。反射方式生成对象和通常对象生成方式,速度已经相差不大了,大约为1-2倍的差距。
些工作量不大的项目或者产品,不太适合使用IOC框架产品。另外,如果团队成员的知识能力欠缺,对于IOC框架产品缺乏深入的理解,也不要贸然引入。最后,特别强调运行效率的项目或者产品,也不太适合引入IOC框架产品,象WEB2.0网站就是这种情况。
什么是控制反转(IOC)?什么是依赖注入?
借助Spring实现具有依赖关系的对象之间的解耦。
对象A运行需要对象B,由主动创建变为IOC容器注入,这便是控制反转。
获得依赖对象的过程被反转了,获取依赖对象的过程由自身创建变为由IOC容器注入,这便是依赖注入。
BeanFactory 和 ApplicationContext 有什么区别?
1、BeanFactory是Spring的最底层接口,包含bean的定义,管理bean的加载,实例化,控制bean的生命周期,特点是每次获取对象时才会创建对象。
ApplicationContext是BeanFactory的子接口,拥有BeanFactory的全部功能,并且扩展了很多高级特性,每次容器启动时就会创建所有的对象。
ApplicationContext的额外功能:
继承MessageSource,支持国际化;
统一的资源文件访问方式;
提供在监听器中注册bean;
同时加载过个配置文件;
载入多个(有继承关系)上下文,使得每个上下文都专注于一个特定的层次,比如应用的web层;
2、BeanFactory通常以编程的方式被创建,ApplicationContext可以以声明的方式创建,如使用ContextLoader。
3、BeanFactory 和 ApplicationContext都支持BeanPostProcessor,BeanFactoryPostProcessor,但BeanFactory需要手动注册,ApplicationContext则是自动注册。
什么是 JavaConfig
JavaConfig是Spring3.0新增的概念,就是以注解的形式取代Spring中繁琐的xml文件。
JavaConfig结合了xml的解耦和java编译时检查的优点。
@Configuration,表示这个类是配置类;
@ComponentScan,相当于xml的<context:componentScan basepackage=>;
@Bean,相当于xml的;
@EnableWebMvc,相当于xml的mvc:annotation-driven;
@ImportResource,相当于xml的;
@PropertySource,用于读取properties配置文件;
@Profile,一般用于多环境配置,激活时可用@ActiveProfile("dev")注解;
什么是 ORM 框架
ORM(Object-relational mapping),对象关系映射。
是为了解决面向对象与关系型数据库存在的不匹配问题。
ORM框架的优点:
开发效率更高
数据访问更抽象、轻便
支持面向对象封装
Spring Bean 的生命周期
通过构造器或工厂方法创建bean实例;
为bean的属性赋值;
调用bean的初始化方法;
使用bean;
当容器关闭时,调用bean的销毁方法;
Spring Bean 的作用域之间有什么区别
Spring容器中的bean可以分为5个范围:
singleton:这种bean范围是默认的,这种范围确保不管接受多少请求,每个容器中只哟一个bean的实例,单例模式;
prototype:为每一个bean提供一个实例;
request:在请求bean范围内为每一个来自客户端的网络请求创建一个实例,在请求完毕后,bean会失效并被垃圾回收器回收;
session:为每个session创建一个实例,session过期后,bean会随之消失;
global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet公用全局的存储变量的话,那么全局变量需要存储在global-session中。
如何在 Spring Boot 中禁用 Actuator 端点安全性?
https://blog.51cto.com/u_12302929/4827159
默认情况下,所有敏感的HTTP端点都是安全的,只有具有Actuator角色的用户才能访问它们。
安全性是使用标准的HTTPServletRequest.isUserInRole方法实施的。
我们可以使用management.security.enable = false来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。
只开放某些无敏感信息的端点。
打开安全限制并进行身份验证,访问Actuator接口时需要登录。
Actuator访问接口使用独立端口,并配置不对外网开放。
Spring 框架中的单例 Beans 是线程安全的么?
Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。
但实际上,大部分的Spring bean并没有可变的状态,所以在某种程度上说Spring的单例bean时线程安全的。
如果你的bean有多种状态的话,比如view model,就需要自行保证线程安全啦。
最浅显的解决办法就是将多态bean的作用域由singleton变更为prototype。
如何开启基于注解的自动装配
要使用 @Autowired,需要注册 AutowiredAnnotationBeanPostProcessor
什么是 Spring Batch
spring batch可以支持简单的、复杂的和大数据量的批处理作业。
成批事务:为小批量的或有的存储过程/脚本的场景使用
请举例解释@Required注解
@Required注解应用于bean属性的setter方法,它表明影响的bean属性在配置时必须放在XML配置文件中。
谈谈controller,接口调用的路径问题
@RequestMapping是用来映射请求的,比如get请求、post请求、或者REST风格与非REST风格的。该注解可以用在类上或方法上,如果用在类上,表示是该类中所有方法的父路径。
@RequestMapping("/springmvc")
@Controller
public class SpringMVCTest {
@RequestMapping("/testRequestMapping")
public String testRequestMapping(){
System.out.println("testRequestMapping");
return SUCCESS;
}
}
在类上还添加了一个@Controller注解,该注解在SpringMVC中负责处理由DispatcherServlet分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个model,然后再把该model返回给对应的view进行展示。
RequestMapping可以实现模糊匹配路径,比如:
?表示一个字符;
*表示任意字符;
**匹配多层路径;
SpringMVC如何获取请求的参数
(1)@PathVariable
该注解用来映射请求URL中绑定的占位符。通过@PathVariable可以将URL中占位符的参数绑定到controller处理方法的入参中。
(2)@RequestParam
该注解也是用来获取请求参数的,那么该注解和@PathVariable有什么不同呢?
3、REST风格的请求
如何防止表单重复提交
1、通过JavaScript屏蔽提交按钮(不推荐)
2、给数据库增加唯一键约束(简单粗暴)
3、利用Session防止表单重复提交(推荐)
4、使用AOP自定义切入实现
Spring中都应用了哪些设计模式
1、简单工厂模式
简单工厂模式的本质就是一个工厂类根据传入的参数,动态的决定实例化哪个类。
Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象。
2、工厂方法模式
应用程序将对象的创建及初始化职责交给工厂对象,工厂Bean。
定义工厂方法,然后通过config.xml配置文件,将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称。
3、单例模式
Spring用的是双重判断加锁的单例模式,通过getSingleton方法从singletonObjects中获取bean。
/**
- Return the (raw) singleton object registered under the given name.
- Checks already instantiated singletons and also allows for an early
- reference to a currently created singleton (resolving a circular reference).
- @param beanName the name of the bean to look for
- @param allowEarlyReference whether early references should be created or not
- @return the registered singleton object, or {@code null} if none found
*/
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return (singletonObject != NULL_OBJECT ? singletonObject : null);
}
4、代理模式
Spring的AOP中,使用的Advice(通知)来增强被代理类的功能。Spring实现AOP功能的原理就是代理模式(① JDK动态代理,② CGLIB字节码生成技术代理。)对类进行方法级别的切面增强。
5、装饰器模式
装饰器模式:动态的给一个对象添加一些额外的功能。
Spring的ApplicationContext中配置所有的DataSource。这些DataSource可能是不同的数据库,然后SessionFactory根据用户的每次请求,将DataSource设置成不同的数据源,以达到切换数据源的目的。
在Spring中有两种表现:
一种是类名中含有Wrapper,另一种是类名中含有Decorator。
6、观察者模式
定义对象间的一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
Spring中观察者模式一般用在listener的实现。
7、策略模式
策略模式是行为性模式,调用不同的方法,适应行为的变化 ,强调父类的调用子类的特性 。
getHandler是HandlerMapping接口中的唯一方法,用于根据请求找到匹配的处理器。
8、模板方法模式
Spring JdbcTemplate的query方法总体结构是一个模板方法+回调函数,query方法中调用的execute()是一个模板方法,而预期的回调doInStatement(Statement state)方法也是一个模板方法。
请举例说明如何在 Spring 中注入一个 Java Collection
Spring注入有四种方式,
set注入;
构造器注入;
基于注解的注入;
xml配置文件注入;
想要注入java collection,就是注入集合类:
list
set
map
props:该标签支持注入键和值都是字符串类型的键值对。

浙公网安备 33010602011771号