警告:我意识到这可能是滥用spring bean和/或Java 8的默认接口方法背后的意图.我正在寻找的是具体而合理的批评,为什么这可能是一种我不能认识到的不安全的方法.
我已经定义了一个类,它允许我静态访问正在运行的应用程序上下文:
@Component
public class BeanAccessor implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static T getSingleton(Class clazz){
return applicationContext.getBean(clazz);
}
public static T getSingleton(String beanName, Class clazz){
return applicationContext.getBean(beanName, clazz);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
BeanAccessor.applicationContext = applicationContext;
}
}
然后,我可以在默认接口方法中使用这些BeanAccessor方法,以便从方法内部访问spring托管bean.
我意识到这个功能可以通过实现其他类和服务来实现,而不是觉得需要将它混合到当前的类中(至少对于下面的例子,我实际上并没有用’this’做任何事情).这部分是“艺术”偏好,我相信我会继续寻找其他用例.
这是一个示例用法:
public interface ClientAware {
String TENANT_NAME = "TENANT_NAME";
default ClientDetails clientDetails() {
ClientDetailsService service = BeanAccessor.getSingleton(ClientDetailsService.class);
return service.loadClientByClientId(SecurityUtil.getClientId());
}
default Map clientInfo() {
return clientDetails().getAdditionalInformation();
}
default String tenant() {
return (String) clientInfo().get(TENANT_NAME);
}
}
然后我的实际类使用接口(和另一个类似的东西,将元信息添加到响应):
@RestController
@RequestMapping("/documents")
public class Documents implements WrapAware, ClientAware {
@Autowired
private DocumentService docService;
@RequestMapping(method = RequestMethod.GET)
public Object byPathAndTenant(@RequestParam("path") String path) {
return ok(docService.getDocumentsByPathAndTenant(path, tenant()));
}
}
请注意,它确实适当地解析了bean,似乎工作正常.在我开始使用这样的模式之前,我想知道风险.