java - 在运行时创建的对象中使用 Autowiring 的 bean

标签 java spring autowired

我有一个实现了 W 接口(interface)的 B 类。它有一个 W 方法的默认实现。 C 类和 D 类覆盖默认实现,它们需要一个服务,其 bean 由 spring 实例化。字符串 a 和 b 来自用户,因此我无法提前创建 B/C/D 的 bean。所以我有一个工厂,它根据用户参数创建一个新对象(它将根据参数创建 B/C/D)。有什么干净的方法可以从 C 和 D 内部使用服务 bean(aa/bb/cc/dd 等)(服务器启动期间的 spring Autowiring ,当时实例化 B/C/D 所需的参数不可用)或有没有更好的方法来解决这个问题?

 Class B implements W{
      String a;
      String b;
      B (String a, String b);

      w_method(){

      }
   }

    Class C extends B {
      @Autowired
      Service aa;

      @Autowired
      Service bb;

      @Autowired
      Service cc;

      @override
      w_method(){
      }
    }

Class D extends B {
  @Autowired
  Service dd;

  @override
  w_method(){
  }
}

最佳答案

存在三种可能的方法:

  • 构造函数参数来自用户这一事实并不意味着这些对象不能由 Spring 创建。

    您可以将它们声明为 prototype 范围的 Spring beans 并在您的工厂中执行以下操作:

    public C createC(String a, String b) {
        return applicationContext.getBean("c", a, b);
    }
    

    此方法的缺点是您的工厂依赖于 ApplicationContext

  • 您可以使用 @Configurable 注释这些类并启用 AspectJ 编织。在这种情况下,即使您使用 new 创建它们,Spring 也会配置这些类的对象。参见 7.8.1 Using AspectJ to dependency inject domain objects with Spring .

  • 您可以手动触发 Autowiring

    applicationContext.getAutowireCapableBeanFactory().autowireBean(...);
    

    当您无法控制需要 Autowiring 的对象(servlet 等)的创建时,此方法很有用。

关于java - 在运行时创建的对象中使用 Autowiring 的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10312092/

相关文章:

java - Android MapView - 扩展 OverlayItem 以存储用于在 onTap 中访问的 URL

java - OSGI 缺少需求错误

java - 您推荐哪种 Java CVS 客户端?

java - 带有自定义 UserDetailsS​​ervice 的 Spring Boot

java - Spring 4 - 对象不会 Autowiring 变量

Spring JUnit 测试 : Autowiring and Transaction Problems

java - 将 ImageView 传递给下一个 Activity

java - 如何确保 spring boot 中方法执行的原子性?

java - Spring 中的依赖注入(inject)

java - Spring - Autowiring 通用接口(interface)的通用实现