美文网首页
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