java 基础面试题——Spring 备战春招,秋招

Spring: 


0、说一下spring的优点 
优点:
有了IOC容器,对象间依赖关系交给spring,更专注业务逻辑代码。
有了AOP对应OOP,很多功能更方便简单使用
像一个胶水一样,把一些好的框架粘合在一起方便实用(数据方面使用MyBatis,controller选择
struts2,直接用spring粘在一起使用。)
缺点:
对比新出的springboot,肯定没人家好用(这是知乎的一个解释,觉得有道理)
spring像一个胶水,将框架黏在一起,后面拆分的话就不容易拆分了(这是面试官的一个回答解释,表示是一
个思路。)
springJSP代码过多,过于灵活缺乏一个公用的控制器,不适合分布式

1、什么是IOC,什么是依赖注入 


IOC全称是Inversion of Control,意思是控制反转。控制反转是指对bean的控制,由程序员转移到
了Spring容器中,由Spring容器负责 对象的创建、持有、维护以及销毁,程序员不在进行控制。
 因为Spring存在IOC功能,对象由Spring进行管理,类中的成员变量如果为某个对象,由Spring容器
进行赋值的操作,被称为依赖注入(DI),所以也可以看出是Spring容器对对象进行管理,所以依赖注入也
可以变相的看成控制反转(IOC)

2、什么是AOP 


AOP是面向切面编程,它是对面向对象的一种补充,AOP可以看成是代理模式的一种,我们平时在进行项
目开发的时候,不可避免的要写一些日志记录、事务控制、权限控制等功能,如果我们在每一个子模块都书写
的话,会导致我们的项目代码冗余度高。这时,如果我们能够讲这个代码抽取出来,单独放在一个类中,这个
类就具备上述公共的功能,也就是我们所说的切面,当用户需要访问响应功能的时候,我们可以让切面切向用
户访问的目标对象,这个目标对象就是我们所说的切点,从而形成代理对象,进而让用户直接访问我们的代理
对象,然后通过代理对象再来访问对应的具体目标对象,这样就可以达到优化代码,降低冗余的效果。通过切
面切向切点,从而增强切点功能的技术称为面向切面编程,即AOP。
AOP术语:
 Proxy(代理): 将通知应用到目标对象之后,动态创建的对象,称为代理对象
 Weaving(织入):将切面代码插入到目标对象上,从而创建代理对象的过程
 Advice(通知/增强处理):定义在切面类中的方法,将来会在特定的切入点执行的方法
 Target Object(目标对象):将要被切面切的对象,或者说所有被通知的对象,再或者说就是一个将要
被代理的对象(使用动态AOP技术)
 Aspect(切面):封装了通知/增强方法等用户横向插入系统功能的类
 JoinPoint(连接点):在程序执行过程中的某个阶段点
 Pointcut(切入点):被切面切过的连接点,或者说切面和程序交流的交叉点

3、JDK动态代理和CGLIB动态代理的区别 


JDK动态代理
 底层的实现原理是反射,所以启动快,执行效率低,只能代理实现接口的对象
Proxy.newProxyInstance(object.getClass().getClassLoader(),
object.getClass().getInterfaces(), new InvocationHandler);
 因为带有接口的对象,需要实现接口中的对应方法,所以通过上述函数用的InvocationHandler给代理
类提供对应的方法,即可创建该接口的实现类对象,进而完成代理。
 在运行时 newProxyInstance的内部会通过字节码的形式生成一个代理类,该代理类继承了Proxy类,
通过InvocationHandler函数实现了我们传入的接口,而java中的继承是单继承,所以该代理类无法在继承
别的类,只能实现接口了。
Cglib动态代理
 底层是通过生成字节码文件,从而实现了子类继承父类的方式完成了代理,所以启动较慢,执行快
区别:
   1.JDK只能代理具有接口的对象,而Cglib无此限制
   2.启动速度JDK动态代理较快,Cglib生成字节码文件,启动较慢
   3,执行效率JDK动态代理通过反射生成接口的实现类较慢,Cglib执行字节码文件较快

4、Bean的生命周期


1.bean的实例化,通过构造方法创建bean的实例,默认是无参构造
 在单例模式下,会在spring容器创建时创建bean
 在多例模式下,是在使用时再进行创建

2.给bean的属性进行赋值
 如果是通过set方法赋值会有这一步,如果是构造器赋值则没有这一步
 
3.把bean的实例传递给bean的后置处理器的前置方法
 PostProcessBeforeInitialization()
 
4.如果有@PostConstruct注解修饰的方法,他会在初始化方法前执行(也可以理解为优先级最高的初始化方法)


