Cri*_*riu 0 java maven-2 maven
我有这种依赖情况:
C( - >)B - > A - > C.
其中B-> C表示模块C在其pom.xml中与B有依赖关系.
好吧......我想在C中使用B中的一个类,所以我必须把C-> B但是我收到一个循环错误,你可以看到上面...
你看到任何解决方法吗?我不能在C中用B移动那个类,因为它已经使用了A中的一些类,并且会再次循环.
我试图在C中声明一个接口IAlfa并在B(Alfa)中实现它(但是当我想使用它时,我需要实例化如下:
IAlfa alfa = new Alfa()
Run Code Online (Sandbox Code Playgroud)
所以我需要从B导入Alfa.
你怎么看?
谢谢.
这不应该发生.我通常做的是这样的模块结构:
root
- api (interfaces, enums and custom exceptions only)
- impl (standard implementation of api -> dependency to api)
- server (runtime dependency to impl, compile time to api only)
- client (dependency to api only)
Run Code Online (Sandbox Code Playgroud)
假设我们Person在api模块中有一个接口.现在在impl模块中,你有一个类JpaPerson,因为impl使用JPA.但是,那些是客户端和服务器现在不需要的细节,因此您不应该(并且在我的设计中不能)new JpaPerson()在其中client或者中执行server.相反,你会有一个界面(也在内部api)被调用PersonFactory(当你谈论人时听起来很糟糕,或者说它更人性化),它有这样的方法:
public interface PersonFactory{
Person findPersonBySsn(String socialSecurityNumber);
List<Person> findPersonsByName(String firstName, String lastName);
List<Person> findPersonByBirthDate(Date birthDate);
Person createPerson(
String firstName, String lastName,
Date birthDate, String socialSecurityNumber
);
}
Run Code Online (Sandbox Code Playgroud)
同样,在impl模块中实现此接口,但仅将其作为接口引用到其他模块中.然后使用依赖注入将事物连接在一起(Spring,SEAM,EJB3,等等).
您提到的情况是代码执行超出其职责范围的结果(阅读关注点分离).
这种设计的最大优点是您可以api单独重构所有模块(除外),而无需更改其他模块中的代码.所以如果你想从jpa切换到经典的hibernate,你只需要编辑impl.如果要将服务器从轴切换到cxf,只需更改即可server.这使事情变得容易多了.当然,你没有获得循环依赖.
编辑:
一个简单(简单)的解决方案是引入一个模块d,它包含在a,b和c中作为依赖项.将所有常用代码移至d.(实际上将此d重命名为a和a,b,c重命名为b,c,d).