输入密码 · 语雀
1、OCP、DIP原则概述
2、控制反转(一种新型的思想)![](https://img-blog.csdnimg.cn/a3d9bd7a6df84495a54adad7da2231ad.png)
3、Spring框架、DI(依赖注入)![](https://img-blog.csdnimg.cn/54559c688e63418291df1d8e78192b6f.png)
4、OCP、DIP、Ioc、DI术语![](https://img-blog.csdnimg.cn/89fa35b01d1c4ab4881822a5ddced981.png)
5、顶级面试题BeanFactory和FactoryBean的区别
6、Bean的生命周期
最低要求要记住这7步,如果可以要记住10步
6.0 bean生命周期之5步
6.1 bean生命周期之7步
1、实例化bean
2、给bean属性赋值
3、处理bean后处理器的before方法
4、init实例化bean
5、处理bean处理器的after方法
6、使用bean
7、销毁bean
6.2 bean声明周期之10步
6.3 bean声明周期点击概述
7、自己创建的对象怎么交给spring管理
@Test
public void testCustomerBean(){
Student student = new Student();
System.out.println(student);
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
factory.registerSingleton("studentBean",student);
Object studentBean = factory.getBean("studentBean");
System.out.println(studentBean);
}
8、单例、原型、setter注入、construct(构造)注入循环依赖问题
8.1在singleton+setter模式下,为什么循环依赖没有问题,Spring是如何进行管理的?
<!--singleton + setter模式下循环依赖没有任何问题-->
<!--singleton 表示在整个Spring容器当中是单例的,独一无二的对象-->
<!--
在singleton+setter模式下,为什么循环依赖没有问题,Spring是如何进行管理的?
主要的原因是,在这种模式下Spring对Bean的管理主要分为清晰的两个阶段。
第一个阶段:在Spring容器加载的时候,实例化bean,其中只要一个bean实例化完成,马上进行曝光。其中bean需要全部曝光
第二个阶段:Bean曝光之后,再进行属性赋值(调用set方法)
核心解决方案是,实例化对象和对象的属性赋值分为两个阶段来完成的
只有bean是singleton的模式下,bean才会采取提前曝光的方式
-->
<bean id="huahandBean" class="com.powernode.spring6.bean.Huahand" scope="singleton">
<property name="name" value="小马"></property>
<property name="wife" ref="wifeBean"></property>
</bean>
<bean id="wifeBean" class="com.powernode.spring6.bean.Wife">
<property name="name" value="小红"></property>
<property name="huahand" ref="huahandBean"></property>
</bean>
8.2在prototype+setter模式下,循环依赖有问题,Spring是如何进行管理的?
<!-- 1、报异常BeanCurrentlyInCreationException 因为bean的范围是原型(多例),即就是一开始并不会实例bean,只有调用你需要bean的时候才会实例化bean。
2、当huahandBean需要wifeBean,wifeBean会创建出来。wifeBean创建出来,wifeBean又需要huahandBean,huahandBean又会重新创建出来。创建出来的都是全新的
bean.这样就会陷入了无限的死循环。
3、prototype + prototype + setter会陷入循环依赖
singleton + prototype + setter不会陷入循环依赖
-->
<bean id="huahandBean" class="com.powernode.spring6.bean.Huahand" scope="prototype">
<property name="name" value="小马"></property>
<property name="wife" ref="wifeBean"></property>
</bean>
<bean id="wifeBean" class="com.powernode.spring6.bean.Wife" scope="prototype">
<property name="name" value="小红"></property>
<property name="huahand" ref="huahandBean"></property>
</bean>
8.3在singleton+construct模式下,循环依赖有问题,Spring是如何进行管理的?
构造方法注入,就是在创建实例化的过程程中注入属性。两个bean的构造注入,互相依赖对方的创建完成。所以会产生类似死锁的局面
9、Spring循环依赖之源码分析
先从一级缓存里面取bean。如果一级缓存返回bean为空,就去二级缓存取。如果二级缓存返回bean为空,就去三级缓存取,三级缓存获取到的是创建该bean的工厂对象,获取到了的话,就会创建bean的实例对象,放到二级缓存中。
![](https://img-blog.csdnimg.cn/2abb11d9dc95494ebddc6e5395ab1aa4.png)
10、SpringAOP专业术语
11、Spring中事务的应用
首先如果需要开启事务注解@Transactional,但是要使用这个注解,需要在配置文件里面做以下事情
第一步:配置事务管理器
第二步:开启事务注解
<!-- 配置事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启事务注解驱动器,开启事务注解-->
<tx:annotation-driven transaction-manager="txManager"/>