ApplicationContext是Spring中的Bean工厂,可以用来获取Spring容器中的各种bean组件,注册监听事件,加载资源文件等功能

当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean

创建实现ApplicationContextAware接口的静态类

package com.zhuhuix.startup.utils;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
* Spring工具类
* @author zhuhuix
* @date 2020-03-26
*/
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {

private static ApplicationContext applicationContext =null;

/**
* 获取applicationContext
*/
public static ApplicationContext getApplicationContext() {
if (applicationContext == null) {
throw new IllegalStateException("applicaitonContext属性未注入, 请在SpringBoot启动类中注册SpringContextHolder.");
}else {
return applicationContext;
}
}

/**
* 通过name获取 Bean
* @param name 类名称
* @return 实例对象
*/
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}

/**
* 通过class获取Bean
*/
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}

/**
* 通过name,以及Clazz返回指定的Bean
*/
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}


@Override
public void destroy() {
applicationContext = null;
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextHolder.applicationContext=applicationContext;
}
}

启动类中通过@Bean注解注入静态类

package com.zhuhuix.startup;

import com.zhuhuix.startup.utils.SpringContextHolder;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableAsync
@SpringBootApplication
@EnableTransactionManagement
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@Bean
public SpringContextHolder springContextHolder(){
return new SpringContextHolder();
}

}

使用测试

package com.zhuhuix.startup.test1;

import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;

@Component
@Getter
@Setter
public class Person {

private String name;

private String age;

private String sex;

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
package com.zhuhuix.startup.test1;

import com.zhuhuix.startup.utils.SpringContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
@Slf4j
public class PersonTest {

@Test
void test(){
Person person = SpringContextHolder.getBean(Person.class);
person.setName("张三");
person.setAge("20");
person.setSex("male");
log.info(person.toString());
}
}