最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring運行時手動注入bean的方法實例

 更新時間:2022年05月31日 10:21:14   作者:xiuyuandashen  
spring給我們提供了IOC服務,讓我們可以用注解的方式,方便的使用bean的相互引用,下面這篇文章主要給大家介紹了關于Spring運行時手動注入bean的相關資料,需要的朋友可以參考下

有時候,會有這樣一個需求,在程序運行時動態(tài)生成的對象,需要注入到Spring容器中進行管理。

下面是獲取Bean以及注入Bean的工具類

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.Map;

@Component
public class SpringUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

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

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }

    public static Object getBean(Class name) throws BeansException {
        return applicationContext.getBean(name);
    }

    /**
     * bean注入spring容器
     * map[id,className,...]
     * id 為 bean的標識
     * className 為 類的全限定類名
     * ... 為其他屬性
     * @param map
     */
    public static void injectBean(Map<String, String> map) {
        String className = map.get("className");
        Class<?> aClass;
        if (className == null) {
            throw new RuntimeException("map參數(shù)缺少className");
        }

        try {
            aClass = Class.forName(className);
            if (aClass == null) {
                throw new RuntimeException("className不存在");
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(aClass);
        Field[] declaredFields = aClass.getDeclaredFields();
        for (int i = 0; i < declaredFields.length; i++) {
            String fieldName = declaredFields[i].getName();
            if (map.get(fieldName) != null) {
                // 必須設置可訪問,否則下面的操作做不了
                // declaredFields[i].setAccessible(true);
                builder.addPropertyValue(fieldName, map.get(fieldName));
            }
        }
        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) applicationContext;
        // 注冊bean 第一個參數(shù)為 name ,第二個為 bean定義類
        String id = map.get("id");
        if (id == null) {
            registry.registerBeanDefinition(className, builder.getBeanDefinition());
            return;
        }
        registry.registerBeanDefinition(id, builder.getBeanDefinition());
    }
}

測試

@Test
   public void test2() {
      HashMap<String, String> map = new HashMap<>();
      map.put("id", "helloTask");
      map.put("className", "com.example.demo.Task.HelloTask4");
      // 注冊bean
      SpringUtils.injectBean(map);
//    HelloTask4 helloTask =(HelloTask4) SpringUtils.getBean(HelloTask4.class);
      HelloTask4 helloTask = (HelloTask4) SpringUtils.getBean("helloTask");
      System.out.println(helloTask.getClass());
   }

附:利用注解向Spring容器中注入Bean

常用注解包含:@Controller、@Service、@Repository、@Component,其中@Controller、@Service、@Repository都是基于@Component的擴展。通常的@Controller用于標識處理前端請求的類,@Service用于標識業(yè)務邏輯類,@Repository用于標識DAO層的類,@Component為通用注解,可以標注在任何想要注入容器中的類上面;

@Component
//@Controller
//@Service
//@Repository
class Stu{
    
}

也可以利用@Bean與@Configuration注入,其中@Configuration用于標注一個配置類,@Bean用于標注返回需注入Bean的方法;

@Configuration
class MyConfig{
    @Bean
    public Student getStudent(){
        return new Student();
    }
}

總結(jié)

到此這篇關于Spring運行時手動注入bean的文章就介紹到這了,更多相關Spring運行手動注入bean內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JAVA模擬新增順序表及單鏈表

    JAVA模擬新增順序表及單鏈表

    這篇文章主要介紹了JAVA模擬新增順序表及單鏈表,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Java 17 隨機數(shù)生成器來了一波穩(wěn)穩(wěn)的增強

    Java 17 隨機數(shù)生成器來了一波穩(wěn)穩(wěn)的增強

    JDK 當中的隨機數(shù)生成器其實對于普通開發(fā)者來講基本夠用,不過對于一些比較復雜的場景來講,原有的類結(jié)構(gòu)對擴展并不是很友好,除了 Random 類,JDK 當中還提供了另外幾個隨機數(shù)的成員,下面文章將詳細介紹,需要的朋友可以參考一下
    2021-09-09
  • Windows?10卸載JDK1.8超詳細圖文教程

    Windows?10卸載JDK1.8超詳細圖文教程

    這篇文章主要介紹了Windows?10卸載JDK1.8超詳細圖文教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • debug模式遲遲不能啟動問題及解決

    debug模式遲遲不能啟動問題及解決

    在使用Debug模式進行代碼測試時,由于設置了過多的斷點,導致程序加載緩慢甚至無法啟動,解決此問題的方法是取消不必要的斷點,通過IDE的斷點管理功能,檢查并移除問題斷點,從而優(yōu)化調(diào)試效率,分享此經(jīng)驗希望能幫助遇到相同問題的開發(fā)者
    2022-11-11
  • SpringBoot集成Sharding-JDBC實現(xiàn)分庫分表方式

    SpringBoot集成Sharding-JDBC實現(xiàn)分庫分表方式

    這篇文章主要介紹了SpringBoot集成Sharding-JDBC實現(xiàn)分庫分表方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 關于nacos無法正常下線問題記錄

    關于nacos無法正常下線問題記錄

    這篇文章主要介紹了關于nacos無法正常下線問題記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java的無參構(gòu)造函數(shù)用法實例分析

    Java的無參構(gòu)造函數(shù)用法實例分析

    這篇文章主要介紹了Java的無參構(gòu)造函數(shù)用法,結(jié)合實例形式分析了java無參構(gòu)造函數(shù)基本原理、用法及相關操作注意事項,需要的朋友可以參考下
    2019-09-09
  • SpringBoot AOP使用筆記

    SpringBoot AOP使用筆記

    今天小編就為大家分享一篇關于SpringBoot AOP使用筆記,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java生成獨一無二的工單號實例

    Java生成獨一無二的工單號實例

    這篇文章主要介紹了Java生成獨一無二的工單號實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • java String校招面試題過程詳解

    java String校招面試題過程詳解

    這篇文章主要介紹了java String校招面試題過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08

最新評論

安顺市| 札达县| 丰都县| 锦州市| 驻马店市| 鸡东县| 湘乡市| 扎囊县| 鞍山市| 武隆县| 东港市| 北辰区| 进贤县| 永新县| 广汉市| 西昌市| 博罗县| 泸州市| 益阳市| 扶沟县| 凤台县| 寻乌县| 奉化市| 阿克| 观塘区| 汾西县| 新宾| 平安县| 湟源县| 安远县| 乳源| 南岸区| 星子县| 彩票| 平谷区| 察哈| 清远市| 海兴县| 玉溪市| 通化市| 大悟县|