springboot项目启动类
@SpringBootApplication
public class CaseApplication {
    public static void main(String[] args) {
        /**
         * 可配置的Application容器
         * 查看类图:ctrl + alt + u
         */
        ConfigurableApplicationContext context = SpringApplication.run(CaseApplication.class, args);
    }
}

- 
ApplicationContext间接继承了BeanFactory
 - 
BeanFactory是spring的核心容器,类似ApplicationContext的实现都是借助、组合了BeanFactory的功能
 - 
BeanFactory是ApplicationContext的一个成员变量
 - 
控制反转、依赖注入、bean的生命周期各种功能,都由BeanFactory的实现类提供(DefaultListableBeanFactory)
 
BeanFactory的功能
- 
查看类中所有方法(ctrl + f12)
 - 
BeanFactory的属性
- singletonobjects:所有单例的bean
 
 - 
BeanFactory的方法
- 
containsBean(String):boolean,根据bean的名字判断bean是否存在
 - 
getAliases(String):String[],根据bean的名字获取bean的别名
 - 
getBean(Class<T>):T,根据bean名称或类型获取bean对象
 
 - 
 
DefaultListableBeanFactory

获取所有单例bean
@SpringBootApplication
public class CaseApplication {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        /**
         * 可配置的Application容器
         * 查看类图:ctrl + alt + u
         */
        ConfigurableApplicationContext context = SpringApplication.run(CaseApplication.class, args);
        /**
         * 获取所有单例bean
         */
        // 获取私有成员变量singletonObjects
        Field singletonObjects = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
        // true:屏蔽java语言的访问检查,使对象的私有属性也可以被查询和设置
        singletonObjects.setAccessible(true);
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        // key:bean的名字, value:对象的示例
        Map<String, Object> map = (Map<String, Object>)singletonObjects.get(beanFactory);
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
}
ApplicationContext

国际化
在项目resources目录添加配置文件
messages.properties
空
messages_en.properties
hi=Hello8
messages_ja.properties
hi=こんにちは6
messages_zh.properties
hi=你好5
- 在启动类打印对应语言
 
@SpringBootApplication
public class CaseApplication {
    public static void main(String[] args) {
        /**
         * 可配置的Application容器
         * 查看类图:ctrl + alt + u
         */
        ConfigurableApplicationContext context = SpringApplication.run(CaseApplication.class, args);
        System.out.println(context.getMessage("hi", null, Locale.CHINA));
        System.out.println(context.getMessage("hi", null, Locale.JAPANESE));
        System.out.println(context.getMessage("hi", null, Locale.ENGLISH));
    }
}
获取资源配置文件
@SpringBootApplication
public class CaseApplication {
    public static void main(String[] args) {
        /**
         * 可配置的Application容器
         * 查看类图:ctrl + alt + u
         */
        ConfigurableApplicationContext context = SpringApplication.run(CaseApplication.class, args);
        /**
         * 获取资源(ResourcePatternResolver)
         * classpath:类路径(不可以在jar包中查找)
         * file:磁盘路径
         * classpath*:可以在jar包中查找
         /
        // 查找项目中application.properties配置文件
        context.getResources("classpath:application.properties");
        // 查找项目和引入的包中META-INF目录下spring.factories配置文件
        Resource[] resources = context.getResources("classpath:META-INF/spring.factories");
        for (Resource resource : resources) {
            System.out.println(resource);
        }
    }
}
获取环境信息
@SpringBootApplication
public class CaseApplication {
    public static void main(String[] args) {
        /**
         * 可配置的Application容器
         * 查看类图:ctrl + alt + u
         */
        ConfigurableApplicationContext context = SpringApplication.run(CaseApplication.class, args);
        /**
         * 获取环境信息(EnvironmentCapable)
         */
        // 获取环境变量
        System.out.println(context.getEnvironment().getProperty("java_home"));
        // 获取项目端口
        System.out.println(context.getEnvironment().getProperty("server.port"));
    }
}
发布事件
定义事件类(UserRegistrationEvent)
/**
 * 定义事件
 * 继承ApplicationEvent类
 */
public class UserRegistrationEvent extends ApplicationEvent {
    /**
     * @param source 事件源
     */
    public UserRegistrationEvent(Object source) {
        super(source);
    }
}
触发事件
@SpringBootApplication
public class CaseApplication {
    public static void main(String[] args) {
        /**
         * 可配置的Application容器
         * 查看类图:ctrl + alt + u
         */
        ConfigurableApplicationContext context = SpringApplication.run(CaseApplication.class, args);
        // 触发事件
        context.publishEvent(new UserRegistrationEvent(context.getApplicationStartup()));
    }
}
监听事件类(Component1)
@Component
public class Component1 {
    @EventListener
    public void listener(UserRegistrationEvent userRegistrationEvent) {
        System.out.println("监听用户注册事件");
    }
}
            
51工具盒子