51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

BeanFactory与ApplicationContext

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&lt;String, Object&gt; map = (Map&lt;String, Object&gt;)singletonObjects.get(beanFactory);
        map.forEach((k, v) -&gt; {
            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("监听用户注册事件");
    }

}
赞(5)
未经允许不得转载:工具盒子 » BeanFactory与ApplicationContext