1.springboot是一个轻配置的框架,以前spring的配置有很多,很多bean的装配都没有写在配置文件里面,spring一开始为什么要把配置写在配置文件里面呢,实际上一开始的初衷是很好的,是为了解耦,以为代码经过编译之后是看不到的,但是配置文件编译后是能看到的,java文件编译后变成class,但是配置文件编译后还是xml,通过xml我就能知道这个工程里面大概配置了那些东西,而且能解耦能调配,把所有的配置文件写在xml有好处,但是到了真正的项目里面会发现xml太重了,里面放置了太多的东西,但是其实真正要频繁去修改的东西没有那么多,可能用户数据库部分修改的比较多,但是例如视图解析器,SpringBoot中tampleaf就直接用了,不需要在自己去配置半天,如果最后又要求被改成jsp,那么就非常抓狂
2。 如果两个Controller里面有写相同的url,启动会报错
如果Controller和WebConfiguration里面的addViewControllers中跳转url一样,那么启动不会报错,会被Controller里面的url所覆盖
Springboot源码解析视频:观后感自己总结
1-7基础铺垫
Initializer初始化意思就是: 一个空房子里面什么都没有,往里面放点东西
1-1spi机制:tomcat实现servlet规范要实现一个ServletContainerInitializer接口,spi里面写着自己实现上面接口的位置,springs实现web.xml里面的所有信息都要加载到ServletContext的上下文环境里面
1-2初始化容器:spring也要遵循Servlet规范 SpringServletContainerrInitializer也实现ServletContainerInitializer接口,然后初始化WebApplicationInitializer上下文环境,往里面加东西(bean,上下文环境)。通过实现WebApplicationInitializer,在其中可以添加servlet,listener等,在加载Web项目的时候会加载这个接口实现类,从而起到web.xml相同的作用。
1-3认识ApplicationContext:是spring继BeanFactory之外的另一个核心接口或容器,允许容器通过应用程序上下文环境创建、获取、管理bean。为应用程序提供配置的中央接口。在应用程序运行时这是只读的,但如果实现支持这一点,则可以重新加载。ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件
1-4BeanFactory和FactoryBean区别:BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。
BeanFactory:
BeanFactory定义了IOC容器的最基本形式,并提供了IOC容器应遵守的的最基本的接口,
也就是Spring IOC所遵守的最底层和最基本的编程规范。
在Spring代码中,BeanFactory只是个接口,
并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,
如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,都是附加了某种功能的实现。
FactoryBean:
一般情况下,Spring通过反射机制利用<bean>的class属性指定实现类实例化Bean,
在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在<bean>中提供大量的配置信息。
配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。
Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,
用户可以通过实现该接口定制实例化Bean的逻辑。
FactoryBean接口对于Spring框架来说占用重要的地位,Spring自身就提供了70多个FactoryBean的实现。
它们隐藏了实例化一些复杂Bean的细节,
给上层应用带来了便利。从Spring3.0开始,FactoryBean开始支持泛型,即接口声明改为FactoryBean<T>的形式
视频里可以用User对象实现FactoryBean<User>接口,将其注入到容器,就可以通过SpringApplication.run方法拿到ApplicationContext,以调用该bean
1-5BeanDefinition:我们一般获取对象的方式有两种,一种是手动直接 new;另一种是交给 Spring 管理,Spring 将管理的对象称之为 Bean,容器会先实例化 Bean,然后自动注入,实例化的过程就需要依赖 BeanDefinition。BeanDefinition 用于保存 Bean 的相关信息,包括属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等,它是实例化 Bean 的原材料,Spring 就是根据 BeanDefinition 中的信息实例化 Bean。
1-6,7bean的创建过程和PostProcessor后置处理器:beanFactoryPostProcessor可以对BeanDefinition在未实例化之前进行拓展,BeanPostProcessor可在初始化前后进行干预
8-进入springboot源码阶段
1-8:SpringAplication构造:从SpringbootApplication启动类main方法中run进入,
最核心的一行代码刷新容器 338:refreshContext(context),而前面的一切都是再做准备(准备环境,上下文,上下文初始化)。最终进入到org\springframework\context\support\AbstractApplicationContext.java类中的refresh()方法里
1-13:Multicaster多路广播器:里面有很多的Listener,通过Listener去监听事件,观察者设计模式的核心
1-14:包装类:利用反射进行包装类赋值更加方便
1-15:自动装配原理:(讲义 自动装配):
(25条消息) Spring Boot面试杀手锏————自动配置原理Morty的技术乐园-CSDN博客springboot自动配置原理
版本1
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,
并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,
它实际上就是一个JavaConfig形式的Spring容器配置类,
它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,
而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的
版本2
在运行main方法的时候会运行主类上重要的@EnableAutoConfigration 注解会导入一个自动配置选择器去扫描每个jar包的META-INF/xxxx.factories 这个文件,
这个文件是一个key-value形式的配置文件,里面存放了这个jar包依赖的具体依赖的自动配置类。
这些自动配置类又通过@EnableConfigurationProperties 注解支持通过xxxxProperties 读取application.properties/application.yml属性文件中我们配置的值。
如果我们没有配置值,就使用默认值,这就是所谓约定>配置的具体落地点。
整合版本1和2
Spring Boot启动的时候会运行主类上重要的@EnableAutoConfigration 注解会导入一个自动配置选择器去扫描每个jar包的META-INF/xxxx.factories 这个文件,
这个文件是一个key-value形式的配置文件,里面存放了这个jar包依赖的具体依赖的自动配置类,
且都是都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类。
这些自动配置类又通过@EnableConfigurationProperties注解支持,
通过以xxxxProperties结尾命名的类中取得在全局配置文件中配置的属,
如application.properties/application.yml属性文件中我们配置的值。
如果我们没有配置值,就使用默认值,这就是所谓约定>配置的具体落地点。