gpt4 book ai didi

java - 当Spring管理的bean和Pojo依赖相同的服务时如何避免Singleton

转载 作者:行者123 更新时间:2023-12-01 11:18:27 26 4
gpt4 key购买 nike

考虑到以下先决条件,我正在寻找单例模式的替代设计:

  • 有 Spring 托管 Bean 使用一些实用服务
  • 有 POJO 使用相同的实用服务
  • 服务的实现应该易于模拟/交换

JacksonMapper 实现 JsonStringConverter 接口(interface)。

POJO 是由 Builder 模式创建的一些自定义对象,如下例所示,它使用接口(interface) JsonStringConverter 的实现。

public class User {

private static final JsonStringConverter jsonStringConverter = JacksonMapper.getInstance();

private String name;
//...

private User (User builder) {

this.name = builder.name;
}

public String getName() {

return name;
}

public String toJson() {

Map<String, String> jsonMap = new LinkedHashMap<String, String>();

jsonMap.put(UserAtributes.NAME.getDescription(), this.name);

return jsonStringConverter.toJson(jsonMap);
}

public static class UserBuilder {

private String name;
//...


public UserBuilder name(String name) {

this.name = name;

return this;
}

public User build() {

return new User(this);
}
}
}

由于User的实例不是由Spring管理的,我无法使用@Autowire注释将JsonStringConverter的实现注入(inject)到User中。

另一方面,有 Spring 管理的 Bean,它们使用该接口(interface)的相同实现将其他一些映射转换为 Json 字符串。但是由于我已经在 Spring IOC 外部缓存了一个转换器的实例,而不是在 IOC 内部创建新对象只是为了注入(inject),所以我还使用 bean 中的 getInstance() 来轮询它。这是我根本不喜欢的部分。

这是有问题的单例:

public class JacksonMapper implements JsonStringConverter {

private static final ObjectMapper jsonToMap;
private static final ObjectMapper mapToJson;

private static final JacksonMapper INSTANCE;

static
{
INSTANCE = new JacksonMapper();
jsonToMap = new ObjectMapper();
mapToJson = new ObjectMapper();
}

/**
* Exists to defeat instantiation
*/
private JacksonMapper() {
// not called
}

public static JacksonMapper getInstance() {

return INSTANCE;
}

// methods...
}

我现在看到的选项:

  • 让 JsonStringConverter 成为具有静态方法的类,用于与 Json 之间的转换。 Spring 托管 bean 和 POJO 现在可以使用该实用程序类而不是 Singleton。

缺点:我更喜欢在 JsonStringConverter 和客户端代码之间使用显式接口(interface),以便进行模拟并轻松交换实现。

  • 使用单例模式

缺点:要求内存中存在不必要的对象来调用本来应该是静态的方法。

有人能为我指出针对上述情况的第三个合理选择吗?

请注意,当 Spring 托管 bean 和 POJO 都依赖于同一服务时,这是一般性问题,与此特定用例无关。

最佳答案

只需将您的单例注册为 Spring bean:

@Configuration
public class SingletonWrapperConfig {
@Bean
public JacksonMapper jacksonMapper() {
return JacksonMapper.getInstance();
}
}

请注意,在这种情况下,建议将 JacksonMapper 设为 enum 而不是普通类,作为“enum singleton”模式的一部分。

关于java - 当Spring管理的bean和Pojo依赖相同的服务时如何避免Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31523319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com