使用与不使用 Spring Beans 有什么区别?

what is the difference between using or not Spring Beans?

我可能会得到很多反对票,但是是否使用 bean 的所有这些事实让我很困惑。让我们假设这个例子

interface ICurrency {
       String getSymbol();
}


public class CurrencyProcessor {

    private ICurrency currency ;

    public CurrencyProcessor(ICurrency currency) {
        this.currency = currency;
    }

    public void doOperation(){
        String symbol = currency.getSymbol();
        System.out.println("Doing process with " + symbol + " currency");
        // Some process...
    }

}

因此,要注入 ICurrency impl 注入,我认为我可以通过两种方式完成:


方式 1:没有 Spring 个豆子

public class CurrencyOperator {

    private ICurrency currency ;
    private CurrencyProcessor processor;

    public void operateDefault(){
        currency = new USDollarCurrency();
        processor = new CurrencyProcessor(currency)
        this.processor.doOperation();
    }

}

其中 USDollarCurrency 是一个 ICurrency 接口实现


方式 2:使用 Spring bean

@ContextConfiguration(classes = CurrencyConfig.class)
public class CurrencyOperator {

    @Autowired private ICurrency currency ;
    @Autowired private CurrencyProcessor processor;

    public void operateDefault(){
        this.processor.doOperation();
    }

}

@Configuration
public class CurrencyConfig {

    @Bean
    public CurrencyProcessor currencyProcessor() {
        return new CurrencyProcessor(currency());
    }

    @Bean
    public ICurrency currency() {
        return new USDollarCurrency();
}

我真的不明白使用Spring的bean有什么好处。我读了一些东西,但我发现最多的是关于使用 DI 的好处,据我所知,这两种方式都注入了 CurrencyProcessor 需要的依赖性,正在改变的是我创建和使用对象的方式,我错了吗?所以具体来说,我的问题是: 1、这种情况下使用Bean有什么好处? 2. 为什么我应该使用 Spring 而不是像第一种方式那样手动操作? 3. 说到性能,这几种情况哪个更好?

没有 Spring 的示例不是依赖注入! 使用依赖注入,接口的实际实现是在外部代码本身确定的,以减少coupling

您应该能够需要另一种实现(例如,您可以从一个 JMS 客户端切换到另一个...)。

为了回答您的最后一个问题,使用 Spring 的性能(有一点点)较低但更加灵活。

编辑: Spring 不是唯一可用于 DI 的工具,但它是最受欢迎的并且包含很多功能。请注意,许多 Java 标准(例如 JPA)也使用 DI。

假设您有 2 个 DAO classes,一个用于 Oracle,第二个用于 MySQL,并且两个 classes 都实现了一个 DAO 接口。您在 Spring 配置文件中将实现定义为 bean。在业务class中你有一个DAO类型的属性,而在spring配置文件中你选择真实类型wheather Oracle或MySQL注入或使用spring注解@Autowired

这样可以减少耦合,并且可以轻松地从 Oracle 迁移到 MySQL。

@Service
public class Business {
    @Autowired
    private Dao daoImpl;

    //Business methods that invoks Dao methods 
}

在 Spring 配置文件(XML 文件)中使用以下内容:

<bean id="daoImpl" class="app.com.MySQLDaoImpl OR app.com.OracleDaoImpl"/>

只需更改您的 bean 的 class 属性,您就可以更改整个实现,而您的业务没有任何变化 class!
祝你好运。