国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java SpringBoot 中,動(dòng)態(tài)執(zhí)行 bean 對(duì)象中的方法

這篇具有很好參考價(jià)值的文章主要介紹了Java SpringBoot 中,動(dòng)態(tài)執(zhí)行 bean 對(duì)象中的方法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

根據(jù)不同的條件,調(diào)用不同的 bean 對(duì)象,執(zhí)行對(duì)象中的方法

Spring的Factories 配置方式 容器注入

SpringUtils 工具類

package com.vipsoft.web.utils;


import cn.hutool.core.util.ArrayUtil;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * Spring工具類 方便在非 Spring 管理環(huán)境中獲取bean
 *
 */
@Component
public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware {

    /**
     * Spring 應(yīng)用上下文環(huán)境
     */
    private static ConfigurableListableBeanFactory beanFactory;

    private static ApplicationContext applicationContext;

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        SpringUtils.beanFactory = beanFactory;
    }

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

    /**
     * 獲取對(duì)象
     *
     * @param name
     * @return Object 一個(gè)以所給名字注冊(cè)的bean的實(shí)例
     * @throws BeansException
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) beanFactory.getBean(name);
    }

    /**
     * 獲取類型為requiredType的對(duì)象
     *
     * @param clz
     * @return
     * @throws BeansException
     */
    public static <T> T getBean(Class<T> clz) throws BeansException {
        T result = (T) beanFactory.getBean(clz);
        return result;
    }

    /**
     * 如果BeanFactory包含一個(gè)與所給名稱匹配的bean定義,則返回true
     *
     * @param name
     * @return boolean
     */
    public static boolean containsBean(String name) {
        return beanFactory.containsBean(name);
    }

    /**
     * 判斷以給定名字注冊(cè)的bean定義是一個(gè)singleton還是一個(gè)prototype。 如果與給定名字相應(yīng)的bean定義沒有被找到,將會(huì)拋出一個(gè)異常(NoSuchBeanDefinitionException)
     *
     * @param name
     * @return boolean
     * @throws NoSuchBeanDefinitionException
     */
    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.isSingleton(name);
    }

    /**
     * @param name
     * @return Class 注冊(cè)對(duì)象的類型
     * @throws NoSuchBeanDefinitionException
     */
    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.getType(name);
    }

    /**
     * 如果給定的bean名字在bean定義中有別名,則返回這些別名
     *
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException
     */
    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.getAliases(name);
    }

    /**
     * 獲取aop代理對(duì)象
     *
     * @param invoker
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T getAopProxy(T invoker) {
        return (T) AopContext.currentProxy();
    }

    /**
     * 獲取當(dāng)前的環(huán)境配置,無配置返回null
     *
     * @return 當(dāng)前的環(huán)境配置
     */
    public static String[] getActiveProfiles() {
        return applicationContext.getEnvironment().getActiveProfiles();
    }

    /**
     * 獲取當(dāng)前的環(huán)境配置,當(dāng)有多個(gè)環(huán)境配置時(shí),只獲取第一個(gè)
     *
     * @return 當(dāng)前的環(huán)境配置
     */
    public static String getActiveProfile() {
        final String[] activeProfiles = getActiveProfiles();
        return ArrayUtil.isNotEmpty(activeProfiles) ? activeProfiles[0] : null;
    }
}

執(zhí)行類

package com.vipsoft.web.task;

import cn.hutool.core.date.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;


@Component("scheduletask")
public class ScheduleTask {

    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    public void execute(String param) {
        logger.info("執(zhí)行 Schedule Task,當(dāng)前時(shí)間:{},任務(wù)參數(shù):{}", DateUtil.now(), param);
    }
}

測(cè)試類文章來源地址http://www.zghlxwxcb.cn/news/detail-413078.html

package com.vipsoft.web;

import cn.hutool.core.util.StrUtil;
import com.vipsoft.web.utils.SpringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.lang.reflect.Method;

@SpringBootTest
public class SpringUtilTest {

    @Test
    void invokeTest() throws Exception {
        //點(diǎn)前面的做為 bean 名稱,后面是方法名,(中是參數(shù)==參數(shù)可以放JSON)
        String invokeTarget = "scheduletask.execute('VipSoft Quartz')";
        invokeMethod(invokeTarget);
    }

