相关疑难解决方法(0)

"编程到界面"是什么意思?

我已经看过几次提到这个,我不清楚这是什么意思.你何时以及为何会这样做?

我知道接口有什么作用,但事实上我不清楚这一点让我觉得我错过了正确使用它们.

如果你这样做是这样的:

IInterface classRef = new ObjectWhatever()
Run Code Online (Sandbox Code Playgroud)

你可以使用任何实现的类IInterface吗?你什么时候需要这样做?我唯一能想到的是,如果你有一个方法,你不确定除了实现之外将传递什么对象IInterface.我想不出你需要多久做一次.

另外,你怎么能写一个接受实现接口的对象的方法?那可能吗?

language-agnostic oop interface

791
推荐指数
17
解决办法
16万
查看次数

为什么在服务和dao层中总是有单个实现接口?

我已经/看过一些spring-hibernate Web应用程序项目,它们具有与实际服务和dao类一样多的接口.

我一直认为这两个是这些单一实现接口的主要原因:

  1. Spring可以将实际实现作为给定类中的依赖项连接(松散耦合)

    public class Person { 
        @Autowired 
        private Address address;
    
        @Autowired 
        private AccountDetail accountDetail;
    
        public Person(Address address, AccountDetail accountDetail) 
        { // constructor
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在进行单元测试时,我可以创建模拟类并单独测试类.

    Address mockedAddress = mock(Address);
    AccountDetail mockedAccountDetail = mock(AccountDetail);
    Person underTestPerson = new Person(mockedAddress, mockedAccountDetail); 
    // unit test follows
    
    Run Code Online (Sandbox Code Playgroud)

但是,最近,我意识到:

Spring可以将具体实现类连接为依赖项:

public class Person { 

@Autowired 
private AddressImpl address;

@Autowired 
private AccountDetailImpl accountDetail;

public Person(AddressImpl address, AccountDetailImpl accountDetail) { 
// constructor
Run Code Online (Sandbox Code Playgroud)

像EasyMock这样的模拟框架也可以模拟具体的类

AddressImpl mockedAddress = mock(AddressImpl);
AccountDetailImpl mockedAccountDetail = mock(AccountDetailImpl);
Person underTestPerson = new Person(mockedAddress, mockedAccountDetail); …
Run Code Online (Sandbox Code Playgroud)

java spring design-patterns domain-driven-design mocking

33
推荐指数
2
解决办法
7088
查看次数

弹簧和接口

我读到了关于Spring如何鼓励你在代码中使用接口的地方.我没有看到它.spring xml配置中没有接口的概念.Spring的哪一部分实际上鼓励您使用接口(除了文档)?

java spring

24
推荐指数
4
解决办法
3万
查看次数

所有 Spring beans 都是代理的吗?

我试图从高层次上了解 Spring 代理的工作原理。为什么我应该在应用程序中使用“API Interface & Impl Bean”模式或仅使用“Bean Class”模式。我读了很多 SO 答案,但它们都非常古老,我相信大多与Java 7 和 Spring 3.x相关。我想知道 2020 年Java 11+ 与 Spring 5.x (Spring Boot 2.x)仍然相关。有什么可以遵循的“最佳实践”吗?

另外,随着 的可用性@FunctionalInterface,如果我有实现像ConsumerFunction和类似接口的 bean,那么用where代替是否Predicate有意义。这只是一个例子,我也可能使用我自己的功能接口(带或不带泛型)。@Autowire/@Inject Consumer<A>FooFoo implements Consumer<A>

考虑到上述所有内容,我还想知道 Spring 创建的每个 bean 是否都被代理,或者如果实际上不需要的话,spring 创建 bean 时是否不代理它们。对于前。如果一个类只是简单地注释并@Component直接注入,没有其他注释或代理需求,spring还会为这个bean创建代理吗?

我已经看过的一些问题:

2020 年 5 月 7 日更新:

在阅读了更多文章、评论和答案后,我想谈谈我想到的确切问题/疑问。让我们考虑以下示例。我有一个课程FooAnotherFoo

@Component
@RequiredArgsConstructor  // From lombok
class …
Run Code Online (Sandbox Code Playgroud)

java spring spring-aop spring-boot

5
推荐指数
1
解决办法
3366
查看次数