1.Bean的作用域和生命周期2.Spring自动装配的流程Bean的作用域作用域是啥作用域知道是Bean在Spring框架中的某种行为模式比如单例模式作用域表示Bean在spring中只有一份是全局共享的只要有一个人修改其他人也会看到作用域分为六种单例作用域SingletonDog类这个类只是一个普通的类他并没有交给springioc容器进行管理DogBeanConfig类这个类加了一个Component注解所以会被spring扫描到接着他的方法中有一个加了Bean注解虽然Dog类没有加上注解但是这里的方法已经把Dog给实例化了所以后续的getBeanDog.class可以获取到Dog类在容器中多次获取Bean结果总结多次获取Bean并输出对象的地址发现地址是一样的说明每次在springIOC中取出来的对象都是同一个这就是单例模式默认情况下spring中的bean都是单例模式多例作用域Prototype每次使用该bean的时候都会创建一个新的实例需要加一个Scope注解结果这样在多次获取这个scope的时候就会自动生成新的实例Web相关作用域请求作用域request需要加一个RequestScope注解结果一次请求就只有一个对象每次请求都会创建一个新的对象会话作用域session需要加一个SessionScope注解结果在一个会话中只有一个对象只有切换会话才会创建新的对象Application作用域需要加一个Application注解在一个应用中只能访问到同一个对象所有人共用的都是这一个除非这个服务器重启。websocket作用域链接断开就换新的否则一直是一个Bean的生命周期实例化为Bean分配内存空间createBeanInstance属性赋值Bean注入和装配populateBeanBean初始化 initializeBean执行各种通知执行初始化方法使用Bean销毁Bean流程图代码示意图结果举例子买毛胚房自己装修水电门窗然后等全部装好之后清扫一次然后入住到期销毁结束。SpringBoot自动配置什么叫SpringBoot自动配置当Spring容器启动的时候一些配置类Bean对象就会自动传入到IOC容器中去我们就不需要手动去声明Spring是如何把对象加载到SpringIOC容器中去的首先我们知道只有通过五大注解和Bean才可以把数据交给IOC容器进行管理前提是这些注解类必须和启动类SpringBootApplication处于同一个目录之下但是我们引入的第三方的jar包很明显不合这个启动类处于同一个目录为什么能够启动如何解决这个问题?ComponetScan组件扫描当使用这个注解的时候spring在启动的时候就会自动扫描这个注解的组件也可以扫描多个包Import导入直接导入类可以导入一个类也可以导入多个类实现Importselector实现importselector接口把需要使用的类导入即可缺点这几种方式都是需要知道第三方依赖中有哪些Bean对象或配置项但是我们不可能知道所有的Bean所以这个方法还是不适用如何解决解铃还需系铃人这个代码是第三方写的那么第三方肯定是知道需要使用哪些组件哪些Bean是刚需那只需要让第三方把全部事情做好最后再给我提供一个注解只需要让第三方自定义一个注解然后把需要使用到的Bean全部放在一起当我需要使用的时候我只需要使用这个注解那么我就可以使用到全部的这种注解一般使用Enable开头SpringBoot是如何实现自动配置的核心就在于SpringBoot的启动类Target({ElementType.TYPE})限定这个注解只能用在类、接口、枚举上不能用在方法、字段等。Retention(RetentionPolicy.RUNTIME)让注解在运行时依然保留Spring 框架才能在启动时读取并解析它。Documented标记这个注解会被包含在 JavaDoc 文档里。Inherited如果一个类被此注解修饰它的子类会自动继承这个注解Spring Boot 场景下主要是为了兼容一些继承场景。核心SpringBootConfiguration这个是一个加强版的configuration是一个加强版的配置类作为配置文件加速启动类和configuration的功能基本一样只是多了一层spring语义包装ComponenScan这个是用来扫描特定的包自动扫描被五大注解和bean标记的类是他们注册成为spring beanEnableAutoConfiguration灵魂Import{AutoConfigurationImportSelector.class}这一步自动就把实现了importselecttor接口的类全部导入这个selectImport方法就自动获取可以配置的配置类信息继续点进去基取所有基于 META INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imp orts ⽂件, META-INF/spring.factories ⽂件中配置类的集合.在我们导入的依赖中通常都会有这两个文件1.conditional注解当自动加载配置类的时候他不会一股脑全部加载进来而是通过conditional注解按照自己的判断只有满足一定的条件配置里面的才会生效2META-INF/spring.factories⽂件这个是spring内部提供的一个加载方式只需要在这个文件中配置即可spring会把对应的实现类注入到spring容器中去AutoConfigurationPackageRegistrar实现了 ImportBeanDefinitionRegistrar 类,就可以被注解Import导⼊到spring 容器⾥. (String[])(new PackageImports(metadata)).getPackageNames().toArray(new String[0]) :当前启动类所在的包名. 所以: AutoConfigurationPackage 就是将启动类所在的包下⾯所有的组件都扫描注冊到 spring 容器中.总结当程序启动的时候首先就会找到 SpringBootApplication然后 ComponentScan 就会进行包扫描扫描启动类所在的包及其子包SpringBootConfiguration 标记当前类是配置类等价于 Configuration然后 EnableAutoConfiguration 就会执行 AutoConfigurationPackage把启动类所在的根包位置记录下来并告知 Spring供后续配置使用Import(AutoConfigurationImportSelector.class) 就会根据配置文件按条件筛选并导入自动配置类。在Spring与JDK中Bean的区别在Spring中Bean表示的是被spring容器管理的Java对象在JDK中Bean表示的是普通的Java对象。在Spring中什么可以称之为Bean被五大注解或者Bean修饰的类或方法都会被Spring Ioc实例化成Java对象这些对象就叫做Spring Bean五大注解 Component Service业务层 Controller / RestController控制层 Repository数据访问层 Configuration配置类Bean依赖注入DIAutowiredSetter构造方法