Java开发工程师最新面试题库系列——Spring部分(附答案)

如果你有更好的想法请在评论区留下您的答案,一起交流讨论 1. Spring框架是什么?
答:Spring是轻量级的面向切面和控制反转的框架。初代版本为2002年发布的interface21,Spring框架是为了解决企业级应用开发的复杂性的出现的,它可以帮助开发人员管理对象之间的关系。能实现模块与模块之间、类与类之间的解耦合,Spring是一个大杂烩,它集成其他许多框架,使其他框架能与spring结合搭配使用  
 
2. Spring常用的注解有哪些?  
 
答:  
 
###### 1、@Controller  
 
在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务bai处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。  
@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。那么要如何做Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。有两种方式:  
(1)在SpringMVC 的配置文件中定义MyController 的bean 对象。  
(2)在SpringMVC 的配置文件中告诉Spring 该到哪里去找标记为@Controller 的Controller 控制器。  
 
###### 2、@RequestMapping  
 
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。  
3、@Resource和@Autowired  
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。  
 
###### 4、@ModelAttribute和 @SessionAttributes  
 
代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。  
@SessionAttributes即将值放到session作用域中,写在class上面。  
具体示例参见下面:使用 @ModelAttribute 和 @SessionAttributes 传递和保存数据  
 
###### 5、@PathVariable  
 
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。  
 
###### 6、@requestParam  
 
@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。  
 
###### 7、@ResponseBody  
 
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。  
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;  
 
###### 8、@Component  
 
相当于通用的注解,当不知道一些类归到哪个层时使用,如果有WEB开发架构中固定的层则使用更加语义化的注解@Repository注解于DAO层、@Service注解于Service层、@Controller 注解于Controller层  
 
3. Spring框架有哪些好处?  
 
答:Spring能有效地组织你的中间层对象,为模块之间降低耦合。还包括轻量级,面向切面,控制反转,都是Spring的好处  
 
4. Spring由哪些主要模块组成?  
 
答:  
 

img

 
 
5. Spring IOC容器是什么?  
 
答:IOC容器意味着将对象交给IOC容器接管,由这样一个容器帮助我们管理对象,而不是传统的由开发人员管理对象。IOC可以帮助我们注入属性给对象,需要的时候给我们。  
 
6. Spring IOC有哪些好处?  
 
答:降低模块与模块之间的耦合,降低类与类之间的耦合。让开发人员不再做重复的对象创建赋值等繁琐的操作,而是需要用到时由IOC容器创建好自己传递过来  
 
7. BeanFactory和ApplicationContext有什么区别?  
 
答:  
 
BeanFactory:  
 
是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能;  
 
ApplicationContext:  
 
应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;  
 
1) 国际化(MessageSource)  
 
2) 访问资源,如URL和文件(ResourceLoader)  
 
3) 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层  
 
4) 消息发送、响应机制(ApplicationEventPublisher)  
 
5) AOP(拦截器)  
 
两者装载bean的区别  
 
BeanFactory:  
 
BeanFactory在启动的时候不会去实例化Bean,中有从容器中拿Bean的时候才会去实例化;  
 
ApplicationContext:  
 
ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;  
 
我们该用BeanFactory还是ApplicationContext  
 
延迟实例化的优点:(BeanFactory  
 
应用启动的时候占用资源很少;对资源要求较高的应用,比较有优势;  
 
不延迟实例化的优点: (ApplicationContext  
 
1. 所有的Bean在启动的时候都加载,系统运行的速度快;  
 
2. 在启动的时候所有的Bean都加载了,我们就能在系统启动的时候,尽早的发现系统中的配置问题  
 
3. 建议web应用,在启动的时候就把所有的Bean都加载了。(把费时的操作放到系统启动中完成)  
 
8. Spring的依赖注入是什么?  
 
答:主动寻找依赖属性,通过set方法或者构造函数等方式注入到对象内部。  
 
9. Spring的依赖注入有几种方式?  
 
答:构造器注入,setter注入,接口注入  
 
> 依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参  
> 数就是要注入的对象。  
> 优点:  
> 接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可。  
> 缺点:  
> 侵入行太强,不建议使用。  
 
10. Spring Bean支持哪几种作用域?  
 
答:singlet单例,prototype多例,request HTTP请求,session会话,session-global全局会话  
 
11. Spring Bean生命周期是怎样的?  
 
答:  
 

img

img

 
 
Spring Bean生命周期  
 
12. Spring Bean为什么默认是单例的?  
 
答:  
 
1、如果是多例会参数较大的性能消耗,体现在创建对象,回收对象的过程。  
 
2、单例的话自始至终都只有一个对象,Spring创建好后就放入了缓存,需要使用时可以快速获取。  
 
13. Spring Bean是线程安全的吗?  
 
答:当Bean的作用域范围是singlet时线程是不安全的,因为所有的线程都会共享这一个实例,必然存在资源竞争,为prototype时线程安全。  
 
 
 
14. Spring怎么注入Java集合类型?  
 
答:使用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsppdy.html