通过访问修饰符禁止注入
Prohibit injection via access modifier
考虑立面
public interface LoggingFacade {
void log(String logMessage);
}
对应bean
public class LoggingBean implements LoggingFacade {
@Inject
private LoggingService loggingService;
@Override
public void log(String logMessage) {
loggingService.log(logMessage);
}
}
和
public class LoggingService {
public void log(String logMessage) {
// some logic and logging
}
}
它们都在同一个包裹里。我希望每个程序员都调用外观而不是直接调用服务(在其他包中)。所以我尝试向 LoggingService
.
添加一个受保护的构造函数
public class LoggingService {
protected LoggingService() {
}
public void log(String logMessage) {
// some logic and logging
}
}
遗憾的是,这并不禁止 LoggingService
在其他 类 中的使用(注入)。或者换句话说
public class MyClass {
@Inject
private LoggingService loggingService;
public void foo() {
loggingService.log("Hello");
}
}
有效。您知道如何禁止使用 LoggingService
以便每个用户都必须调用 LoggingFacade
吗?
只要您没有 Java 9 模块系统,就无法做到这一点。
使用 Java 9,您可以定义一个不导出 LoggingService 的单独模块。
考虑立面
public interface LoggingFacade {
void log(String logMessage);
}
对应bean
public class LoggingBean implements LoggingFacade {
@Inject
private LoggingService loggingService;
@Override
public void log(String logMessage) {
loggingService.log(logMessage);
}
}
和
public class LoggingService {
public void log(String logMessage) {
// some logic and logging
}
}
它们都在同一个包裹里。我希望每个程序员都调用外观而不是直接调用服务(在其他包中)。所以我尝试向 LoggingService
.
public class LoggingService {
protected LoggingService() {
}
public void log(String logMessage) {
// some logic and logging
}
}
遗憾的是,这并不禁止 LoggingService
在其他 类 中的使用(注入)。或者换句话说
public class MyClass {
@Inject
private LoggingService loggingService;
public void foo() {
loggingService.log("Hello");
}
}
有效。您知道如何禁止使用 LoggingService
以便每个用户都必须调用 LoggingFacade
吗?
只要您没有 Java 9 模块系统,就无法做到这一点。
使用 Java 9,您可以定义一个不导出 LoggingService 的单独模块。