Java動態(tài)腳本Groovy獲取Bean技巧
在Groovy
中不能使用@Autowired
(autowired是在spring啟動后注入的,此時還未加載groovy代碼,故無法注入)
一、使用BeanFactoryPostProcessor注入Bean:
它與 BeanPostProcessor
接口類似,可以對bean的定義(配置元數(shù)據(jù))進行處理;也就是spring ioc
運行BeanFactoryPostProcessor在容器實例化任何其他的bean之前讀取配置元數(shù)據(jù),并有可能修改它;如果業(yè)務需要,可以配置多個BeanFactoryPostProcessor的實現(xiàn)類,通過"order"控制執(zhí)行次序(要實現(xiàn)Ordered接口)。
第一步:創(chuàng)建實現(xiàn)SpringUtils 接口工具(組件)來獲取spring bean
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.stereotype.Component; @Component public class SpringUtils implements BeanFactoryPostProcessor { /** Spring應用上下文環(huán)境 \*/ private static ConfigurableListableBeanFactory beanFactory; @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { SpringUtils.beanFactory = beanFactory; } @SuppressWarnings("unchecked") public static <T> T getBean(String name) throws BeansException { return (T) beanFactory.getBean(name); } public static <T> T getBean(Class<T> clz) throws BeansException { T result = (T) beanFactory.getBean(clz); return result; } }
第二步:創(chuàng)建Groovy腳本裝載類,動態(tài)解析腳本為Class
package com.example.groovy.testgroovy.task; import groovy.lang.GroovyClassLoader; public class GroovyUtils { private final static ClassLoader classLoader = GroovyUtils.class.getClassLoader();//獲取當前類裝載器 //ClassLoader:就是類的裝載器,它使JVM可以動態(tài)的載入Java類,JVM并不需要知道從什么地方(本地文件、網(wǎng)絡等)載入Java類,這些都由ClassLoader完成。 public final static GroovyClassLoader groovyClassLoader = new GroovyClassLoader(classLoader); //GroovyClassLoader:負責在運行時編譯groovy源代碼為Class的工作,從而使Groovy實現(xiàn)了將groovy源代碼動態(tài)加載為Class的功能。 /** * . * 獲取實例化對象 * @param script groovy腳本內(nèi)容 * @param <T> * @return * @throws IllegalAccessException * @throws InstantiationException */ public static <T> T instanceTaskGroovyScript(String script) throws IllegalAccessException, InstantiationException { Class taskClz = groovyClassLoader.parseClass(script); T instance = (T) taskClz.newInstance(); return instance; } }
第三步:讀取腳本內(nèi)容,執(zhí)行腳本
@Slf4j @Component public class CallAnalysisGroovyTask { /** * . * 讀取腳本內(nèi)容 * * @return */ public String getGroovy() { String context = ""; try { String path = "E:\\IDEAFile\\testgroovy\\src\\main\\resources\\groovy\\LoadBean.groovy"; context = FileUtils.readFileToString(new File(path));//將腳本內(nèi)容轉(zhuǎn)為字符串 } catch (IOException e) { log.error("file is not found[{}]", e); } return context; } /** * . * 執(zhí)行g(shù)roovy腳本 * * @param script */ public void execGroovy(String script) { try { Runnable runnable = GroovyUtils.instanceTaskGroovyScript(script);//獲取實例對象 runnable.run();//調(diào)用腳本方法 } catch (Exception t) { log.error("execGroovy file {} error", script); } } }
第四步:在resources目錄下創(chuàng)建.groovy文件
@Slf4j class LoadBean implements Runnable { /** * . * Groovy獲取Bean */ @Override void run() { log.info("Groovy開始執(zhí)行,當前類{}", this.getClass()) ScriptService service = SpringUtils.getBean(ScriptService.class) log.info("ApplicationContext獲取對象[{}]", service.class) List<Script> item = service.findAll()//執(zhí)行bean中數(shù)據(jù)查詢方法 for (Script s : item) { log.info("創(chuàng)建人:[{}],規(guī)則id:[{}],名稱:[{}]", s.getCreatePerson(), s.getRuleId(), s.getScriptName()) } log.info("Groovy結(jié)束執(zhí)行,當前類{}", this.getClass()) } }
第五步:實例化腳本,執(zhí)行方法?
@GetMapping("/loadBean") public void loadBean(){ String script = CallAnalysisGroovyTask.getGroovy(); //獲取腳本 CallAnalysisGroovyTask.execGroovy(script);//實例化腳本,執(zhí)行方法 log.info("數(shù)據(jù)查詢成功..."); }
腳本運行結(jié)果:
二、使用ApplicationContext注入Bean
它是spring
繼BeanFactory
之外的另一個核心接口或容器,允許容器通過應用程序上下文環(huán)境創(chuàng)建、獲取、管理bean。為應用程序提供配置的中央接口。在應用程序運行時這是只讀的,但如果實現(xiàn)支持這一點,則可以重新加載。
第一步:修改項目啟動類,獲得ApplicationContext
@SpringBootApplication public class TestgroovyApplication { //獲取應用程序上下文環(huán)境 private static ApplicationContext applicationContext; public static void main(String[] args) { applicationContext = SpringApplication.run(TestgroovyApplication.class, args); }
第二步:修改resources目錄下創(chuàng)建的.groovy文件
/** * . * Groovy獲取Bean */ @Override void run() { log.info("Groovy開始執(zhí)行,當前類{}", this.getClass()) ScriptService service = TestgroovyApplication.applicationContext.getBean(ScriptService.class) log.info("ApplicationContext獲取對象[{}]", service.class) List<Script> item = service.findAll()//執(zhí)行bean中數(shù)據(jù)查詢方法 for (Script s : item) { log.info("創(chuàng)建人:[{}],規(guī)則id:[{}],名稱:[{}]", s.getCreatePerson(), s.getRuleId(), s.getScriptName()) } log.info("Groovy結(jié)束執(zhí)行,當前類{}", this.getClass()) }
腳本運行結(jié)果:
到此這篇關(guān)于Java動態(tài)腳本Groovy獲取Bean技巧的文章就介紹到這了,更多相關(guān)Java動態(tài)腳本Groovy獲取Bean內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用Collections工具類對List集合進行排序
這篇文章主要介紹了Java使用Collections工具類對List集合進行排序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10JAVA后臺轉(zhuǎn)換成樹結(jié)構(gòu)數(shù)據(jù)返回給前端的實現(xiàn)方法
這篇文章主要介紹了JAVA后臺轉(zhuǎn)換成樹結(jié)構(gòu)數(shù)據(jù)返回給前端的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03Mybatis?selectKey 如何返回新增用戶的id值
這篇文章主要介紹了Mybatis?selectKey 如何返回新增用戶的id值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01JVM內(nèi)存結(jié)構(gòu):程序計數(shù)器、虛擬機棧、本地方法棧
JVM 基本上是每家招聘公司都會問到的問題,它們會這么無聊問這些不切實際的問題嗎?很顯然不是。由 JVM 引發(fā)的故障問題,無論在我們開發(fā)過程中還是生產(chǎn)環(huán)境下都是非常常見的2021-06-06mybatis如何設置useGeneratedKeys=true
這篇文章主要介紹了mybatis如何設置useGeneratedKeys=true,具有很好的參考價值,希望對大家有所幫助。2022-01-01