面试 之 spring 、sprinBoot

本文深入探讨了Spring Bean的生命周期,包括实例化、属性赋值和初始化等阶段。还介绍了Spring的核心接口BeanPostProcessor和Order接口,以及动态代理的实现。进一步讨论了SpringBoot的自动装配原理,解释了Spring Boot如何根据配置文件加载和初始化Bean。文章最后涉及了设计模式,如观察者模式、适配器模式和装饰模式。
摘要由CSDN通过智能技术生成

Spring Bean的生命周期?

 

实例化 -> 属性赋值 -> 初始化 -> 销毁

  1. createBeanInstance() -> 实例化
  2. populateBean() -> 属性赋值,对应构造方法和setter方法的注入
  3. initializeBean() -> 初始化,用户能自定义扩展
  4. 容器关闭时,销毁。

Spring的核心接口(常用)

Spring之BeanPostProcessor(后置处理器)介绍 - 云+社区 - 腾讯云 (tencent.com)

BeanPostProcessor接口 

作用:是在Bean对象在实例化和依赖注入完毕后,再主动调用初始化方法的前后添加我们自己的逻辑。

方法

说明

postProcessBeforeInitialization

实例化、依赖注入完毕,在调用显示的初始化之前完成一些定制的初始化任务

postProcessAfterInitialization

实例化、依赖注入、初始化完毕时执行

用法学习:Spring之BeanPostProcessor(后置处理器)介绍 - 云+社区 - 腾讯云 (tencent.com)

Order接口

作用:为实现Order接口的类,指定加载顺序

用法:实现Ordered接口getOrder方法,该方法返回一整数,默认值为 0,优先级最高,值越大优先级越低

Spring知识点提炼_朱小厮的博客-CSDN博客_spring知识点

动态代理的实现?

参考:自己的博客CSDN

实现方式1:JDK的实现。

SpringBoot的自动装配原理?

 

Spring Boot 在启动的时候会干这几件事情:

① Spring Boot 在启动时会去依赖的 Starter 包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。

② 根据 spring.factories 配置加载 AutoConfigure 类

③ 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context

其实就是 Spring Boot 在启动的时候,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 Spring Boot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可。

文章参考:(转载)非常详细的SpringBoot-自动装配原理 - loveCode'shy - 博客园

 @EnableAutoConfiguration下的@import中的Resisterar.class获取扫描的包路径,说白了就是将主配置类(即@SpringBootApplication标注的类)的所在包及子包里面所有组件扫描加载到Spring容器。所以包名一定要注意。

现在包扫描路径获取到了,那具体加载哪些组件呢?

AutoConfigurationImportSelector类,里面有一个selectImports方法,将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中。

那么selectImports是怎么知道要导入哪些组件呢?

因为我们构建时,在maven中已经指定了 springBoot场景启动器,如下图,我们指定spring-boot-starter-web时项目依赖中就自动依赖了关于web的jar包。jar包中的META-INF/spring.factories,基本上全是JavaEE依赖的各种组件(工厂)

扩展:如何自定义我们自己的场景启动器呢?

SpringBoot应用篇(一):自定义starter - 超级小小黑 - 博客园

首先,为什么要自定义starter呢?因为复用某个模块的代码时经常拷贝,索性把他变成jar包,在pom中配置依赖(jar包放到私人仓库)即可,实现让springBoot替我们自动装配。

大概步骤:①创建项目工程。②定义配置类③在METE-INF下创建spring.factories,并写上:key为spring的开启自动配置类的类路径,value为我们自定义的配置类的类路径。

设计模式

概念:桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。

优点:将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。

缺点:不好理解。

观察者模式

概念:当一个对象被修改时,该对象则会自动通知依赖它的对象。

很多时候需要获取某个对象的状态是否发送改变,第一件事就是写个for循环,不停的去询问这个对象,有木有改变,如果该对象说改变了,这时候break循环,触发其他操作。这明显耗费cpu资源。这是做法是一直询问,而观察者模式是 主动告知,这样我们就不用一直循环了。

实现:把观察者都丢入 被观察者中,当被观察者被改变时,自动去通知观察者。

优点:一套触发机制

缺点:如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

适配器模式

概念:作为两个不兼容的接口之间的桥梁。

实现:把多个不同的功能集成在同一个类中(这个类就叫适配器),别人再访问时,来访问适配器,适配器根据传入的参数判断,具体去调哪个接口。

应用:

优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好

缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。

装饰模式

概念:允许向一个现有的对象添加新的功能,同时又不改变其结构

Spring Boot 推荐使用 构造方法注入 代替原有的 注解注入

如下:原先是:


@Api(tags = "负责人")
@RequestMapping("/user")
@RestController
public class ProductUserController extends BaseController {


    @Autowired
    private  IProductUserService productUserService;


    //todo 功能实现

 现在是:


@Api(tags = "负责人")
@RequestMapping("/user")
@RestController
public class ProductUserController extends BaseController {

    private final  IProductUserService productUserService;

    @Autowired
    public ProductUserController(IProductUserService productUserService) {
        this.productUserService = productUserService;
    }

    //todo 功能实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值