5.执行初始化的方法
 5.1 实现InitializingBean接口的afterPropertiesSet()方法先执行
 5.2 基于在配置文件中bean标签中配置的init-method属性的方法执行
6.把bean的实例传递给bean的后置处理器的后置处理方法
 postProcessAfterInitialization()
7.得到完整的bean对象,这是的bean对象才能够使用
8.销毁bean
 单例模式时,是当容器关闭的时候,调用销毁的方法
 多例模式时,会随着JVM垃圾回收销毁
 8.1 基于@proDestroy注解的销毁方法执行
 8.2 基于在bean中配置的destroy-method属性的方法再执行

5、spring的循环依赖问题 


创建一个Egg的bean对象,把Egg对象放入三级缓存中,填充Egg对象的属性Hen,去单例池一级缓存、二级缓
存和三级缓存中查找Hen对象,没有找到,需要创建Hen的bean对象,把Hen对象放入三级缓存中,填充Hen对
象的属性Egg(去一级缓存和二级缓存中找Egg对象,没有找到,再去三级缓存中查找Egg对象,找到了,将
Egg对象放入二级缓存中),将Hen对象放入单例池一级缓存中,返回将初始化完成的Hen对象,将Hen对象注
入到Egg对象中,再将Egg对象放入单例池一级缓存中

6、SpringMVC执行流程


( 1)用户发送请求至前端控制器 DispatcherServlet
( 2) DispatcherServlet 收到请求后, 调用 HandlerMapping 处理器映射器, 请求获取 Handle
( 3) 处理器映射器根据请求 url 找到具体的处理器, 生成处理器对象及处理器拦截器(如果有则生成)一
并返回给 DispatcherServlet
( 4) DispatcherServlet 调用 HandlerAdapter 处理器适配器
( 5) HandlerAdapter 经过适配调用 具体处理器(Handler, 也叫后端控制器)
( 6) Handler 执行完成返回 ModelAndView
( 7) HandlerAdapter 将 Handler 执行结果 ModelAndView 返回给DispatcherServlet
( 8) DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器进行解析
( 9) ViewResolver 解析后返回具体 View
( 10) DispatcherServlet 对 View 进行渲染视图( 即将模型数据填充至视图中)
( 11) DispatcherServlet 响应用户

7、springmvc的常用注解及作用 


1、@Controller用于标注Controller层,即控制层,它用于标记在一个类上,使用@Controller标记的
类就变成一个SpringMVC Controller对象。分发处理器将会扫描使用了该注解的类的方法。通俗理解就
是,被Controller标注的类就是一个控制器,这个类中的方法就是相应的动作。
与@Controller相对应,@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于
类上,表示该类中的所有响应请求的方法都会以该地址作为父路径,作用到方法上时,则会在已有父路径的基
础上添加相应路径
2、@Service用于标注业务层
3、@Repository用于标注数据访问组件,即DAO组件
4、@Component用于泛指组件,当组件不好归类的时候,可以使用Component进行标注
5、@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean
属性中的property。当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型
匹配)的Bean,并自动注入到相应的地方去。当Spring找不到bean时会抛出异常,将@Autowired注解的
required属性设置为false 不会抛出异常,会显示null
当有多个bean对应时,Spring因为不能判定应该使用哪个bean同样会抛出异常,此时使用
@Qualifier("class-name")注解,即可指定bean
6、@Resource注解,默认通过name属性去匹配bean,当找不到时再按type去匹配,当指定了name或者
type则根据指定的类型去匹配bean,任何一个不匹配豆浆报错
@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就
一清二楚了
Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之
间的耦合。


8、applicationcontext上下文的理解 


Spring有两个核心的接口:BeanFactory和ApplicationContext,其中ApplicationContext是
BeanFactory的子接口,他们代表的是spring的整个容器,spring容器是生成Bean实例的工厂,并管理容
器中的Bean。
Bean是Spring管理的基本单位,在基于Spring的Java EE应用中,所有的组件都被当成Bean处理。在
Spring中,Bean的是一个非常广义的概念,任何的Java对象、Java组件都被当成Bean处理。而且应用中的
所有组件,都处于Spring的管理下,都被Spring以Bean的方式管理,Spring负责创建Bean实例,并管理他
们的生命周期。Bean在Spring容器中运行,无须感受Spring容器的存在,一样可以接受Spring的依赖注
入,包括Bean属性的注入,协作者的注入、依赖关系的注入等。
Spring容器负责创建Bean实例,所以需要知道每个Bean的实现类,Java程序面向接口编程,无须关心Bean
实例的实现类;但是Spring容器必须能够精确知道每个Bean实例的实现类,因此Spring配置文件必须精确配
置Bean实例的实现类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值