SpringBoot 使用ApplicationContext 及 getbean的兩種方式
第一種:容器載入時設定
public class ProxyApplication {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(ProxyApplication.class, args);
SpringContextUtil.setApplicationContext(applicationContext);
}
}
例項化SpringContextUtil
public class SpringContextUtil {
// Spring應用上下文環境
private static ApplicationContext applicationContext;
/**
* 實現ApplicationContextAware介面的回撥方法,設定上下文環境
*/
public static void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 根據beanId返回Spring中的例項
* @Date 2019-08-07 17:36
* @param
* @return
**/
public static Object getBean(String beanId) throws BeansException {
return applicationContext.getBean(beanId);
}
}
使用場景:實體中初始化資訊,載入類資訊到容器中
@Data
@Configuration
public class AutoLogonConfig {
private boolean autoLogon = false;
private String loginName = "";
private String password = "";
private String ip = "";
public AutoLogonConfig(@Value("${loginFilePath}") String loginFilePath){
Yaml yaml = new Yaml();
InputStream in;
try {
File file = new File(loginFilePath);
in = new FileInputStream(file);
Map map = (Map) yaml.load(in);
Pub.loginFilePath = loginFilePath;
this.autoLogon=(boolean) map.get("autoLogon");
this.loginName=(String) map.get("loginName");
this.password=(String) map.get("password");
this.ip=(String) map.get("ip");
} catch (IOException e) {
e.printStackTrace();
}
}
}
AutoLogonConfig autoLogonConfig = (AutoLogonConfig) SpringContextUtil.getBean("autoLogonConfig");
第二種:繼承ApplicationContextAware
@Component
public class ApplicationContextUtil implements ApplicationContextAware {
/**
* 獲取bean
* @param name
* @return
* @throws BeansException
*/
public static Object getBean(String name) throws BeansException {
Object o = applicationContext.getBean(name);
return o;
}
private static ApplicationContext applicationContext;
/**
* Set the ApplicationContext that this object runs in.
* Normally this call will be used to initialize the object.
* <p>Invoked after population of normal bean properties but before an init callback such
* as {@link InitializingBean#afterPropertiesSet()}
* or a custom init-method. Invoked after {@link ResourceLoaderAware#setResourceLoader},
* {@link ApplicationEventPublisherAware#setApplicationEventPublisher} and
* {@link MessageSourceAware}, if applicable.
*
* @param applicationContext the ApplicationContext object to be used by this object
* @throws ApplicationContextException in case of context initialization errors
* @throws BeansException if thrown by application context methods
* @see BeanInitializationException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
}
使用場景:需要通過反射機制
public Map<String,String> functionOperation(ProxyParamDTO params, OperationEntity operationEntity) throws Exception{
Map<String,String> m = null;
String className;
String functionName;
// [0]:ClassName, [1];functionName
String[] arr = getFunctionName(operationEntity);
className = arr[0];
functionName = arr[1];
operationEntity.setParamDto(params);
try {
// getBean
Object o = ApplicationContextUtil.getBean(className);
// getClass
Class<?> clazz = o.getClass();
// getMethod by class
Method method = clazz.getMethod(functionName, OperationEntity.class);
// execute method and get returned value
m = (HashMap) method.invoke(o, operationEntity);
System.out.println(operationEntity.getOperationOrder() + " : " + method.getName());
} catch (NoSuchMethodException | BeansException e) {
otherFunctions(operationEntity, arr);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
throw e;
}
return m;
}
相關文章
- springboot使用webSocket的兩種方式Spring BootWeb
- 在springboot中使用Mybatis Generator的兩種方式Spring BootMyBatis
- Spring - 獲取ApplicationContext的幾種方式SpringAPPContext
- ChatTTS的兩種使用方式TTS
- SpringBoot實現熱部署兩種方式!Spring Boot熱部署
- Redis詳解 - SpringBoot整合Redis,RedisTemplate和註解兩種方式的使用RedisSpring Boot
- MyBatis 與 SpringBoot 整合:註解和xml兩種使用方式介紹MyBatisSpring BootXML
- ubuntu建立使用者的兩種方式Ubuntu
- SpringBoot應用使用自定義的ApplicationContext實現類Spring BootAPPContext
- Springboot中使用執行緒池的三種方式Spring Boot執行緒
- SpringBoot原理之二_ApplicationContextSpring BootAPPContext
- Springboot啟動了哪些bean?這兩種方式可以獲取Spring BootBean
- 談談Shiro的原理及在SSM和SpringBoot兩種環境下的使用姿勢(下篇)SSMSpring Boot
- JS 垃圾回收的兩種方式JS
- CommonJS的兩種匯出方式JS
- 建立Session物件的兩種方式Session物件
- Docker打包映象的兩種方式Docker
- Laravel 的觀察者使用記錄與兩種方式Laravel
- AUTOCAD——兩種延伸方式
- 多執行緒的建立 兩種方式以及使用建議執行緒
- zabbix agent 的兩種安裝方式
- Native 工程整合Flutter 的兩種方式Flutter
- 安裝aab包的兩種方式
- HTTP代理的兩種連線方式HTTP
- 隱藏元素兩種方式
- springboot啟動的applicationContext的型別選擇Spring BootAPPContext型別
- 基於Maven建立SpringBoot的2種方式MavenSpring Boot
- Golang切片的三種簡單使用方式及區別Golang
- vue3使用ElementPlus upload上傳檔案的兩種方式Vue
- 《SpringBoot篇:002》《SpringBoot的三種啟動方式:main、Maven、jar》Spring BootAIMavenJAR
- php 與 nginx 的兩種處理方式PHPNginx
- React元件方法的兩種定義方式React元件
- java 傳遞引數的兩種方式Java
- java json格式化的兩種方式JavaJSON
- Java鍵盤錄入的兩種方式Java
- Python進行開發的兩種方式Python
- 兩種go傳送郵件的方式Go
- 聊聊 SpringBoot 中的兩種佔位符:@*@ 和 ${*}Spring Boot