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