Nếu bạn chưa có quá nhiều lựa chọn tôi sẽ đi theo cách này: (Chỉ cần làm ví dụ với cấu hình nhỏ hơn)
tùy chọn.yml:
optionA:
name: optionA
optionB:
name: optionB
Tôi tạo ra một lớp Option cho phần mở rộng:
public class Option {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Và hai lớp Lựa chọn nơi @ConfigurationProperties
đang nhận được thiết lập: (Còn bây giờ các lớp này là trống nhưng bạn phải cơ hội để cụ thể hơn về từng tùy chọn khác nhau)
@Component
@ConfigurationProperties(prefix ="optionA", locations = "classpath:options.yml")
public class OptionA extends Option{
}
@Component
@ConfigurationProperties(prefix ="optionB", locations = "classpath:options.yml")
public class OptionB extends Option{
}
Đối với các quyết định của các tùy chọn khác nhau tôi đã tạo một interface
:
public interface OptionService {
Option findOption(boolean businessLogic);
}
Và trong việc thực hiện tôi tiêm cả hai lựa chọn và thực hiện các logic kinh doanh: (một cách dễ dàng)
@Service
public class OptionServiceImpl implements OptionService {
private OptionA optionA;
private OptionB optionB;
@Override
public Option findOption(boolean businessLogic) {
if(businessLogic){
return getOptionA();
} else {
return getOptionB();
}
}
public OptionA getOptionA() {
return optionA;
}
@Autowired
public void setOptionA(OptionA optionA) {
this.optionA = optionA;
}
public OptionB getOptionB() {
return optionB;
}
@Autowired
public void setOptionB(OptionB optionB) {
this.optionB = optionB;
}
}
Và ở cuối bộ điều khiển, bạn chỉ cần gọi lớp OptionServiceImpl
và đánh lừa tùy chọn nào nên được sử dụng:
@Controller
public class YourController {
private OptionService optionServiceImpl;
@RequestMapping("/")
public String getIndex(){
Option option = getOptionServiceImpl().findOption(true);
System.out.println(option.getName());
option = getOptionServiceImpl().findOption(false);
System.out.println(option.getName());
return "Hello World";
}
public OptionService getOptionServiceImpl() {
return optionServiceImpl;
}
@Autowired
public void setOptionServiceImpl(OptionService optionServiceImpl) {
this.optionServiceImpl = optionServiceImpl;
}
}
Sản lượng System.out.println:
optionA
optionB
Vì vậy, logic kinh doanh của bạn để quyết định lựa chọn nên được sử dụng không phải là một nếu - khác xây dựng. Bạn có thể tạo ra các quy tắc cho sự phân chia trong giao diện và việc thực thi nó. Tôi nghĩ rằng bạn có thể tạo thêm quy tắc cho nhiều bộ điều khiển hơn.
Cảm ơn, điều này về cơ bản là những gì tôi đã thực hiện trước khi đăng bài, cảm thấy một chút hack với các lớp chú thích trống nhưng nó hoạt động vì vậy tôi sẽ không lãng phí thời gian nữa trên haha này – pquill