91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java動態腳本Groovy獲取Bean技巧是什么

發布時間:2021-12-14 14:05:04 來源:億速云 閱讀:141 作者:iii 欄目:開發技術

本篇內容介紹了“Java動態腳本Groovy獲取Bean技巧是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

Groovy中不能使用@Autowired(autowired是在spring啟動后注入的,此時還未加載groovy代碼,故無法注入)

一、使用BeanFactoryPostProcessor注入Bean:

它與 BeanPostProcessor接口類似,可以對bean的定義(配置元數據)進行處理;也就是spring ioc運行BeanFactoryPostProcessor在容器實例化任何其他的bean之前讀取配置元數據,并有可能修改它;如果業務需要,可以配置多個BeanFactoryPostProcessor的實現類,通過"order"控制執行次序(要實現Ordered接口)。

第一步:創建實現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應用上下文環境 \*/
    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;
    }
}

第二步:創建Groovy腳本裝載類,動態解析腳本為Class

package com.example.groovy.testgroovy.task;

import groovy.lang.GroovyClassLoader;

public class GroovyUtils {

    private final static ClassLoader classLoader = GroovyUtils.class.getClassLoader();//獲取當前類裝載器
    //ClassLoader:就是類的裝載器,它使JVM可以動態的載入Java類,JVM并不需要知道從什么地方(本地文件、網絡等)載入Java類,這些都由ClassLoader完成。

    public final static GroovyClassLoader groovyClassLoader = new GroovyClassLoader(classLoader);
    //GroovyClassLoader:負責在運行時編譯groovy源代碼為Class的工作,從而使Groovy實現了將groovy源代碼動態加載為Class的功能。

    /**
     * .
     * 獲取實例化對象
     * @param script groovy腳本內容
     * @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;
    }
}

第三步:讀取腳本內容,執行腳本

@Slf4j
@Component
public class CallAnalysisGroovyTask {


    /**
     * .
     * 讀取腳本內容
     *
     * @return
     */
    public String getGroovy() {
        String context = "";
        try {
            String path = "E:\\IDEAFile\\testgroovy\\src\\main\\resources\\groovy\\LoadBean.groovy";
            context = FileUtils.readFileToString(new File(path));//將腳本內容轉為字符串
        } catch (IOException e) {
            log.error("file is not found[{}]", e);
        }
        return context;
    }

    /**
     * .
     * 執行groovy腳本
     *
     * @param script
     */
    public void execGroovy(String script) {
        try {
            Runnable runnable = GroovyUtils.instanceTaskGroovyScript(script);//獲取實例對象
            runnable.run();//調用腳本方法
        } catch (Exception t) {
            log.error("execGroovy file {} error", script);
        }
    }
}

第四步:在resources目錄下創建.groovy文件

@Slf4j
class LoadBean implements Runnable {

    /**
     * .
     * Groovy獲取Bean
     */
    @Override
    void run() {
        log.info("Groovy開始執行,當前類{}", this.getClass())
        ScriptService service = SpringUtils.getBean(ScriptService.class)
        log.info("ApplicationContext獲取對象[{}]", service.class)
        List<Script> item = service.findAll()//執行bean中數據查詢方法
        for (Script s : item) {
            log.info("創建人:[{}],規則id:[{}],名稱:[{}]", s.getCreatePerson(), s.getRuleId(), s.getScriptName())
        }
        log.info("Groovy結束執行,當前類{}", this.getClass())
    }
}

第五步:實例化腳本,執行方法 

   @GetMapping("/loadBean")
    public void loadBean(){
        String script = CallAnalysisGroovyTask.getGroovy(); //獲取腳本
        CallAnalysisGroovyTask.execGroovy(script);//實例化腳本,執行方法
        log.info("數據查詢成功...");
    }

腳本運行結果:

Java動態腳本Groovy獲取Bean技巧是什么

二、使用ApplicationContext注入Bean

它是springBeanFactory之外的另一個核心接口或容器,允許容器通過應用程序上下文環境創建、獲取、管理bean。為應用程序提供配置的中央接口。在應用程序運行時這是只讀的,但如果實現支持這一點,則可以重新加載。

第一步:修改項目啟動類,獲得ApplicationContext

@SpringBootApplication
public class TestgroovyApplication {

    //獲取應用程序上下文環境
    private static ApplicationContext applicationContext;

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

第二步:修改resources目錄下創建的.groovy文件

/**
     * .
     * Groovy獲取Bean
     */
    @Override
    void run() {
        log.info("Groovy開始執行,當前類{}", this.getClass())
        ScriptService service = TestgroovyApplication.applicationContext.getBean(ScriptService.class)
        log.info("ApplicationContext獲取對象[{}]", service.class)
        List<Script> item = service.findAll()//執行bean中數據查詢方法
        for (Script s : item) {
            log.info("創建人:[{}],規則id:[{}],名稱:[{}]", s.getCreatePerson(), s.getRuleId(), s.getScriptName())
        }
        log.info("Groovy結束執行,當前類{}", this.getClass())
    }

腳本運行結果:

Java動態腳本Groovy獲取Bean技巧是什么

“Java動態腳本Groovy獲取Bean技巧是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新平| 虹口区| 洞口县| 揭东县| 四子王旗| 禹城市| 栖霞市| 崇左市| 三亚市| 舞钢市| 新建县| 扎兰屯市| 华阴市| 革吉县| 和顺县| 乐平市| 合作市| 明光市| 昭平县| 汨罗市| 赫章县| 兰西县| 云浮市| 都江堰市| 天水市| 双辽市| 福鼎市| 永胜县| 柞水县| 定安县| 高清| 行唐县| 安岳县| 扎囊县| 甘孜县| 武平县| 云阳县| 亳州市| 临夏市| 金山区| 宁明县|