Java 如何在spring中在后期构造时自动关联此依赖项

Java 如何在spring中在后期构造时自动关联此依赖项,java,spring,spring-boot,dependency-inversion,Java,Spring,Spring Boot,Dependency Inversion,我在spring托管代码的@PostConstruct块中有以下代码 class A { private BoogleFeature boogle; @PostConstruct public void createBoggleClient() { SDKPersona.SDKPersonaBuilder sdkBuilder = new AppIdentifier.SDKPer

我在spring托管代码的
@PostConstruct
块中有以下代码


class A {

    private BoogleFeature boogle;

    @PostConstruct
        public void createBoggleClient() {
                SDKPersona.SDKPersonaBuilder sdkBuilder =
                        new AppIdentifier.SDKPersonaBuilder()
                                .setRegistryId(config.getRegistryId())
                                .setRegistrySecret(config.getRegistrySecret())
        
                boggle = new BoggleFeature(sdkBuilder.build());
        }
    }
}

现在我不想做一个
boggle=newbogglefeature(sdkBuilder.build())并将其设置为bean,并将其作为依赖项注入。我怎样才能做到这一点。

您是否尝试了下面的内容,您可以在come配置类中输入下面的代码

    @Bean(name="boggleFeature")
    public BoggleFeature createBoggleClient() {
        SDKPersona.SDKPersonaBuilder sdkBuilder =
            new AppIdentifier.SDKPersonaBuilder()
                .setRegistryId(config.getRegistryId())
                .setRegistrySecret(config.getRegistrySecret())
    
        return new BoggleFeature(sdkBuilder.build());
    }
       
    
然后,您可以在任何地方使用autowired

 @Autowired
    private BoogleFeature boogle

您可以使用
GenericApplicationContext
@PostConstruct
期间动态注册bean,方法如下:

@Component
public class BoogleFactory {

  @Autowired
  private GenericApplicationContext context;

  @PostConstruct
  public void createBoggleClient() {
    //build the sdk
    String sdk = "Boogle SDK";

    //then register the bean in spring context with constructor args
    context.registerBean(BoogleFeature.class,sdk);
  }

}
要动态注册的bean:

public class BoogleFeature {

  private String sdk;

  public BoogleFeature(String sdk) {
    this.sdk = sdk;
  }

  public String doBoogle() {
    return "Boogling with " + sdk;
  }
}
然后,您可以在应用程序中的任何位置使用:

@Component
class AClassUsingBoogleFeature {
   @Autowired
   BoogleFeature boogleFeature; //<-- this will have the sdk instantiated already
}

registerBean
有更强大的选项。

我们的想法是去掉新的关键字并将其作为依赖项注入,对吧您应该提到
@Bean
部分应该进入
@Configuration
类。一般来说,您应该解释代码是如何解决的problem@rkosegi,根据您的suggestion@station您必须执行一次,然后您可以使用if anywhere as Dependency无法撤消,这将如何删除my
new
关键字。如果你能举一个例子help@station我已经更新了我的答案以显示:1/如何使用构造函数ARGS注册bean---2/如何在其他任何地方使用bean---3/测试证明它是有效的。尝试了这个方法但没有成功,bean没有注册:(我已经测试过了,它可以正常工作。我使用的是Spring boot 2.4.3。请仔细检查每一步。
@SpringBootTest
public class BooglerTest {

  @Autowired
  BoogleFeature boogleFeature;

  @Test
  void boogleFeature_ShouldBeInstantiated() {
    assert "Boogling with Boogle SDK".equals(boogleFeature.doBoogle());
  }

}