美文网首页
Spring IOC容器理论与实践

Spring IOC容器理论与实践

作者: 我知他风雨兼程途径日暮不赏 | 来源:发表于2020-06-16 16:40 被阅读0次

    参考自:《深入浅出Spring Boot 2.x》第三章节

    总结:

    • IOC(Inversion of control)容器是Spring核心,Spring是基于IOC容器编程的框架。
    • IOC是一种通过描述来生成或者获取对象的技术:
      • 通过描述管理Bean,包括发布和获取Bean。
      • 通过描述完成Bean之间的依赖关系。

    1. IOC容器说明

    • Spring IOC容器是一个管理Bean的容器。
    • Spring中,它要求所有的IOC容器必须实现接口BeanFactory(顶层的容器接口)。
    代码清单1 BeanFactory接口源码
    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package org.springframework.beans.factory;
    
    import org.springframework.beans.BeansException;
    import org.springframework.core.ResolvableType;
    import org.springframework.lang.Nullable;
    
    public interface BeanFactory {
        String FACTORY_BEAN_PREFIX = "&";
    
        Object getBean(String var1) throws BeansException;
    
        <T> T getBean(String var1, Class<T> var2) throws BeansException;
    
        Object getBean(String var1, Object... var2) throws BeansException;
    
        <T> T getBean(Class<T> var1) throws BeansException;
    
        <T> T getBean(Class<T> var1, Object... var2) throws BeansException;
    
        <T> ObjectProvider<T> getBeanProvider(Class<T> var1);
    
        <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);
    
        boolean containsBean(String var1);
    
        boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
    
        boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
    
        boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
    
        boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
    
        @Nullable
        Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
    
        @Nullable
        Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;
        
        String[] getAliases(String var1);
    }
    
    

    上述代码大致分为如下这几类接口:

    • 通过不同的描述获取Bean(名称、Class、参数、类型等)
    • 判断Bean类型(是否为单例、是否为原型)
    • 判断Bean的ResolvableType类型匹配

    这里也就映衬了开头所说的IOC是一种通过描述来生成或者获取对象的技术
    由于BeanFactory功能不够强大,Spring又在此基础上设计了更高级的接口ApplicationContext。它是BeanFactory子接口,关系如下图:

    Spring IoC容器接口设计
    ApplicationContext接口通过继承上级接口,进而继承BeanFactory,在BeanFactory之上扩展了:
    • 消息国际化接口MesssageSource
    • 环境可配置接口EnvironmentCapable
    • 应用事件发布接口ApplicationEventPublisher
    • 资源模式解析接口ResourcePatternResolver

    2. Bean装配

    Spring中允许用户通过XML或者JAVA配置装配Bean,下面简单介绍SpringBoot的注解方式(JAVA配置)。

    装配Bean的方式有如下几种(SpringBoot):

    • 配置类中定义@Bean注解(一般作用于第三方的包)
    • @Component和@ComponentScan结合
    注解名 解释
    @ComponentScan 标明采用何种策略扫描装配Bean
    @Component 标明哪个类需要被扫描进入Spring IOC容器中
    代码清单2 加入@Component
    package projectb.springboot.entity;
    
    import lombok.Data;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    /**
     * @Author LynHB
     * @Description : 测试Bean装配
     * @Date 13:03 2020/6/16
     **/
    @Component("user")
    @Getter
    @Setter
    public class User {
        @Value("1")
        private Long id;
        @Value("user_name_1")
        private String userName;
        @Value("note_1")
        private String note;
    }
    

    (这里用到了@Getter和@Setter注解,是lombok提供的,自动生成getter和setter)
    这里的@Component表示该类需要被Spring IOC容器进行装配,其“user”代表Bean名称,你也可以不配置该字符串,IOC会将类名第一个字母作为小写进行装配名称。@Value指定具体的值,使得IOC给予对应属性注入对应的值,为了让IOC装配该类,还需要让Config类能够扫描到这个类。

    @ComponentScan对应的属性 作用
    无属性 扫描对应配置类当前包及其子包
    basePackages 设置需要扫描的包路径数组
    basePackageClasses 设置需要扫描的类数组
    @ComponentScan("xxxx") 默认设置的是basePackages,可结合*代表该路径下的全部
    excludeFilters 设置需要过滤掉的信息,例如excludeFilters = {@Filter(classes = {Service.class})},排除Service.class,可查阅官方文档
    代码清单3 加入注解@ComponentScan
    package projectb.springboot.config;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import projectb.springboot.entity.User;
    
    /**
     * @Author LynHB
     * @Description : spring配置类
     * @Date 13:17 2020/6/16
     **/
    @Configuration
    @ComponentScan(basePackages = {"projectb.springboot.entity"})
    public class AppConfig {
        public static void main(String[] args){
            ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
            User user = (User)applicationContext.getBean("user");
            System.out.println(user.getId()+" "+user.getNote()+" "+user.getUserName());
        }
    
    }
    --------------------------
    13:41:39.974 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2d6e8792
    13:41:40.036 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
    13:41:40.256 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\User.class]
    13:41:40.590 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
    13:41:40.596 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
    13:41:40.600 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
    13:41:40.604 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
    13:41:40.627 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'appConfig'
    13:41:40.641 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'user'
    1 note_1 user_name_1
    
    Process finished with exit code 0
    

    3. 依赖注入

    介绍注解:

    注解名 注解作用
    @Autowired 根据属性类型(By type)找到对应Bean进行注入,如果找到多个Bean则会报错,可以设置required=false,当无法确定Bean时为null。
    @Primary 通过@Autowired找到多个Bean时,设置一个高优先级的Bean注入
    @Quelifier 通过Bean名称找到对应的Bean注入,结合Autowired使用

    还是挺简单的,不做代码说明了。

    4 生命周期

    这节,我们来说说Bean的生命周期。
    Bean的初始化如下:

    • 资源定位:Spring通过配置(@ComponentScan)找到带有@Component的类,即为一个资源定位过程。
    • Bean定义:找到资源后,开始解析,并将定义信息保存至BeanDefinition 实例中。
    • 发布Bean: 将Bean的定义发布到Spring IOC容器中,此时IOC只有Bean的定义,没有Bean的实例。
    • 实例化:默认情况下,Spring会继续去完成Bean的实例化,可以通过lazyInit=true在@ComponentScan中配置,进行延迟初始化(默认不会进行延迟初始化)
    • 依赖注入:默认情况下,Spring也会继续完成DI操作,将@AutoWired中的属性值。
    Spring初始化Bean

    如果仅仅是实例化和依赖注入,那么还不能实现自定义要求,Spring在完成依赖注入后,还提供了一系列的接口和配置来完成Bean的初始化,如图所示:


    Spring Bean的生命周期

    有以下两点需要注意的是:

    • BeanPostProcessor针对的是所有的Bean,其他的都是针对单个Bean的设置。
    • 即使你定义了ApplicationContextAware接口,有时候也不一定被调用,原因在于:实现BeanFactory是最低要求,但是没有强制要求一定要实现ApplicationContext接口,只有实现ApplicationContext接口的容器,才会在生命周期内调用ApplicationContextAware所定义的setApplicationContext方法。
    代码清单4-1 测试生命周期-主配置类
    package projectb.springboot.config;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import projectb.springboot.entity.Animal;
    import projectb.springboot.entity.User;
    
    /**
     * @Author LynHB
     * @Description : spring配置类
     * @Date 13:17 2020/6/16
     **/
    @Configuration
    @ComponentScan(basePackages = {"projectb.springboot"})
    public class AppConfig {
        public static void main(String[] args){
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
            applicationContext.close();
        }
    }
    
    
    代码清单4-2 测试生命周期-主测试类
    package projectb.springboot.entity;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.*;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    @Component
    public class BussinessPerson implements People,
            BeanNameAware,
            BeanFactoryAware,
            ApplicationContextAware,
            InitializingBean,
            DisposableBean {
    
    
        private Animal animal = null;
    
        @Override
        public void service() {
            this.animal.use();
        }
    
        @Override
        @Autowired
        @Qualifier("dog")
        public void setAnimal(Animal animal) {
            this.animal = animal;
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            System.out.println("["+this.getClass().getSimpleName()+"]调用BeanFactoryAware的setBeanFactory");
        }
    
        @Override
        public void setBeanName(String s) {
            System.out.println("["+this.getClass().getSimpleName()+"]调用BeanNameAware的setBeanName");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("["+this.getClass().getSimpleName()+"]调用DisposableBean的destroy");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("["+this.getClass().getSimpleName()+"]调用InitializingBean的afterPropertiesSet");
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            System.out.println("["+this.getClass().getSimpleName()+"]调用ApplicationContextAware的setApplicationContext");
        }
    
        @PostConstruct
        public void init(){
            System.out.println("["+this.getClass().getSimpleName()+"]调用PostConstruct");
        }
        @PreDestroy
        public void destroy1(){
            System.out.println("["+this.getClass().getSimpleName()+"]调用PreDestroy");
        }
    }
    
    代码清单4-3 测试生命周期-主测试类顶层接口类
    package projectb.springboot.entity;
    
    public interface People {
        public void service();
        public void setAnimal(Animal animal);
    }
    
    代码清单4-4 测试生命周期-animal类及相关实现类
    package projectb.springboot.entity;
    
    public interface Animal {
        public void use();
    }
    
    --------------------------------------------
    package projectb.springboot.entity;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Cat implements Animal {
        @Override
        public void use() {
            System.out.println("Cat is catch mouses");
        }
    }
    
    ---------------------------------------------
    package projectb.springboot.entity;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Dog implements Animal {
        @Override
        public void use() {
            System.out.println("Dog is wa wa wa");
        }
    }
    
    代码清单4-5 测试生命周期-BeanPostProcessor类
    package projectb.springboot.processor;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.stereotype.Component;
    
    @Component
    public class BeanPostProcessorExample implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("BeanPostProcessor调用BeanPostProcessorExample"+
                    "参数:"+bean.getClass()+" "+beanName);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("BeanPostProcessor调用postProcessAfterInitialization"+
                    "参数:"+bean.getClass()+" "+beanName);
            return bean;
        }
    }
    
    代码目录结构

    执行结果如下:

    "C:\Program Files\Java\jdk-14.0.1\bin\java.exe" "-javaagent:D:\IntelliJ IDEA 2020.1.2\lib\idea_rt.jar=51117:D:\IntelliJ IDEA 2020.1.2\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Huang\IdeaProjects\springboot\target\classes;C:\Users\Huang\.m2\repository\org\springframework\boot\spring-boot-starter\2.3.1.RELEASE\spring-boot-starter-2.3.1.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\boot\spring-boot\2.3.1.RELEASE\spring-boot-2.3.1.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-context\5.2.7.RELEASE\spring-context-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-aop\5.2.7.RELEASE\spring-aop-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-beans\5.2.7.RELEASE\spring-beans-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-expression\5.2.7.RELEASE\spring-expression-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.3.1.RELEASE\spring-boot-autoconfigure-2.3.1.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.3.1.RELEASE\spring-boot-starter-logging-2.3.1.RELEASE.jar;C:\Users\Huang\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Huang\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Huang\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;C:\Users\Huang\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;C:\Users\Huang\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;C:\Users\Huang\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-core\5.2.7.RELEASE\spring-core-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-jcl\5.2.7.RELEASE\spring-jcl-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\yaml\snakeyaml\1.26\snakeyaml-1.26.jar;C:\Users\Huang\.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\Huang\.m2\repository\org\projectlombok\lombok\1.18.10\lombok-1.18.10.jar projectb.springboot.config.AppConfig
    15:59:24.939 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2d6e8792
    15:59:24.969 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
    15:59:25.118 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\SpringbootApplication.class]
    15:59:25.128 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\BussinessPerson.class]
    15:59:25.129 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\Cat.class]
    15:59:25.131 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\Dog.class]
    15:59:25.132 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\User.class]
    15:59:25.134 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\processor\BeanPostProcessorExample.class]
    15:59:25.213 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\config\AppConfig.class]
    15:59:25.213 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\BussinessPerson.class]
    15:59:25.214 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\Cat.class]
    15:59:25.215 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\Dog.class]
    15:59:25.216 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\User.class]
    15:59:25.217 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\processor\BeanPostProcessorExample.class]
    15:59:26.064 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'propertySourcesPlaceholderConfigurer'
    15:59:26.096 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.ConfigurationPropertiesBeanDefinitionValidator'
    15:59:26.159 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
    15:59:26.163 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
    15:59:26.169 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
    15:59:26.170 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
    15:59:26.176 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor'
    15:59:26.177 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.internalConfigurationPropertiesBinder'
    15:59:26.177 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.internalConfigurationPropertiesBinderFactory'
    15:59:26.181 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'beanPostProcessorExample'
    15:59:26.200 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'appConfig'
    BeanPostProcessor调用BeanPostProcessorExample参数:class projectb.springboot.config.AppConfig$$EnhancerBySpringCGLIB$$15e20f17 appConfig
    BeanPostProcessor调用postProcessAfterInitialization参数:class projectb.springboot.config.AppConfig$$EnhancerBySpringCGLIB$$15e20f17 appConfig
    15:59:26.202 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'springbootApplication'
    BeanPostProcessor调用BeanPostProcessorExample参数:class projectb.springboot.SpringbootApplication$$EnhancerBySpringCGLIB$$dd3e853d springbootApplication
    BeanPostProcessor调用postProcessAfterInitialization参数:class projectb.springboot.SpringbootApplication$$EnhancerBySpringCGLIB$$dd3e853d springbootApplication
    15:59:26.204 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'bussinessPerson'
    15:59:26.273 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'dog'
    BeanPostProcessor调用BeanPostProcessorExample参数:class projectb.springboot.entity.Dog dog
    BeanPostProcessor调用postProcessAfterInitialization参数:class projectb.springboot.entity.Dog dog
    [BussinessPerson]调用BeanNameAware的setBeanName
    [BussinessPerson]调用BeanFactoryAware的setBeanFactory
    [BussinessPerson]调用ApplicationContextAware的setApplicationContext
    BeanPostProcessor调用BeanPostProcessorExample参数:class projectb.springboot.entity.BussinessPerson bussinessPerson
    [BussinessPerson]调用PostConstruct
    [BussinessPerson]调用InitializingBean的afterPropertiesSet
    BeanPostProcessor调用postProcessAfterInitialization参数:class projectb.springboot.entity.BussinessPerson bussinessPerson
    15:59:26.280 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'cat'
    BeanPostProcessor调用BeanPostProcessorExample参数:class projectb.springboot.entity.Cat cat
    BeanPostProcessor调用postProcessAfterInitialization参数:class projectb.springboot.entity.Cat cat
    15:59:26.281 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'user'
    BeanPostProcessor调用BeanPostProcessorExample参数:class projectb.springboot.entity.User user
    BeanPostProcessor调用postProcessAfterInitialization参数:class projectb.springboot.entity.User user
    15:59:26.303 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.AutoConfigurationPackages'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.AutoConfigurationPackages$BasePackages org.springframework.boot.autoconfigure.AutoConfigurationPackages
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.AutoConfigurationPackages$BasePackages org.springframework.boot.autoconfigure.AutoConfigurationPackages
    15:59:26.319 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
    15:59:26.322 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration'
    15:59:26.323 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration' via constructor to bean named 'org.springframework.beans.factory.support.DefaultListableBeanFactory@1a38c59b'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration
    15:59:26.334 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.aop.AopAutoConfiguration'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.aop.AopAutoConfiguration org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.aop.AopAutoConfiguration org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
    15:59:26.336 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration
    15:59:26.339 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'applicationAvailability'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.availability.ApplicationAvailabilityBean applicationAvailability
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.availability.ApplicationAvailabilityBean applicationAvailability
    15:59:26.346 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
    15:59:26.349 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.BoundConfigurationProperties'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.context.properties.BoundConfigurationProperties org.springframework.boot.context.properties.BoundConfigurationProperties
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.context.properties.BoundConfigurationProperties org.springframework.boot.context.properties.BoundConfigurationProperties
    15:59:26.351 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata
    15:59:26.377 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration
    15:59:26.380 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'lifecycleProcessor'
    15:59:26.383 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.context.LifecycleProperties spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.context.LifecycleProperties spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties
    15:59:26.420 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'lifecycleProcessor' via factory method to bean named 'spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.context.support.DefaultLifecycleProcessor lifecycleProcessor
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.context.support.DefaultLifecycleProcessor lifecycleProcessor
    15:59:26.423 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration'
    15:59:26.441 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.info.ProjectInfoProperties spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.info.ProjectInfoProperties spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties
    15:59:26.449 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration' via constructor to bean named 'spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration
    15:59:26.453 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration
    15:59:26.455 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'taskExecutorBuilder'
    15:59:26.456 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.task.TaskExecutionProperties spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.task.TaskExecutionProperties spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties
    15:59:26.464 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'taskExecutorBuilder' via factory method to bean named 'spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.task.TaskExecutorBuilder taskExecutorBuilder
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.task.TaskExecutorBuilder taskExecutorBuilder
    15:59:26.478 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration
    15:59:26.534 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'taskSchedulerBuilder'
    15:59:26.544 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.autoconfigure.task.TaskSchedulingProperties spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.autoconfigure.task.TaskSchedulingProperties spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties
    15:59:26.555 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'taskSchedulerBuilder' via factory method to bean named 'spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties'
    BeanPostProcessor调用BeanPostProcessorExample参数:class org.springframework.boot.task.TaskSchedulerBuilder taskSchedulerBuilder
    BeanPostProcessor调用postProcessAfterInitialization参数:class org.springframework.boot.task.TaskSchedulerBuilder taskSchedulerBuilder
    
    Process finished with exit code 0
    
    

    有时候bean可以定义第三方的类,此时可以使用注解@Bean来定义初始化和销毁方法(等价于@PostConstruct和@PreDestroy):

    @Bean(initMethod = "init",destroyMethod = "destroy")
    

    5. 属性配置

    三个注解:

    注解名 作用
    @Value("${属性全路径}") 配置文件定义一个属性,然后通过@Value("${属性全路径}")
    @ConfigurationProperties("属性") 来定义一个类的属性
    @PropertySource 如果不是在主配置文件中使用@PropertySource注解来定位具体的配置文件,示例:@PropertySource(value="{classpath:jdbc.properties}",ignoreResourceNotFound=true)

    6 Bean条件装配

    会存在客观原因导致Bean无法被初始化,此时希望系统不去装载该Bean。Spring提供了@Conditional注解帮助实现,需要配合实现一个Condition接口(编写boolean的maches())来完成。
    我们来编写一个Machine的Bean,只有当是Linux操作系统时才会装配:

    代码清单-5 条件装配
    package projectb.springboot.entity;
    
    public class Machine {
    }
    ---------------------------
    package projectb.springboot.config;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.*;
    import projectb.springboot.entity.Animal;
    import projectb.springboot.entity.Machine;
    import projectb.springboot.entity.User;
    
    /**
     * @Author LynHB
     * @Description : spring配置类
     * @Date 13:17 2020/6/16
     **/
    @Configuration
    @ComponentScan(basePackages = {"projectb.springboot"})
    public class AppConfig {
    
        @Bean
        @Conditional(MachineConditional.class)
        public Machine getLinuxMachine(){
            return new Machine();
        }
        public static void main(String[] args){
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
            System.out.println(applicationContext.getBean(Machine.class));
    
        }
    
    }
    -------------------------------------------
    package projectb.springboot.config;
    
    import org.springframework.context.annotation.Condition;
    import org.springframework.context.annotation.ConditionContext;
    import org.springframework.core.type.AnnotatedTypeMetadata;
    
    public class MachineConditional implements Condition {
        @Override
        public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
            return System.getProperty("os.name").toLowerCase().contains("linux");
        }
    }
    

    输出:

    "C:\Program Files\Java\jdk-14.0.1\bin\java.exe" "-javaagent:D:\IntelliJ IDEA 2020.1.2\lib\idea_rt.jar=51646:D:\IntelliJ IDEA 2020.1.2\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Huang\IdeaProjects\springboot\target\classes;C:\Users\Huang\.m2\repository\org\springframework\boot\spring-boot-starter\2.3.1.RELEASE\spring-boot-starter-2.3.1.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\boot\spring-boot\2.3.1.RELEASE\spring-boot-2.3.1.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-context\5.2.7.RELEASE\spring-context-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-aop\5.2.7.RELEASE\spring-aop-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-beans\5.2.7.RELEASE\spring-beans-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-expression\5.2.7.RELEASE\spring-expression-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.3.1.RELEASE\spring-boot-autoconfigure-2.3.1.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.3.1.RELEASE\spring-boot-starter-logging-2.3.1.RELEASE.jar;C:\Users\Huang\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Huang\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Huang\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;C:\Users\Huang\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;C:\Users\Huang\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;C:\Users\Huang\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-core\5.2.7.RELEASE\spring-core-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\springframework\spring-jcl\5.2.7.RELEASE\spring-jcl-5.2.7.RELEASE.jar;C:\Users\Huang\.m2\repository\org\yaml\snakeyaml\1.26\snakeyaml-1.26.jar;C:\Users\Huang\.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\Huang\.m2\repository\org\projectlombok\lombok\1.18.10\lombok-1.18.10.jar projectb.springboot.config.AppConfig
    16:35:44.456 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2d6e8792
    16:35:44.486 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
    16:35:44.676 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\SpringbootApplication.class]
    16:35:44.698 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\Cat.class]
    16:35:44.700 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\Dog.class]
    16:35:44.703 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\User.class]
    16:35:44.778 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\config\AppConfig.class]
    16:35:44.779 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\Cat.class]
    16:35:44.781 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\Dog.class]
    16:35:44.782 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [C:\Users\Huang\IdeaProjects\springboot\target\classes\projectb\springboot\entity\User.class]
    16:35:45.601 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'propertySourcesPlaceholderConfigurer'
    16:35:45.613 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.ConfigurationPropertiesBeanDefinitionValidator'
    16:35:45.640 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
    16:35:45.642 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
    16:35:45.645 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
    16:35:45.646 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
    16:35:45.651 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor'
    16:35:45.652 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.internalConfigurationPropertiesBinder'
    16:35:45.652 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.internalConfigurationPropertiesBinderFactory'
    16:35:45.661 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'appConfig'
    16:35:45.674 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'springbootApplication'
    16:35:45.676 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'cat'
    16:35:45.677 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'dog'
    16:35:45.678 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'user'
    16:35:45.716 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.AutoConfigurationPackages'
    16:35:45.730 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration'
    16:35:45.735 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration'
    16:35:45.739 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration' via constructor to bean named 'org.springframework.beans.factory.support.DefaultListableBeanFactory@1a38c59b'
    16:35:45.749 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.aop.AopAutoConfiguration'
    16:35:45.759 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration'
    16:35:45.760 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'applicationAvailability'
    16:35:45.767 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration'
    16:35:45.768 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.BoundConfigurationProperties'
    16:35:45.769 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata'
    16:35:45.771 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration'
    16:35:45.773 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'lifecycleProcessor'
    16:35:45.779 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties'
    16:35:45.914 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'lifecycleProcessor' via factory method to bean named 'spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties'
    16:35:45.918 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration'
    16:35:45.933 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties'
    16:35:45.936 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration' via constructor to bean named 'spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties'
    16:35:45.937 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration'
    16:35:45.938 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'taskExecutorBuilder'
    16:35:45.940 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties'
    16:35:45.947 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'taskExecutorBuilder' via factory method to bean named 'spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties'
    16:35:45.956 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration'
    16:35:45.962 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'taskSchedulerBuilder'
    16:35:45.964 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties'
    16:35:45.970 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'taskSchedulerBuilder' via factory method to bean named 'spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties'
    Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'projectb.springboot.entity.Machine' available
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:352)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:343)
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1127)
        at projectb.springboot.config.AppConfig.main(AppConfig.java:25)
    
    Process finished with exit code 1
    
    

    7 Bean作用域

    bean作用域

    相关文章

      网友评论

          本文标题:Spring IOC容器理论与实践

          本文链接:https://www.haomeiwen.com/subject/iaplxktx.html