spring面试题

什么是spring

Spring是一个轻量级Java开发框架,同时它给我们提供了一个bean容器,用来方便装载具体的bean对象,我们以前使用对象的时候需要通过new的方式,并且还要set里面的属性,现在我们只要告诉容器有哪些对象,他会帮我们创建好,并且帮我们维护整个的生命周期。spring之上还有springboot springcloud一系列具体的扩展技术框架。这些框架都是以spring框架为基石,在上面做了一些扩展开发。
它有两个核心特性,也就是IOC(控制反转)和AOP面向切面编程(aspect-oriented programming,AOP)。通常在使用的时候把它当容器使用,spring是springboot的基石,还是一整套生态。
优点
方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理。
AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程。
方便程序的测试
方便集成各种优秀框架

谈谈你对IOC和AOP的理解

ioc表示的是控制反转,也就是说我们原来需要自己去new对象,现在有容器来帮我们创建对象并且来管理和控制整个对象。
DI:依赖注入,把对应的属性的值注入到具体的对象中,@Autowired,populateBean完成属性值的注入。
容器:存储对象,使用map结构来存储,在spring中一般存在三级存,singletonObijects存放完整的bean对象
整个bean的生命周期,从创建到使用再到销毁的过程全部都是由容器来管理 (bean的生命周期)

1、ioc容器的创建过程中最主要的接口是BeanFactory,默认的实现是DefaultListableBeanFactory。然后会向bean工厂中设置一些参数,如BeanFactoryProcessor,Aware接口的子类。
2、加载解析bean对象,准备好要创建的bean对象的定义BeanDefinition,这里面涉及到xml和注解的解析过程
3、beanFactoryPostProcessor的处理,这里是扩展点,例如处理占位符的类PlaceholderConfigurerSupport,ConfigurationClassPostProcessor
4、BeanPostProcessor的注册功能,方便后续对bean对象完成具体的扩展功能。
5、通过反射的方式对BeanDefinition对象实例化成具体的bean对象。
6、bean对象的初始化过程(填充属性,调用aware子类接口,调用BeanPostProcessor前置处理方法,调用init-method方法,调用BeanPostProcessor的后置处理方法)
7、生成完整的bean对象,通过getBean方法可以直接获取
8、销毁过程
面试官,这是我对ioc的整体理解,包含

第二个叫AOP面向切面编程,是一些用于跟业务逻辑无关的代码 ,我们可以AOP的方式实现。举个例子,我们在工作中经常用的日志、权限控制和事务管理等这些相关功能都是通过AOP来实现的。也就是说具体的业务逻辑代码该怎么写还是怎么写,但是我们后面需要进行扩展的时候可以通过aop里面的消息通知往具体方法来前置、后置、中间、环绕等不同环节里面添加具体的跟业务无关的代码

aop底层实现原理

aop是ioc的一个扩展功能,先有的ioc,再有的aop,只是在ioc的整个流程中新增的一个扩展点而已
总: aop概念,应用场景,动态代理
分:
bean的创建过程中有一个步骤可以对bean进行扩展实现,aop本身就是一个扩展功能,所以在BeanPostProcessor的后置处理方法中来进行实现
1、代理对象的创建过程 (advice,切面,切点)
2、通过jdk或者cglib的方式来生成代理对象
3、在执行方法调用的时候,会调用到生成的字节码文件中,直接会找到DynamicAdvisoredinterceptor类中的intercept方法,从此方法开始执行
4、根据之前定义好的通知来生成拦截器链4
5、从拦截器链中依次获取每一个通知开始进行执行,在执行过程中,为了方便找到下一个通知是哪个,会有一个CglibMethodInvocation的对象,找的时候是从-1的位置一次开始查找并且执行的。

ioc底层实现

反射,工厂设计模式 (会的说,不会的不说) ,关键的几个方法
createBeanFactorygetBean,doGetBean,createBean,doCreatebean,createBeanlnstance(getDeclaredConstructor,newinstance),populateBean,initializingBean
1、先通过createBeanFactory创建出一个Bean工厂 (DefaultListableBeanFactory)
2、开始循环创建对象,因为容器中的bean默认都是单例的,所以优先通过getBean,doGetBean从容器中查找,找不到的话
3、通过createBean,doreateBean方法,以反射的方式创建对象,一般情况下使用的是无参的构造方法 (getDeclaredConstructor.newInstance)
4、进行对象的属性填充populateBean
5、进行其他的初始化操作 (initializingBean)

Spring中的Bean创建的生命周期

1、实例化bean: 反射的方式生成对象
2、填充bean的属性: populateBean(),循环依赖的问题 (三级缓存)
3、调用aware接口相关的方法: invokeAwareMethod(完成BeanName,BeanFactory,BeanClassLoader对象的属性设置)

BeanNameAware:可以获取容器中bean的名称
BeanFactoryAware:获取当前beanfactory这也可以调用容器的服务
ApplicationContextAware: 当前的applicationContext,这也可以调用容器的服务
MessageSourceAware: 获得message source,这也可以获得文本

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值