为了账号安全,请及时绑定邮箱和手机立即绑定

我正在使用 Spring-Boot,使用类名字符串动态初始化一个类并获取返回值

我正在使用 Spring-Boot,使用类名字符串动态初始化一个类并获取返回值

跃然一笑 2023-05-10 15:14:21
我在 Spring Boot 中工作,MyService class我得到了一个名为 String 的类,我想初始化该对象并取回返回值。但我对此没有更多的想法,我认为它是通过依赖注入实现的。但是,怎么办?假设我有类A.java, B.java, C.java和服务类MyService.java@Componentpublic class A{    public String wish(int timeHr){       //some logic of time based wish    return "Hello A"+" good morning";}}@Componentpublic class B{    public String wish(int timeHr){       //some logic of time based wish    return "Hello B"+" good morning";}}@Componentpublic class C{    public String wish(int timeHr){       //some logic of time based wish    return "Hello C"+" good morning";}}@Servicepublic class MyService{   // i get here A class name as String like,   String classNameString = "A"; // or "B", or "C"   int timrHr =  new Date().getHours();   //how to here i will initialize above class and get method wist(param) returned wish msg.   //like, a.wish(timeHr); and it gives "Hello A good morning"}我期望 wish() 返回的输出。谁能建议我如何实现它?
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

我可以想到两种方法。第一种方法是命名类(在 @Component 之后)并使用上下文,尝试获取 bean。您还可以使用 @Qualifier 命名 bean


@Component("A")

public class A{

    public String wish(int timeHr){

       //some logic of time based wish

    return "Hello A"+" good morning";

}



@Component("B")

public class B{

    public String wish(int timeHr){

       //some logic of time based wish

    return "Hello B"+" good morning";

}

}


@Component("C")

public class C{

    public String wish(int timeHr){

       //some logic of time based wish

    return "Hello C"+" good morning";

}

}



@Service

public class MyService{

   @Autowired

   private ApplicationContext context;


  void myMethod() {

    A a = (A) context.getBean("A");



     System.out.println(a.wish(123));

   } 

    }

第二种方法是让你所有的愿望类实现一个接口并遍历这个接口的所有实现 bean 并找到正确的 bean


@Component

public class A implements Wisher{

    public String wish(int timeHr){

       //some logic of time based wish

    return "Hello A"+" good morning";

}



@Component

public class B implements Wisher{

    public String wish(int timeHr){

       //some logic of time based wish

    return "Hello B"+" good morning";

}

}


@Component

public class C implements Wisher{

    public String wish(int timeHr){

       //some logic of time based wish

    return "Hello C"+" good morning";

}

}


public interface Wisher{ public String wish(int time); }


@Service

public class MyService{

   @Autowired

   private List<Wisher> wishers;


void myMethod() {

    String requiredClassName = "A";

    Wisher requiredWisher = null;

    for (int i = 0; i < wishers.length(); i++) {

        Wisher w = wishers.get(i);

        if (w.getClass().getName().equals(requiredClassName)) {

            requiredWisher = w;

            break;

        }


        System.out.println(w.wish(123));

    }

}




    }


查看完整回答
反对 回复 2023-05-10
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

考虑到您正在使用 Spring 实现,所有 bean 都将是 Singleton,并且这些 bean 将在 App 启动时(加载 ApplicationContext 时)进行初始化,然后应用程序无法检查要注入哪个实现。


因此,您无法在运行时使用依赖注入有条件地注入 bean


相反,您可以使用如下所示的其他设计 -


@Service

public class MyService{


  private Wisher wisher;


  public Wisher setupWisher(String class){


   if (class.equals("A")) {

        wisher = new A();

    }else if(class.equals("B")){

        wisher = new B();

    }else if(class.equals("C")){

        wisher = new C();

    }

 }


 void myMethod(String requestString) {

    int timrHr =  new Date().getHours();

    setupWisher(requestString).wish(timrHr);       

 }


}


查看完整回答
反对 回复 2023-05-10
?
森栏

TA贡献1810条经验 获得超5个赞

String 不是 Spring IoC 框架可管理的 bean,而是类的实例A,B并且C是您的 beans。


你应该做的是声明类A,B并C作为公共接口的实现,并通过这种类型注入相应的 bean:


interface Wisher {

   String wish(int timeHr);

}


@Component

public class A implements Wisher {

  public String wish(int timeHr){

     //some logic of time based wish

    return "Hello A"+" good morning";

  }

}


@Component

public class B implements Wisher {

  public String wish(int timeHr){

     //some logic of time based wish

  return "Hello B"+" good morning";

  }

}


@Component

public class C implements Wisher {

  public String wish(int timeHr){

     //some logic of time based wish

  return "Hello C"+" good morning";

  } 

}


@Service

public class MyService{

   @Autowired

   private Wisher a; // instance of "A" or "B", or "C"


   void myMethod() {

        int timrHr =  new Date().getHours();

        wisher.wish(timrHr);

   } 

 }


查看完整回答
反对 回复 2023-05-10
  • 3 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信