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

Spring運(yùn)行時(shí)手動(dòng)注入bean的方法實(shí)例

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

有時(shí)候,會(huì)有這樣一個(gè)需求,在程序運(yùn)行時(shí)動(dòng)態(tài)生成的對(duì)象,需要注入到Spring容器中進(jìn)行管理。

下面是獲取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的標(biāo)識(shí)
     * 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) {
                // 必須設(shè)置可訪問,否則下面的操作做不了
                // declaredFields[i].setAccessible(true);
                builder.addPropertyValue(fieldName, map.get(fieldName));
            }
        }
        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) applicationContext;
        // 注冊(cè)bean 第一個(gè)參數(shù)為 name ,第二個(gè)為 bean定義類
        String id = map.get("id");
        if (id == null) {
            registry.registerBeanDefinition(className, builder.getBeanDefinition());
            return;
        }
        registry.registerBeanDefinition(id, builder.getBeanDefinition());
    }
}

測(cè)試

@Test
   public void test2() {
      HashMap<String, String> map = new HashMap<>();
      map.put("id", "helloTask");
      map.put("className", "com.example.demo.Task.HelloTask4");
      // 注冊(cè)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的擴(kuò)展。通常的@Controller用于標(biāo)識(shí)處理前端請(qǐng)求的類,@Service用于標(biāo)識(shí)業(yè)務(wù)邏輯類,@Repository用于標(biāo)識(shí)DAO層的類,@Component為通用注解,可以標(biāo)注在任何想要注入容器中的類上面;

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

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

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

總結(jié)

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

相關(guān)文章

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

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

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

    Java 17 隨機(jī)數(shù)生成器來(lái)了一波穩(wěn)穩(wěn)的增強(qiáng)

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

    Windows?10卸載JDK1.8超詳細(xì)圖文教程

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

    debug模式遲遲不能啟動(dòng)問題及解決

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

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

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

    關(guān)于nacos無(wú)法正常下線問題記錄

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

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

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

    SpringBoot AOP使用筆記

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

    Java生成獨(dú)一無(wú)二的工單號(hào)實(shí)例

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

    java String校招面試題過程詳解

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

最新評(píng)論

鲜城| 比如县| 盐城市| 阿荣旗| 泽州县| 黔江区| 鄯善县| 奉新县| 琼中| 乡城县| 锦州市| 日土县| 铜鼓县| 炎陵县| 广汉市| 开远市| 镇康县| 周至县| 分宜县| 新蔡县| 民县| 夏津县| 利辛县| 崇明县| 石渠县| 共和县| 邵阳县| 赣榆县| 木里| 新津县| 乾安县| 乌审旗| 隆昌县| 瑞安市| 油尖旺区| 高青县| 贵阳市| 卢湾区| 鲁甸县| 莎车县| 东城区|