Application接口拓展功能(三)
Application容器接口除了有之前的几个拓展功能之外,还具备事件发布的拓展能力,它起到了解耦的作用,可以把多个事情的处理独立出来。
1.首先需自定义一个事件对象
事件对象需继承ApplicationEvent,这里我们需要重写事件发布对象的构造方法。如果不写会报错会默认继承的构造函数,但是父类并没有无参的构造函数,所以会报错。
package com.example.springdemo.demos.a20;import org.springframework.context.ApplicationEvent;/*** @author zhou* @version 1.0* @description TODO* @date 2025/9/20 20:38*/
public class UserRegisteredEvent extends ApplicationEvent {public UserRegisteredEvent(Object source) {super(source);}
}
2.写一个事件监听器处理事件
package com.example.springdemo.demos.a20;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;/*** @author zhou* @version 1.0* @description TODO* @date 2025/9/20 20:37*/@Component
public class Component2 {private static final Logger log = LoggerFactory.getLogger(Component2.class);@EventListenerpublic void aaa(UserRegisteredEvent event){log.debug("{}",event);}}
3.context对象发布事件
package com.example.springdemo.demos.a20;import com.example.springdemo.demos.a19.TestFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.DefaultSingletonBeanRegistry;
import org.springframework.boot.DefaultBootstrapContext;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.EventPublishingRunListener;
import org.springframework.boot.env.EnvironmentPostProcessorApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.PropertySources;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.Resource;import javax.swing.*;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Locale;
import java.util.Map;/*** @author zhou* @version 1.0* @description TODO* @date 2025/5/31 14:37*/
@SpringBootApplication
public class TestApplicationContext {public static void main(String[] args) throws IOException {ConfigurableApplicationContext context = SpringApplication.run(TestApplicationContext.class, args);System.out.println(context.getMessage("hi", null, Locale.CHINA));System.out.println(context.getMessage("hi", null, Locale.ENGLISH));System.out.println(context.getMessage("hi", null, Locale.JAPANESE));//资源通配符解析org.springframework.core.io.Resource[] resources = context.getResources("classpath*:META-INF/spring.factories");for (Resource resource:resources){System.out.println(resource);}//环境信息配置(来源有多个,系统环境变量,properties文件)System.out.println(context.getEnvironment().getProperty("JAVA_HOME"));System.out.println(context.getEnvironment().getProperty("server.port"));//发布事件的方法context.publishEvent(new UserRegisteredEvent(context));}
}
4.运行结果