spring 查找实现类_Spring常问的------真实大厂面试题(第二部分含答案)

da5d180916c27f12aaf8d630377e6009.png

面试题3. Spring中bean的生命周期?

4b016a555a8b5fa1e63cb17f8238a796.png
首先会先进行实例化bean对象然后是进行对bean的一个属性进行设置接着是对BeanNameAware(其实就是为了让Spring容器来获取bean的名称)、BeanFactoryAware(让bean的BeanFactory调用容器的服务)、ApplicationContextAware(让bean当前的applicationContext可以来取调用Spring容器的服务)然后是实现BeanPostProcessor 这个接口中的两个方法,主要是对调用接口的前置初始化postProcessBeforeInitialization这里是主要是对xml中自己定义的初始化方法 init-method = “xxxx”进行调用然后是继续对BeanPostProcessor 这个接口中的后置初始化方法进行一个调用postProcessAfterInitialization()其实到这一步,基本上这个bean的初始化基本已经完成,就处于就绪状态然后就是当Spring容器中如果使用完毕的话,就会调用destory()方法最后会去执行我们自己定义的销毁方法来进行销毁,然后结束生命周期

补充:当在执行第六步之后,如果Spring初始的这个bean的作用域是Prototype的话,之后的过程就不归Spring来去管理了,直接就交给用户就可以了。

面试题4. 说一下SpringMVC中的拦截器和Servlet中的filter有什么区别?

  • 首先最核心的一点他们的拦截侧重点是不同的,SpringMVC中的拦截器是依赖JDK的反射实现的,SpringMVC的拦截器主要是进行拦截请求,通过对Handler进行处理的时候进行拦截,先声明的拦截器中的preHandle方法会先执行,然而它的postHandle方法(他是介于处理完业务之后和返回结果之前)和afterCompletion方法却会后执行。并且Spring的拦截器是按照配置的先后顺序进行拦截的。
  • 而Servlet的filter是基于函数回调实现的过滤器,Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类)

面试题5. spring容器的bean什么时候被实例化?

(1)如果你使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化

(2)如果你使用ApplicationContext作为Spring Bean的工厂类,则又分为以下几种情况:

  • 如果bean的scope是singleton的,并且lazy-init为false(默认是false,所以可以不用设置),则 ApplicationContext启动的时候就实例化该Bean,并且将实例化的Bean放在一个map结构的缓存中,下次再使 用该 Bean的时候,直接从这个缓存中取
  • 如果bean的scope是singleton的,并且lazy-init为true,则该Bean的实例化是在第一次使用该Bean的时候进 行实例化
  • 如果bean的scope是prototype的,则该Bean的实例化是在第一次使用该Bean的时候进行实例化

面试题6. Spring的几种注入方式说一下?

(1)构造方法注入:

6b280fbf4886d89c16fc0ecd3b1d3d2c.png

注意的点:

  • 如果有多个构造参数,那么与构造方法参数列表参数的顺序无关
  • 如果有多个构造方法且参数顺序不同,那么会按第一个构造方法进行注入

(2)set方法注入:

d1028f11799978051707b4a1e4e123e4.png

注意的点:

  • 其实set方法的注入原理就是,spring会将name值的每个单词首字母转换成大写,然后再在前面拼接上"set"构成一个方法名,然后去对应的类中查找该方法,通过反射调用,实现注入
  • 如果通过set方法注入属性,那么spring会通过默认的空参构造方法来实例化对象,所以如果在类中写了一个带有参数的构造方法,一定要把空参数的构造方法写上,否则spring没有办法实例化对象,导致报错。

(3)注解的方式注入:

  • @Resource:java的注解,默认以byName的方式去匹配与属性名相同的bean的id,如果没有找到就会以byType的方式查找,如果byType查找到多个的话,使用@Qualifier注解(spring注解)指定某个具体名称的bean
  • @Autowired:spring注解,默认是以byType的方式去匹配类型相同的bean,如果只匹配到一个,那么就直接注入该bean,无论要注入的 bean 的 name 是什么;如果匹配到多个,就会调用 DefaultListableBeanFactory 的 determineAutowireCandidate 方法来决定具体注入哪个bean。determineAutowireCandidate 方法的内容如下:
7dd38ffdc48f366f972782b3dd80ada3.png

需要java架构资料的私信我即可获得

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值