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("监听用户注册事件"); }
}