面试准备-spring(持续更新)

1、BeanFactory 和 FactoryBean

BeanFactory是IOC最基本的容器,负责生产和管理bean,它为其他具体的IOC容器提供了最基本的规范,XmlBeanFactory,ApplicationContext 等具体的容器都是实现了BeanFactory,再在其基础之上附加了其他的功能。
FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String BeanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&
https://blog.csdn.net/wangbiao007/article/details/53183764

2、spring的bean加载过程,循环依赖解决
https://blog.csdn.net/zzp448561636/article/details/83005910

3、Spring IOC 的理解,其初始化过程

a) IOC:Spring是开源框架,使用框架可以使我们减少工作量,提高工作效率并且它是分层结构,即相对应的层处理对应的业务逻辑,减少代码的耦合度。而spring的核心是IOC控制反转和AOP面向切面编程。IOC控制反转主要强调的是程序之间的关系是由容器控制的,容器控制对象,控制了对外部资源的获取。而反转即为,在传统的编程中都是由我们创建对象获取依赖对象,而在IOC中是容器帮我们创建对象并注入依赖对象,正是容器帮我们查找和注入对象,对象是被获取,所以叫反转。
b) AOP:面向切面编程,主要是管理系统层的业务,比如日志,权限,事物等。AOP是将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为切面(aspect),切面将那些与业务逻辑无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。
https://www.jianshu.com/p/9fe5a3c25ab6
https://blog.csdn.net/it_man/article/details/4402245

4、Spring AOP的理解,各个术语,他们是怎么相互工作的
通知的优先级顺序:在切面中声明的顺序就是优先级(同类型),before是从高优先级开始,after是从低优先级开始
如果在不同的切面中定义多个通知响应同一个切点,进入时则优先级高的切面类中的通知函数优先执行,退出时则最后执行,getOrder方法指定优先级,数字越小,优先级越高
静态代理是编译阶段生成AOP代理类,也就是说生成的字节码就织入了增强后的AOP对象,代表是AspectJ
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。
如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类
http://www.importnew.com/28342.html
https://blog.csdn.net/javazejian/article/details/56267036

5、Spring Bean 的生命周期,如何被管理的
Spring 只帮我们管理单例模式 Bean 的完整生命周期,spring对bean会保存一份引用,对于scope为prototype的Bean,每次被调用都会new一个新的对象,生命周期就交给调用方管理了,不再是Spring容器进行管理了
https://www.jianshu.com/p/3944792a5fff

6、Resource注解,Autowired注解
1、@Autowired,由Spring提供,只按照byType注入
2、@Resource,由J2EE提供,默认按照byName自动注入
@Resource装配顺序:
(1)如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
(2)如果指定了name,则从Spring上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
(3)如果指定了type,则从Spring上下文中找到类型匹配的唯一bean进行装配,找不到或找到多个,都抛出异常
(4)如果既没指定name,也没指定type,则自动按照byName方式进行装配。如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
https://blog.csdn.net/LittleSkey/article/details/52595485

7、spring事务框架
Transaction注解:表示哪里需要开启事务

TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable :使用aop方法生成代理类,在代码前后植入事务相关代码

abstract class AbstractPlatformTransactionManager implements PlatformTransactionManager:平台事务管理器,只要是定义事务流程是怎么样的

不同的数据库平台框架实现不同的策略,例如DataSourceTransactionManager,HibernateTransactionManager,JtaTransactionManager。

TransactionDefinition: 事务定义信息(事务隔离级别、传播行为、超时、只读、回滚规则)
TransactionStatus: 事务运行状态

TransactionSynchronizationManager:事务同步管理器,获取各个不同线程的不同数据,以保证异步线程和同步线程一样的操作体验,主要是通过ThreadLocal操作。

abstract class TransactionSynchronizationAdapter implements TransactionSynchronization:事务同步适配器。

在事务管理器执行不同的事务操作的时候,会通过事务同步管理器,执行所有适配器的回调方法,例如 onCommit,onCompletion方法等。

和事务的Connection一样,事务同步适配器是和线程绑定的,存在ThreadLocal中,一个ThreadLocal中可以存在多个adapter,因为是set存储的,所以最好不要有先后关系。循环执行的时候不保证顺序。

spring是如何处理挂起的事务的,事务信息是和数据库链接connection相对应。在TransactionInterceptor#createTransactionIfNecessary中进行相关切面代码的植入。如果被调用方法是需要新开事务,将原先保存在ThreadLocal中的oldConnection保存在新事务的信息中,TransactionInfo#DefaultTransactionStatus#suspendedResources,然后将newConnection替换ThreadLocal中的oldConnection。等到后面再恢复现场。主要方法就是AbstractPlatformTransactionManager#suspend,AbstractPlatformTransactionManager#resume,操作TransactionSynchronizationManager#resources。同时每个事务相关的adapter也会保存。

方法A{
	XXXX
	方法B代理{
		Connection oldConnection = dosuspend();//用newConnection替换oldConnection,绑定在ThreadLocal中
		//保存老事务的相关信息,包括连接信息
		newTransctionStatus.setSuspendedResources(oldConnection);
		newTransactionInfo.setOldTransaction()//从ThreadLocal中获取
		用新事务invoke方法B
		commitTransactionAfterReturning之后调用doresume(oldConnection)恢复oldConnection
	}
	继续执行
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值