【问题标题】:what is the difference between using or not Spring Beans?使用或不使用 Spring Beans 有什么区别?
【发布时间】:2015-04-29 03:08:02
【问题描述】:

我可能会得到很多反对意见,但我很困惑是否使用 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 bean

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. 在这种情况下使用 Beans 有什么好处? 2. 为什么我应该使用 Spring 而不是像第一种方式那样手动操作? 3. 谈性能,这几个案例哪个更好?

【问题讨论】:

  • “据我了解,两种方式都在注入 CurrencyProcessor 所需的依赖项” - 第一个代码以什么可能的方式注入它?是CurrencyProcessor 自己决定使用哪个ICurrency,因为它自己通知它。那里没有注入...您已将CurrencyProcessor 紧密耦合到USDollarCurrency
  • 此外,Spring Beans 不仅仅是依赖注入。 Spring 为您管理对象的整个生命周期。阅读this
  • 感谢您的回答。我不知道我是否正确,两个示例之间的区别在于我在哪里创建对象,对吗?因为我总是在决定我使用哪种 ICurrency,无论是使用 bean 还是在 CurrencyOperator 方法中实例化。我很困惑! :P

标签: java spring dependency-injection spring-4


【解决方案1】:

假设您有 2 个 DAO 类,一个用于 Oracle,另一个用于 MySQL,并且两个类都实现了 DAO 接口。您将实现定义为 Spring 配置文件中的 bean。在业务类中你有一个DAO类型的属性,而在spring配置文件中你选择真正的类型无论是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 的类属性,您就可以更改整个实现,而不会更改您的业务类!
祝你好运。

【讨论】:

  • 感谢您的回答。但是我不是在通过更改限定符注释来决定注入哪个 impl 吗?在做你所做的事情或手动注入我想要的新对象的新实例之间有什么变化?此外,就像你的方式一样,我会创建我不会使用的豆子?在这种情况下,我只使用 mySQLDao 或 oracleDao,但从不使用两者,我是对的吗?
  • 是的,你是对的,它不是一个优化的解决方案。我编辑了答案以完全满足您的需求。
【解决方案2】:

没有 Spring 的示例不会依赖注入! 通过依赖注入,接口的实际实现由代码本身外部确定,以减少coupling!

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

回答您的最后一个问题,使用 Spring 的性能(稍微)较低,但更灵活。

编辑: Spring 不是唯一可用于 DI 的工具,但它是最流行的,它包含很多特性。请注意,许多 Java 标准(例如 JPA)也使用 DI。

【讨论】:

  • Java 不包含很多 Spring 过去使用的东西。仍然值得学习 Spring 还是应该坚持使用 vanilla java?
  • @Poldie 你是对的。许多 Spring 方面都集成在 Java 标准中,因此您可能不需要 Spring。当您可以使用标准库做所有事情时,为什么还要包含另一个依赖项。尽管如此,Spring 包含如此多的特性,值得使用它。这取决于。
猜你喜欢
  • 2015-01-17
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多