8.3-Spring框架的相关知识

项目中用到的框架

单体应用-Springboot、Spring

微服务-SpringCloud

多种客户端的数据采集-SpringCloud Data Flow

 一、Spring框架的知识

1、Spring IoC

之前都是手动new去创建一个对象。

而IoC的思想是将设计并标记的bean对象交给SpringContext容器去管理。

常见源码面试题拓展:

在 Spring 中创建 Bean 分三步:

实例化,createBeanInstance,就是 new 了个对象。
属性注入,populateBean, 就是 set 一些属性值。(一个类中一般会设置一些属性)
初始化,initializeBean,执行一些 aware 接口中的方法,initMethod,AOP代理等。

Spring中bean的生命周期
而对于 Spring Bean 的生命周期来说:主要的流程就是下面4个。
实例化 Instantiation
属性赋值 Populate
初始化 Initialization
销毁 Destruction
实例化 -> 属性赋值 -> 初始化 -> 销毁

至于 BeanPostProcessor、BeanFactoryPostProcessor 以及其他的类,只不过是对主流程四个步骤的一系列扩展点而已。

详细可以简述为以下九步:
1、实例化bean对象(通过构造方法或者工厂方法)
2、设置对象属性(setter等)(依赖注入)
3、如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
4、如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
5、将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
6、调用Bean的初始化方法
7、将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
8、使用Bean
9、容器关闭之前,调用Bean的销毁方法

Spring中如何解决循环依赖问题?

解决思想就是:提前暴露出未完全创建好的bean;



而具体实现就是通过 三级缓存  来实现得
Spring只能够解决单例模式下的setter循环依赖问题,是通过三级缓存来解决。


在对象实例化之后,都会在三级缓存里加入一个工厂,提前对外暴露还未完全创建完毕的Bean。
这样如果发生循环依赖了,对方就可以利用这个工厂得到一个不完整的Bean,先破坏了循环的条件。






对于构造器的循环依赖和非单例模式的循环依赖是无法解决得。

详解SpringApplication.run()方法:

这个方法启动的时候是需要对应的配置类的,而这个@SpringBootApplication对应标记得就是一个配置类。@SpringBootApplication这个注解主要是由三个注解合并而成的。

1.既然是配置类,里面有@SpringBootConfiguration

2.而Springboot的一大优势就是几乎不用做相关配置就可以把整个服务启动起来,就是因为里面加了“允许底层自动配置”,即@EnableAutoConfiguration

3.就是Ioc思想的体现:将对应包下的被四种对应bean注解标注的对象自动装配到SpringContext容器当中去。为什么会装配bean,就是因为这个里面有@ComponentScan。

Application的应用启动时做得好几件事情:

1.底层启动了一个内置的Tomcat服务器。

2.自动地创建了Spring容器。(Web项目中Spring容器不需要主动创建,而是这个SpringbootApplication注解自动去创建得。)

3.Spring容器被创建时,会通过@ComponentScan注解去自动地扫描这个注解里面包括的包下的四种(@Controller、@Service、@Repository@Component(底层的bean注解))对应bean注解的对象,并自动将这些Bean对象装配到容器里面。

理解“依赖注入(DI)是Spring Ioc 的具体实现”:

演示了复杂的主动获取SpringContext容器,并从容器当中拿一个bean对象来使用。

而Spring为我们提供了一个很简便的“隐藏式地从SpringContext容器中拿出一个bean对象来使用的方法”,那就是@AutoWired注解。。。。。。

总结:@Autowired注解的本质就是从SpringContext容器中拿出对应的Bean对象,并用作下面自己使用。。。

具体怎么拿出来。就是直接在对应的bean类的标记名上增加@Autowired注解。。。。

@Autowired

private AlphaService alphaService;

依赖注入具体在项目中的应用就是:

controller层需要调用service层,而service层又需要调用dao层。层与层之间就有了依赖的关系,然后就要在controller层中注入service层的bean对象,并在service层中注入dao层的bean对象。。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值