gpt4 book ai didi

java - 使用 Spring 3 注解实现一个简单的工厂模式

转载 作者:IT老高 更新时间:2023-10-28 13:03:47 24 4
gpt4 key购买 nike

我想知道如何使用 Spring 3 注释实现简单工厂模式。我在文档中看到您可以创建调用工厂类并运行工厂方法的 bean。我想知道这是否可能仅使用注释。

我有一个当前调用的 Controller

MyService myService = myServiceFactory.getMyService(test);
result = myService.checkStatus();

MyService 是一个接口(interface),其中包含一个名为 checkStatus() 的方法。

我的工厂类如下所示:

@Component
public class MyServiceFactory {

public static MyService getMyService(String service) {
MyService myService;

service = service.toLowerCase();

if (service.equals("one")) {
myService = new MyServiceOne();
} else if (service.equals("two")) {
myService = new MyServiceTwo();
} else if (service.equals("three")) {
myService = new MyServiceThree();
} else {
myService = new MyServiceDefault();
}

return myService;
}
}

MyServiceOne 类如下所示:

@Autowired
private LocationService locationService;

public boolean checkStatus() {
//do stuff
}

当我运行此代码时,locationService 变量始终为空。我相信这是因为我自己在工厂内创建对象并且没有进行 Autowiring 。有没有办法添加注释以使其正常工作?

谢谢

最佳答案

以下内容对我有用:

接口(interface)由逻辑方法和附加标识方法组成:

public interface MyService {
String getType();
void checkStatus();
}

一些实现:

@Component
public class MyServiceOne implements MyService {
@Override
public String getType() {
return "one";
}

@Override
public void checkStatus() {
// Your code
}
}

@Component
public class MyServiceTwo implements MyService {
@Override
public String getType() {
return "two";
}

@Override
public void checkStatus() {
// Your code
}
}

@Component
public class MyServiceThree implements MyService {
@Override
public String getType() {
return "three";
}

@Override
public void checkStatus() {
// Your code
}
}

工厂本身如下:

@Service
public class MyServiceFactory {

@Autowired
private List<MyService> services;

private static final Map<String, MyService> myServiceCache = new HashMap<>();

@PostConstruct
public void initMyServiceCache() {
for(MyService service : services) {
myServiceCache.put(service.getType(), service);
}
}

public static MyService getService(String type) {
MyService service = myServiceCache.get(type);
if(service == null) throw new RuntimeException("Unknown service type: " + type);
return service;
}
}

我发现这样的实现更简单、更简洁且可扩展性更强。添加新的 MyService 就像创建另一个实现相同接口(interface)的 spring bean 一样简单,而无需在其他地方进行任何更改。

关于java - 使用 Spring 3 注解实现一个简单的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6390810/

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