springboot理解

经常用springboot,但是所谓知其然,知其所以然。所以就慢慢整理一下自己所了解到的吧。

springboot对于我们而言就好比是脚手架,便于我们迅速的进行开发。那它又是如何运行的呢?听我娓娓道来。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

我们想使用什么功能,基本上通过@Enablexxx就可以将该功能引入到我们的项目中,里面最核心的莫过于@Import注解。我们先来了解一下@Import的用法

  1. 如图所示,可以配置某个类的.class文件
  2. 实现了ImportSelector接口的类【接口实现中返回的是一个数组,其中放多个类的全限定名】

这两种方式都可以将某个类注册成bean对象,交由spring容器来进行管理。它会扫描所有jar包的 META-INF/spring.factories文件,该文件中包含了某个Enablexxx的多个实现,当然,这文件中多个实现并不是都加载,是有过滤机制的。如果本地项目中用到了某个类,则文件中某个类才起作用。

那么问题来了,springboot会默认给我们创建一个我们想要的bean到容器中,那如何让我们手动@Bean创建的生效,而不用默认的呢?springboot如何实现的?
其实这个问题要从@ImportSelector的另一个类说起,它就是DeffredImportSelector,这个类能保证我们容器中bean的加载顺序性以及分组,也就是先加载我们自己的bean,后加载系统默认的,系统默认的类上面有一个好玩的注解 @ConditionalOnBean,什么意思呢?就是说如果容器中有同名的bean存在了,那么就不再加载了,否则就加载。

说到这里大家应该明白了吧,顺便说一下各种bean的加载顺序:1-componet 2-configuration 3-bean 4-import ,也就是说 import的是最后执行的。那为什么@ImportSelector不行呢,就是因为它无法保证有序,你不知道自己的bean和springboot内部bean谁先放入到容器中。

有人可能会问import和componet有什么区别,这里顺便说一下:
import:1,可以不在componentscan扫描的路径内  2,可以一次性倒入多个类
component:1,必须在componentscan扫描的路径内  2,只能一次一个类

而且springboot2.0默认的使用cglib来实现动态代理的,这个可以从AopEnableConfiguration中看到,当然了可以在配置文件中通过要求的key来进行设置!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值