Spring

1. 谈谈对Spring的理解
Spring是一个轻量级,低侵入的开发框架。其核心是IOC和AOP,以及容器,能够使企业级开发更加简洁快速。
Spring是一个框架,一个容器,也是一个生态。像SpringSecurity、SpringJPA、SpringMVC、SpringBoot等等都是基于Spring而产生的框架组件。
2. 谈谈对Spring IOC的理解
IOC:控制反转。以前代码中的对象都是我们自己通过new的方式,自己来管理,在Spring中,我们可以将整个对象交给Spring容器来管理。(是一种思想理论)
DI:依赖注入。以前我们在对象中设置属性,可以通过new、setter、construtor的方式注入,在Spring中,可以通过@Autowared、@Resource、populateBean方法,将对应的属性注入到具体的对象中。
容器:用来存储管理对象的bean工厂。使用map结构存储对象,spring中存储对象有三级缓存,singletonObjects存放完整对象,earlySingletonObjects存放半成品对象,singletonFactory用来存放lambda表达式和对象名称的映射。Spring控制着对象的创建、使用和销毁等整个生命周期。我们常用的就是BeanFactory和ApplicationContext。
3. 谈谈对Spring AOP的理解
AOP:面向切面编程,将通用化功能代码,就是所谓的切面,与业务代码分离开来,实现架构变得高内聚低耦合。
织入方式:编译时织入、类加载时织入(前两种需要特殊的编译器,如AspectJ)、运行时织入:Spring采用的方式,通过动态代理来实现。
使用Spring AOP,首先对象需要交给Spring容器来管理,通过@Aspect、@Pointcut、@Before、@Around、@After、@AfterReturning、@AfterThrowng来实现aop。
AOP的底层实现原理就是动态代理,由AopProxyFactory根据AdvisedSupport对象的配置来决定,默认目标类是接口,用JDKProxy通过反射机制实现,否则使用Cglib通过修改字节码方式实现。
4. SpringBean的生命周期
5. BeanFactory和ApplicationContext的区别
两者都是接口,Spring的容器。
BeanFactory是各个容器的顶级接口,主要面向框架内部本身,实现了BeanFactory的容器特点是在获取对象时才创建对象。
ApplicationContext继承了多个容器接口,具有更加强大的功能。实现了ApplicationContext接口的容器,在容器创建时,就会创建所有对象。由于ApplicationContext继承了多个接口,就意味着它拥有更多的高级特性,比如国际化、监听器、装载配置文件等等。对于我们开发者,使用的更多的是ApplicationContext。
6. Spring中用到了哪些设计模式
单例模式:spring的bean默认都是单例的
工厂模式:BeanFactory
代理模式:AOP
适配器模式:Adapter
装饰者模式:Wrapper
观察者模式:Listener、Event
模板方法:postProcessorBeanFactory、onRefresh
7. 谈谈你对循环依赖的理解
Spring的容器有三级缓存,以map的结构存储对象。一级缓存存放的完整对象,二级缓存存放的半成品对象(只实例化,未初始化),属性注入时在二级缓存里面找半成品对象进行赋值。避免了循环依赖问题。
8. Spring的事务实现原理
Spring的事务控制有两种实现方式:
一种是编程式事务,就是在代码中开发人员控制着开启、提交、回滚事务。这种开发量较大,代码冗余,一般我们采用第二种方式。
第二种是声明式事务,可以通过@Transactional注解来开启Spring的事务管理。实现原理其实就是Spring的AOP。
9. Spring的事务什么情况下会失效
是否在同一个类里面,调用类本身的方法。(没有走代理)
目标类没有交给Spring来管理。(只加了@Transactional注解,而该类不是Spring的bean对象)
异常在方法内部被捕获
没有指定配置好对应的异常类型(@Transactional默认捕获处理的是运行时异常,有个rollbackfor的配置可以指定需要捕获处理的异常类型)
数据库本身不支持事务(很少见)
方法的修饰符不是public
数据源没有配置事务管理器
10. BeanFactory和FactoryBean的区别
BeanFactory是负责生产和管理bean的工厂接口,Spring容器都继承了该接口;
FactoryBean是Bean创建的一种方式,对于复杂的bean对象初始化过程进行逻辑封装,简单灵活的得到我们想要的bean。
11. Spring的事务传播行为
REQUIRED:默认的传播行为,如果当前有事务,加入事务;如果没有事务,则开启一个事务。
SUPPORTS:如果当前有事务,加入事务;如果没有事务,以非事务方式执行。
MANDTORY:如果当前有事务,加入事务;如果没有事务,抛出异常。
REQUIRED_NEW:如果当前有事务,挂起当前事务,新开启一个事务执行;如果没有事务,开启一个事务。
NOT_SUPPORTED:如果当前有事务,挂起当前事务,以非事务方式执行;如果没有事务,以非事务方式执行;
NEVER:不使用事务,如果存在事务,抛出异常;
NESTED:如果当前有事务,在嵌套事务中执行;如果没有事务,开启一个事务。
12. Spring Bean的生命周期
1 实例化bean
通过反射的方式实例化bean,在堆内存开辟空间,属性都为默认值;
2 初始化bean
给对象的属性赋值。涉及到循环依赖问题,通过三级缓存来解决;
3 检查aware相关接口并设置相关依赖
如果容器中需要引用容器内部对象,通过调用aware接口的子类方法进行统一设置;
4 BeanPostProcessor前置处理
对生成的Bean对象进行前置处理工作;
5 检查是否实现了InitializingBean接口,调用afterPropertiesSet方法;
6 检查是否配置的有自定义的init-method方法;
7 BeanPostProcessor后置处理
对生成的Bean对象进行后置处理工作,AOP就工作在这个步骤上;
8 注册必要的Destruction相关回调接口
为了方便销毁,在此处调用注销的回调接口,方便对对象进行销毁操作;
9 获取并使用Bean对象;
10 检查是否实现了DisposableBean接口;
11 检查是否配置的有自定义的destroy方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值