久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Spring Boot 整合 Groovy 腳本,實現動態編程

     jacklopy 2022-12-13 發布于河北
    SpringForAll
    分享關于Spring的一切
    284篇原創內容
    公眾號
    SpringForAll
    分享關于Spring的一切
    284篇原創內容
    公眾號

    圖片來源:blog.csdn.net/weixin_33005117/article/details/126712394

    Groovy簡介

    Groovy 是增強 Java 平臺的唯一的腳本語言。它提供了類似于 Java 的語法,內置映射(Map)、列表(List)、方法、類、閉包(closure)以及生成器。腳本語言不會替代系統編程語言,兩者是相互補充的。

    大名鼎鼎的 Gradle,背后是 Groovy。Spring 的未來越來越多的使用 Groovy,甚至在用 Jira 跟蹤項目時,背后也有 Groovy。實際上,就應用場景而言,Java 開發已經有越來越多的 Groovy 出現在后臺了。而對于一般的應用開發,只要能用 Java 就都能用到 Groovy,唯一的難點只在于能不能招到足夠的人員。

    應用場景

    • 連接已有的組件
    • 處理經常變化的多種類型的實體
    • 具有圖形化用戶界面
    • 擁有快速變化的功能

    Groovy腳本的基礎概念請移步

    • http:///groovy-introduction.html

    集成與使用

    那么接下來介紹SpringBoot如何集成Groovy腳本,并應用到實際開發中。

    第一步、與SpringBoot集成

    pom.xml文件如下:

    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.4.7</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    第二步、寫出Groovy版本的“Hello World”

    1、HelloWorld.groovy腳本代碼

    package groovy

    def HelloWorld(){
        println 'hello world'
    }

    2、創建測試類GroovyTest.java

    package com.example.springbootgroovy.service;

    import groovy.lang.GroovyShell;
    import groovy.lang.Script;

    /**
     * 這個是Groovy的第一個小程序,腳本為:
     * 
     package groovy
     
     def helloworld(){
      println 'hello world'
     }
     *
     */
    public class GroovyTest {

        public static void main(String[] args) throws Exception {
            //創建GroovyShell
            GroovyShell groovyShell = new GroovyShell();
            //裝載解析腳本代碼
            Script script = groovyShell.parse('package groovy\n' +
                    '\n' +
                    'def HelloWorld(){\n' +
                    '    println \'hello world\'\n' +
                    '}');
            //執行
            script.invokeMethod('HelloWorld', null);
        }
    }

    3、運行結果

    第三步、傳入變量與獲取返回值

    1、變量與返回值Groovy腳本代碼

    package groovy

    /**
     * 簡易加法
     * @param a 數字a
     * @param b 數字b
     * @return 和
     */
    def add(int a, int b) {
        return a + b
    }

    /**
     * map轉化為String
     * @param paramMap 參數map
     * @return 字符串
     */
    def mapToString(Map<String, String> paramMap) {
        StringBuilder stringBuilder = new StringBuilder();
        paramMap.forEach({ key, value ->
            stringBuilder.append('key:' + key + ';value:' + value)
        })
        return stringBuilder.toString()
    }

    2、創建測試類GroovyTest2.java

    package com.example.springbootgroovy.service;

    import groovy.lang.GroovyShell;
    import groovy.lang.Script;

    import java.util.HashMap;
    import java.util.Map;

    /**
     * 向Groovy腳本中傳入變量,以及獲取返回值
     */
    public class GroovyTest2 {
        public static void main(String[] args) {
            //創建GroovyShell
            GroovyShell groovyShell = new GroovyShell();
            //裝載解析腳本代碼
            Script script = groovyShell.parse('package groovy\n' +
                    '\n' +
                    '/**\n' +
                    ' * 簡易加法\n' +
                    ' * @param a 數字a\n' +
                    ' * @param b 數字b\n' +
                    ' * @return 和\n' +
                    ' */\n' +
                    'def add(int a, int b) {\n' +
                    '    return a + b\n' +
                    '}\n' +
                    '\n' +
                    '/**\n' +
                    ' * map轉化為String\n' +
                    ' * @param paramMap 參數map\n' +
                    ' * @return 字符串\n' +
                    ' */\n' +
                    'def mapToString(Map<String, String> paramMap) {\n' +
                    '    StringBuilder stringBuilder = new StringBuilder();\n' +
                    '    paramMap.forEach({ key, value ->\n' +
                    '        stringBuilder.append(\'key:\' + key + \';value:\' + value)\n' +
                    '    })\n' +
                    '    return stringBuilder.toString()\n' +
                    '}');
            //執行加法腳本
            Object[] params1 = new Object[]{1, 2};
            int sum = (int) script.invokeMethod('add', params1);
            System.out.println('a加b的和為:' + sum);
            //執行解析腳本
            Map<String, String> paramMap = new HashMap<>();
            paramMap.put('科目1''語文');
            paramMap.put('科目2''數學');
            Object[] params2 = new Object[]{paramMap};
            String result = (String) script.invokeMethod('mapToString', params2);
            System.out.println('mapToString:' + result);
        }
    }

    3、運行結果

    圖片

    第四步、啟動SpringBoot,在Groovy腳本中通過SpringContextUtil獲取SpringBoot容器中的Bean

    1、創建SpringContextUtil.java

    package com.example.springbootgroovy.util;

    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Component;

    /**
     * Spring上下文獲取
     */
    @Component
    public class SpringContextUtil implements ApplicationContextAware {

        private static ApplicationContext applicationContext;

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

        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }

        /**
         * 通過name獲取 Bean.
         *
         * @param name
         * @return
         */
        public static Object getBean(String name) {
            return getApplicationContext().getBean(name);
        }

        /**
         * 通過class獲取Bean.
         *
         * @param clazz
         * @param <T>
         * @return
         */
        public static <T> T getBean(Class<T> clazz) {
            return getApplicationContext().getBean(clazz);
        }

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

    2、創建GroovyTestService.java,并加上@Service注解加入到SpringBoot容器中

    package com.example.springbootgroovy.service;

    import org.springframework.stereotype.Service;

    @Service
    public class GroovyTestService {

        public void test(){
            System.out.println('我是SpringBoot框架的成員類,但該方法由Groovy腳本調用');
        }

    }

    3、Groovy腳本如下

    package groovy

    import com.example.springbootgroovy.service.GroovyTestService
    import com.example.springbootgroovy.util.SpringContextUtil

    /**
     * 靜態變量
     */
    class Globals {
        static String PARAM1 = '靜態變量'
        static int[] arrayList = [1, 2]
    }

    def getBean() {
        GroovyTestService groovyTestService = SpringContextUtil.getBean(GroovyTestService.class);
        groovyTestService.test()
    }

    4、啟動類代碼如下

    package com.example.springbootgroovy;

    import groovy.lang.GroovyShell;
    import groovy.lang.Script;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    @RequestMapping('/groovy')
    @SpringBootApplication
    public class SpringBootGroovyApplication {

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

        @RequestMapping('/test')
        public String test() {
            //創建GroovyShell
            GroovyShell groovyShell = new GroovyShell();
            //裝載解析腳本代碼
            Script script = groovyShell.parse('package groovy\n' +
                    '\n' +
                    'import com.example.springbootgroovy.service.GroovyTestService\n' +
                    'import com.example.springbootgroovy.util.SpringContextUtil\n' +
                    '\n' +
                    '/**\n' +
                    ' * 靜態變量\n' +
                    ' */\n' +
                    'class Globals {\n' +
                    '    static String PARAM1 = \'靜態變量\'\n' +
                    '    static int[] arrayList = [1, 2]\n' +
                    '}\n' +
                    '\n' +
                    'def getBean() {\n' +
                    '    GroovyTestService groovyTestService = SpringContextUtil.getBean(GroovyTestService.class);\n' +
                    '    groovyTestService.test()\n' +
                    '}');
            //執行
            script.invokeMethod('getBean', null);
            return 'ok';
        }
    }

    5、啟動后調用接口:http://localhost:8080/groovy/test,運行結果如下

    圖片

    注意!?。?/span>

    通過第四步中我們可以看到,在Groovy中是可以獲取到SpringBoot容器對象的。雖然很方便,但是很危險。如果沒有做好權限控制,Groovy腳本將會成為攻擊你系統最有力的武器??!



    END

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 人妻大战黑人白浆狂泄| 12裸体自慰免费观看网站 | 熟妇人妻无码中文字幕老熟妇| 国产成人不卡一区二区| 久久综合久中文字幕青草| 日日婷婷夜日日天干| 日韩深夜视频在线观看| 国产在线不卡精品网站| 四虎亚洲国产成人久久精品| 久久这里有精品国产电影网| 午夜三级A三级三点在线观看| 亚洲av日韩av永久无码电影 | 欧美成人午夜在线观看视频| 人人妻人人澡人人爽欧美二区| 中文字幕在线精品国产| 99久久无色码中文字幕| 色偷偷www.8888在线观看| 一个人免费观看WWW在线视频| 国产精品av中文字幕| 亚洲色偷偷色噜噜狠狠99| 亚洲精品熟女一区二区| 亚洲精品无码久久久久去Q| 无码精品人妻一区二区三区中| 夜夜爱夜鲁夜鲁很鲁| 人妻少妇久久久久久97人妻 | 国产片AV国语在线观看手机版| 一本一本久久AA综合精品| 精品久久人人做爽综合| 亚洲成AV人片在线观看WV| 无码8090精品久久一区| 国产睡熟迷奷系列网站| 天天在线看无码AV片| 亚洲熟女片嫩草影院| 精品无码国产日韩制服丝袜| 人妻激情乱人伦视频| 欧美人与动人物牲交免费观看久久 | 日本中文字幕有码在线视频| 国产AV午夜精品一区二区三区| 国产午夜福利免费入口| 亚洲国产精品福利片在线观看| 国产一区二区三区导航|