1. 程式人生 > 其它 >Spring高階-ApplicationContext的功能

Spring高階-ApplicationContext的功能

ApplicationContext的實現類擁有不同的能力

  1. EnvironmentCapable:整合 Environment 環境(能通過它獲取各種來源的配置資訊)
  2. MessageSource: 國際化,提供一些針對不同語言翻譯的能力
  3. ResourcePatternResolver:萬用字元方式獲取一組 Resource 資源
  4. 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; import
org.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 例項呼叫方法
    }

}