    void invokeMethod(String invokeTarget) throws Exception {
        String beanName = StrUtil.subBefore(invokeTarget, ".", true);
        String methodName = StrUtil.subBetween(invokeTarget, ".", "(");
        String param = StrUtil.subBetween(invokeTarget, "(", ")");

        Object bean;
        if (StrUtil.count(beanName, ".") == 0) {
            bean = SpringUtils.getBean(beanName);
        } else {
            //Package 的形式得到 Bean,如: beanName="com.vipsoft.web.task.ScheduleTask"
            bean = Class.forName(beanName).newInstance();
        }

        if (bean != null) {
            if (StrUtil.isNotEmpty(param)) {
                Method method = bean.getClass().getDeclaredMethod(methodName, String.class);
                method.invoke(bean, param);
            } else {
                Method method = bean.getClass().getDeclaredMethod(methodName);
                method.invoke(bean);
            }
        }
    }

}

到了這里,關(guān)于Java SpringBoot 中,動(dòng)態(tài)執(zhí)行 bean 對(duì)象中的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【技巧】ScriptEngine--Java動(dòng)態(tài)執(zhí)行JS Javascript腳本(可調(diào)用java的方法)

    【技巧】ScriptEngine--Java動(dòng)態(tài)執(zhí)行JS Javascript腳本(可調(diào)用java的方法)

    開發(fā)手冊(cè) Java Platform, Standard Edition Nashorn User\\\'s Guide, Release 14 用戶手冊(cè) Nashorn User\\\'s Guide (oracle.com) https://docs.oracle.com/en/java/javase/14/nashorn/ 甚至可以讓前端來寫后端業(yè)務(wù)代碼 可以通過js調(diào)用java的方法, 通過傳參的方式將java對(duì)象傳給js 可以單獨(dú)寫個(gè)JsUtil 讓js來調(diào)用 里邊寫常用的方法

    2024年02月01日
    瀏覽(19)
  • springboot讀取yml文件中的list列表、數(shù)組、map集合和對(duì)象方法實(shí)例

    springboot讀取yml文件中的list列表、數(shù)組、map集合和對(duì)象方法實(shí)例

    目錄前言application.yml定義list集合application.yml定義數(shù)組類型總結(jié) 前言 springboot配置文件yml類型簡單的風(fēng)格,十分受大家的歡迎,支持字符string類型,支持列表list類型,支持集合map類型,支持?jǐn)?shù)組array類型,支持類對(duì)象類型,下面我們來實(shí)戰(zhàn)下這些形式的配置如何取值 applicatio

    2024年02月09日
    瀏覽(87)
  • Vue根據(jù)對(duì)象中的某個(gè)屬性來排序?qū)ο髷?shù)組【入門】

    Vue根據(jù)對(duì)象中的某個(gè)屬性來排序?qū)ο髷?shù)組【入門】

    要對(duì)對(duì)象數(shù)組按照其中某個(gè)屬性進(jìn)行排序,我們可以使用 JavaScript 的 sort() 方法,并傳入一個(gè)自定義的比較函數(shù)。在這個(gè)比較函數(shù)中,我們可以指定按照哪個(gè)屬性進(jìn)行排序。 假設(shè)有一個(gè)對(duì)象數(shù)組 items,其中每個(gè)對(duì)象都包含一個(gè) name 屬性和一個(gè) age 屬性,我們可以使用以下代碼

    2024年02月09日
    瀏覽(20)
  • springboot es索引@Document通過動(dòng)態(tài)加載bean實(shí)現(xiàn)動(dòng)態(tài)改變

    需求:elasticsearch中,每天的數(shù)據(jù)放在當(dāng)天的索引中,如2022.08.23?,F(xiàn)有一個(gè)服務(wù),定時(shí)從es中將數(shù)據(jù)拉取到mysql數(shù)據(jù)庫中存儲(chǔ)。 更新:可以通過SPEL進(jìn)行動(dòng)態(tài)注入 ========================================================================= 考慮的點(diǎn):java中es映射實(shí)體需要@Document注解指定連接的elas

    2024年02月15日
    瀏覽(22)
  • 根據(jù)list中的對(duì)象某個(gè)屬性 進(jìn)行分組

    1,跟據(jù)某個(gè)屬性分組OfficeId 2,根據(jù)某個(gè)屬性分組OfficeId,匯總某個(gè)屬性Money 3,根據(jù)某個(gè)屬性添加條件過濾數(shù)據(jù), 4,判斷一組對(duì)象里面有沒有屬性值是某個(gè)值 5,取出一組對(duì)象的某個(gè)屬性組成一個(gè)新集合 6.List 去重 7.java stream中的findFirst 返回出現(xiàn)的第一個(gè)結(jié)果 8.stream自定義k

    2024年02月11日
    瀏覽(21)
  • Stream流中,根據(jù)對(duì)象去重+指定對(duì)象中的屬性去重

    Stream流中,根據(jù)對(duì)象去重+指定對(duì)象中的屬性去重

    首先定義一個(gè)學(xué)生類: 在main方法中構(gòu)造四個(gè)對(duì)象,其中第四個(gè)對(duì)象為重復(fù)對(duì)象,現(xiàn)在進(jìn)行對(duì)象的去重、以及對(duì)象中某一屬性的去重操作 一、根據(jù)對(duì)象去重: 以下代碼寫于main函數(shù)中: 運(yùn)行結(jié)果如下,可以看到,stream流的distinct只是將對(duì)象去重,將相同的第三個(gè)和第四個(gè)對(duì)象

    2024年02月02日
    瀏覽(93)
  • 【SpringBoot】詳細(xì)介紹SpringBoot中的bean

    在Spring Boot中,Bean是由Spring容器實(shí)例化、管理和維護(hù)的對(duì)象。Bean是Spring框架的核心概念之一,它代表了應(yīng)用程序中的組件或?qū)ο蟆?以下是有關(guān)Spring Boot中Bean的詳細(xì)介紹: 1. 定義 : Bean是在Spring容器中被實(shí)例化、管理和維護(hù)的對(duì)象。一個(gè)Bean可以是任何普通的Java對(duì)象 ,例如

    2024年02月11日
    瀏覽(26)
  • SpringBoot中的bean管理

    SpringBoot中的bean管理

    默認(rèn) 情況下,Spring項(xiàng)目啟動(dòng)時(shí),會(huì)把bean都創(chuàng)建好放在IOC容器中,如果想要主動(dòng)獲取這些bean,可以通過如下方式: 根據(jù) name 獲取bean: 根據(jù) 類型 獲取bean: 根據(jù) name 獲取bean(帶 類型 轉(zhuǎn)換) : 示例: 上述所說的【Spring項(xiàng)目啟動(dòng)時(shí),會(huì)把其中的bean都創(chuàng)建好】還會(huì)受到 作用域 及 延遲

    2024年02月11日
    瀏覽(19)
  • 【Java基礎(chǔ)教程】(八)面向?qū)ο笃?· 第二講:Java 數(shù)組全面解析——?jiǎng)討B(tài)與靜態(tài)初始化、二維數(shù)組、方法參數(shù)傳遞、排序與轉(zhuǎn)置、對(duì)象數(shù)組、操作API~

    【Java基礎(chǔ)教程】(八)面向?qū)ο笃?· 第二講:Java 數(shù)組全面解析——?jiǎng)討B(tài)與靜態(tài)初始化、二維數(shù)組、方法參數(shù)傳遞、排序與轉(zhuǎn)置、對(duì)象數(shù)組、操作API~

    掌握數(shù)組的動(dòng)態(tài)及靜態(tài)創(chuàng)建方式、使用及特征; 掌握引用類型數(shù)據(jù)的特征; 掌握數(shù)組的排序、轉(zhuǎn)置操作; 數(shù)組可以將多個(gè)變量進(jìn)行統(tǒng)一的命名,這樣相同類型的元素就可以按照一定的順序進(jìn)行組合排列 。在 Java中,數(shù)組屬于引用類型數(shù)據(jù),所以在數(shù)組的操作過程中,也一定

    2024年02月13日
    瀏覽(31)
  • springboot3整合elasticsearch8.7.0實(shí)現(xiàn)為bean對(duì)象創(chuàng)建索引添加映射

    springboot3整合elasticsearch8.7.0實(shí)現(xiàn)為bean對(duì)象創(chuàng)建索引添加映射

    目錄 準(zhǔn)備工作 添加相關(guān)依賴 在yml中配置elasticsearch 主要內(nèi)容 實(shí)體類 ElasticSearch配置類 測(cè)試 確認(rèn)當(dāng)前沒有counter索引 啟動(dòng)spring 再次查詢counter索引? 在測(cè)試類中輸出counter索引的映射 官方文檔 要注意版本對(duì)應(yīng)關(guān)系 spring官方文檔中有版本對(duì)照表 目前我使用的都是最新的版本,

    2024年02月03日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包