Spring高階-ApplicationContext的功能
阿新 • • 發佈:2022-03-24
ApplicationContext的實現類擁有不同的能力
- EnvironmentCapable:整合 Environment 環境(能通過它獲取各種來源的配置資訊)
- MessageSource: 國際化,提供一些針對不同語言翻譯的能力
- ResourcePatternResolver:萬用字元方式獲取一組 Resource 資源
- ApplicationEventPublisher:事件釋出與監聽,實現元件之間的解耦,類似於訊息中介軟體
1 MessageSource(國際化)
放入資源
檔案內容分別是
messages.properties 空
messages_en.properties hi =Hello
messages_ja.properties hi=こんにちは
messages_zh.properties hi=你好
程式碼
package com.mangoubiubiu.show; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultSingletonBeanRegistry;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.MessageSource; importorg.springframework.core.env.EnvironmentCapable; import org.springframework.core.io.support.ResourcePatternResolver; import java.lang.reflect.Field; import java.util.Locale; import java.util.Map; @Slf4j @SpringBootApplication public class ShowApplication { public static void main(String[] args) throws Exception { //返回的結果是Spring 容器 ConfigurableApplicationContext context = SpringApplication.run(ShowApplication.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)); } }
效果
上面ConfigurableApplicationContext 是 ApplicationContext的實現類 一樣也可以用MessageSource
2 ResourcePatternResolver(萬用字元方式獲取一組 Resource 資源)
package com.mangoubiubiu.show; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultSingletonBeanRegistry; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.MessageSource; import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourcePatternResolver; import java.lang.reflect.Field; import java.util.Locale; import java.util.Map; @Slf4j @SpringBootApplication public class ShowApplication { public static void main(String[] args) throws Exception { //返回的結果是Spring 容器 ConfigurableApplicationContext context = SpringApplication.run(ShowApplication.class, args); //Resource 是 Spring 中對檔案的一個抽象 Resource[] resources_yml = context.getResources("classpath:application.yml"); for (Resource resource: resources_yml) { System.out.println(resource); } //classpath:META-INF/spring.factories 只是在類路徑下找 在jar包裡是找不到的 //classpath*:META-INF/spring.factories 在jar裡找要加* Resource[] resources = context.getResources("classpath*:META-INF/spring.factories"); for (Resource resource: resources) { System.out.println(resource); } } }
3 EnvironmentCapable 整合 Environment 環境(能通過它獲取各種來源的配置資訊)
package com.mangoubiubiu.show; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultSingletonBeanRegistry; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.MessageSource; import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourcePatternResolver; import java.lang.reflect.Field; import java.util.Locale; import java.util.Map; @Slf4j @SpringBootApplication public class ShowApplication { public static void main(String[] args) throws Exception { //返回的結果是Spring 容器 ConfigurableApplicationContext context = SpringApplication.run(ShowApplication.class, args); //不區分大小寫 //系統環境變數 System.out.println(context.getEnvironment().getProperty("java_home")); //配置資訊 System.out.println(context.getEnvironment().getProperty("server.port")); //啟動引數 System.out.println(context.getEnvironment().getProperty("env")); } }
啟動引數
4 ApplicationEventPublisher(事件釋出與監聽,實現元件之間的解耦,類似於訊息中介軟體)
簡單程式碼
package com.mangoubiubiu.show; import org.springframework.context.ApplicationEvent; public class UserRegisteredEvent extends ApplicationEvent { public UserRegisteredEvent(Object source) { super(source); } }
package com.mangoubiubiu.show; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultSingletonBeanRegistry; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.MessageSource; import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourcePatternResolver; import java.lang.reflect.Field; import java.util.Locale; import java.util.Map; @Slf4j @SpringBootApplication public class ShowApplication { public static void main(String[] args) throws Exception { //返回的結果是Spring 容器 ConfigurableApplicationContext context = SpringApplication.run(ShowApplication.class, args); //裡面context 是事件源 context.publishEvent(new UserRegisteredEvent(context)); } }
package com.mangoubiubiu.show; import lombok.extern.slf4j.Slf4j; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Slf4j @Component public class Component1 { @EventListener public void aaa(UserRegisteredEvent event){ log.info("這是Component1 監聽到了事件{}",event); } }
package com.mangoubiubiu.show; import lombok.extern.slf4j.Slf4j; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Slf4j @Component public class Compent2 { @EventListener public void aaa(UserRegisteredEvent event){ log.info("這是Component2 監聽到了事件{}",event); } }
結合業務使用者註冊後發簡訊
事件釋出類
package com.mangoubiubiu.show; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Slf4j @Component public class Component1 { @Autowired private ApplicationEventPublisher context; public void register(){ log.info("使用者註冊"); //註冊後釋出事件 context.publishEvent(new UserRegisteredEvent(this)); } }
監聽類:監聽類可以寫多個 ,且可以寫不同的業務場景
package com.mangoubiubiu.show; import lombok.extern.slf4j.Slf4j; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Slf4j @Component public class Compent2 { @EventListener public void aaa(UserRegisteredEvent event){ log.info("這是Component2 監聽到了事件{}",event); log.info("發簡訊"); } }
呼叫類
package com.mangoubiubiu.show; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultSingletonBeanRegistry; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.MessageSource; import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourcePatternResolver; import java.lang.reflect.Field; import java.util.Locale; import java.util.Map; @Slf4j @SpringBootApplication public class ShowApplication { public static void main(String[] args) throws Exception { //返回的結果是Spring 容器 ConfigurableApplicationContext context = SpringApplication.run(ShowApplication.class, args); context.getBean(Component1.class).register(); //獲取bean 例項呼叫方法 } }