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

时间:2015-02-26 16:23:58

标签: java spring dependency-injection spring-4

可能我会得到很多downvotes,但是对于我来说,无论是否使用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:没有春豆

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所需的依赖关系,改变的是我创建和使用objets的方式,我错了吗?所以具体来说,我的问题是: 1.在这种情况下使用Beans有什么好处? 2.为什么我要使用Spring而不是像第一种方式手动操作? 3.谈论性能,哪种情况更好?

2 个答案:

答案 0 :(得分:2)

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

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

要回答你的上一个问题,使用Spring(性能稍差)性能会更低,但更灵活。

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

答案 1 :(得分:2)

假设你有一个用于Oracle的2个DAO类,用于MySQL的seconde,并且这两个类都在实现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的类属性即可更改整个实现,而无需更改业务类!祝你好运。