Spring bean部分自动装配原型构造函数

11 浏览
0 Comments

Spring bean部分自动装配原型构造函数

我有一个类:

@Slf4j

@Component

@RequiredArgsConstructor(onConstructor = @__(@Autowired))

public class WebSocketRegistrar extends AbstractWebSocketHandler{

private final ApplicationContext context;

@Override

public void afterConnectionEstablished(WebSocketSession session) throws Exception {

// 这里有个问题。

context.getBean(WebSocketConsumer.class, session);

}

@Override

public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {

}

}

它尝试创建一个原型bean,其中一个参数是运行时参数,而其余参数我希望被注入。我需要它获取EventBus和一个函数。这两者都在上下文中可用,我可以解决这个问题。我正在努力理解如何在原型上进行部分构造函数自动装配。

@Component

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

@NoArgsConstructor

public class WebSocketConsumer implements Consumer> {

private WebSocketSession session;

private Function, String> jsonApi;

@Autowired

public WebSocketConsumer(WebSocketSession session, EventBus bus, BiFunction, String, String> toJsonApi) {

this.session = session;

this.jsonApi = identifiable -> toJsonApi.apply(identifiable,session.getHandshakeHeaders().get("Host").get(0));

bus.on(R(session.getUri().getPath() + "/?.*"),this::accept);

}

@Override

public void accept(Identifiable update) {

}

}

0
0 Comments

问题的原因:

根据回答中的内容,问题可能是在Spring中使用部分自动装配构造函数时遇到的。部分自动装配是指在创建bean时,Spring只自动装配一部分构造函数参数,而不是全部。这可能导致构造函数参数不完整,无法正确创建bean的实例。

解决方法:

为了解决这个问题,可以使用配置类来创建bean。在配置类中,可以手动创建bean的实例,并指定构造函数的参数。这样,就可以更好地控制构造函数参数,并根据需要在运行时更改参数的值。

以下是解决方法的示例代码:

public class TestConfiguration {
    @Bean("prototype")
    public SomePrototypeBean createBean(SingletonBean singletonBean){
        return new SomePrototypeBean(singletonBean, "TODO whatever you want here" );
    }
}

在这个示例代码中,`TestConfiguration` 是一个配置类,使用`@Bean` 注解创建一个名为 `prototype` 的bean。这个bean的构造函数有两个参数,一个是 `SingletonBean` 类型的参数 `singletonBean`,另一个是一个字符串参数,值为 "TODO whatever you want here"。你可以根据需要修改这些参数的值。

同时,还建议避免使用 `context.getBean` 方法,因为它可能会导致代码逻辑混乱。只有在框架的限制下,才使用 `context.getBean` 方法。

此外,还可以参考stackoverflow上的一篇文章,了解关于在Spring的Java配置中自动装配bean的更多细节。

最后,需要注意的是,如果有其他解决方案可用,应尽量避免使用部分自动装配构造函数。只有在框架的限制下,才考虑使用这种方式。

0