Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使bean的成员可用于自动关联_Java_Spring_Autowired - Fatal编程技术网

Java 使bean的成员可用于自动关联

Java 使bean的成员可用于自动关联,java,spring,autowired,Java,Spring,Autowired,我可以让MultiProvider.getFoo()自动连接到foocummer构造函数中吗 没有使Foo本身成为bean(例如,因为Spring不应该破坏它,因为这是MultiProvider的责任) 并且不引入从foocummer到MultiProvider(或任何其他类)的依赖关系 Spring只能自动连接声明的bean,可能的解决方法如下: @Component class MultiProvider { public Foo getFoo(); public Bar

我可以让
MultiProvider.getFoo()
自动连接到
foocummer
构造函数中吗

  • 没有使
    Foo
    本身成为bean(例如,因为Spring不应该破坏它,因为这是
    MultiProvider的责任)
  • 并且不引入从
    foocummer
    MultiProvider
    (或任何其他类)的依赖关系

    • Spring只能自动连接声明的bean,可能的解决方法如下:

      @Component
      class MultiProvider {
          public Foo getFoo();
          public Bar getBar();
      }
      
      @Component
      class FooConsumer {
          FooConsumer(Foo f);
      }
      

      您只需在
      MultiProvider
      中通过
      @Bean

      @Component
      class FooConsumer {
          private final Foo foo;
      
          FooConsumer(MultiProvider multiProvider) {
              // MultiProvider will be autowired by spring - constructor injection
              this.foo = multiProvider.getFoo();
          }
      }
      
      @Component
      class MultiProvider {
          @Bean(destroyMethodName="cleanup")      // HERE IS THE TRICK
          public Foo getFoo();
          public Bar getBar();
      }
      
      @Component
      class FooConsumer {
          FooConsumer(Foo f);
      }
      
      如果问题源于spring无法正确销毁它,那么您可以在
      @Bean
      注释时声明的
      cleanup
      方法中包含逻辑

      @Component
      class FooConsumer {
          private final Foo foo;
      
          FooConsumer(MultiProvider multiProvider) {
              // MultiProvider will be autowired by spring - constructor injection
              this.foo = multiProvider.getFoo();
          }
      }
      
      @Component
      class MultiProvider {
          @Bean(destroyMethodName="cleanup")      // HERE IS THE TRICK
          public Foo getFoo();
          public Bar getBar();
      }
      
      @Component
      class FooConsumer {
          FooConsumer(Foo f);
      }
      

      请注意,@component和@configurable与 有些细微的差别,但在您的情况下,如果不这样做,您可以使用@component 我想改变它


      您可以将它们包括在
      配置中

      public class Foo {
          public void cleanup() {
              // destruction logic
          }
      }    
      

      不确定这是否违反了您的“非Bean本身”规则

      你为什么在课堂上使用@Bean?@Bean是@Mohammaddrezaalagheband oops的方法级注释,我的意思是组件如果不将Foo本身变成Bean,你的意思是什么?
      Autowire将只在Bean之间发生,当然你只能自动wire beanYes,但我的目的是不让FooConsumer依赖于MultiProvider。我要澄清的是,据我所知,这是不可能的,您只能自动连线bean,我不知道它是否相关,但您可以指定
      Foo
      作为bean,并使用
      destroy
      逻辑添加
      close()
      方法,以便spring能够正确地销毁它。然后你可以将它定义为一个bean并自动连接它——我已经重新编写了我的问题。我不希望Spring破坏Foo,因为这是多供应商的责任。然而,既然destroy无论如何都应该是幂等的(在我目前的观点中至少是:P),我只是学究,这就是我解决它的方法(但没有自定义的
      destroy方法名
      ),我重新编写了这个问题来扩展非beanrule