好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring之动态注册bean的实现方法

spring之 动态注册 bean

什么场景下,需要主动向spring容器注册bean呢?

如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + groovy任务,就可以丢到这个平台上面来运行了,而这个基础平台是一直都在运行的,所以在新来任务时,最直观需要注册的就是 datasource 数据源这个bean了,那么可以怎么玩?

i. 主动注册bean支持

借助beandefinition来实现bean的定义,从最终的使用来看,代码比较少,几行而已

?

1

2

3

4

5

6

7

8

9

10

11

12

13

public <t> t registerbean(string name, class <t> clazz, object... args) {

    beandefinitionbuilder beandefinitionbuilder = beandefinitionbuilder.genericbeandefinition(clazz);

    if (args.length > 0 ) {

      for (object arg : args) {

        beandefinitionbuilder.addconstructorargvalue(arg);

      }

    }

    beandefinition beandefinition = beandefinitionbuilder.getrawbeandefinition();

 

    beandefinitionregistry beanfactory = (beandefinitionregistry) applicationcontext.getbeanfactory();

    beanfactory.registerbeandefinition(name, beandefinition);

    return applicationcontext.getbean(name, clazz);

}

测试如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

import com.github.hui.story.quickstory.server.visitservice;

import lombok.tostring;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.beans.factory.config.beandefinition;

import org.springframework.beans.factory.support.beandefinitionbuilder;

import org.springframework.beans.factory.support.beandefinitionregistry;

import org.springframework.context.configurableapplicationcontext;

import org.springframework.stereotype测试数据ponent;

 

@component

public class beanholder {

   private final configurableapplicationcontext applicationcontext;

 

   public beanholder(configurableapplicationcontext applicationcontext) {

     this .applicationcontext = applicationcontext;

     initser();

   }

 

   public void initser() {

     inrser ser = registerbean( "test" , inrser. class );

     ser.name = "一灰" ;

     ser.uid = 22 ;

     system.out.println(ser);

 

     inrser ser2 = registerbean( "test2" , inrser. class , "一灰灰blog" , 20 );

     system.out.println(ser2);

   }

 

   @tostring

   public static class inrser {

     private string name;

     private integer uid;

 

     @autowired

     private visitservice visitservice;

 

     public inrser() {

     }

 

     public inrser(string name, integer uid) {

       this .name = name;

       this .uid = uid;

     }

   }

 

   private <t> t registerbean(string name, class <t> clazz, object... args) {

     beandefinitionbuilder beandefinitionbuilder = beandefinitionbuilder.genericbeandefinition(clazz);

     if (args.length > 0 ) {

       for (object arg : args) {

         beandefinitionbuilder.addconstructorargvalue(arg);

       }

     }

     beandefinition beandefinition = beandefinitionbuilder.getrawbeandefinition();

 

     beandefinitionregistry beanfactory = (beandefinitionregistry) applicationcontext.getbeanfactory();

     beanfactory.registerbeandefinition(name, beandefinition);

     return applicationcontext.getbean(name, clazz);

   }

}

输出如下

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://segmentfault测试数据/a/1190000015887070

查看更多关于Spring之动态注册bean的实现方法的详细内容...

  阅读:121次