关于java:使用或不使用Spring Beans有什么区别?

what is the difference between using or not Spring Beans?

也许我会得到很多的反对票,但是对于我来说,是否使用bean这个事实实在是太令人困惑了。假设这个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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...
    }

}

因此,要注射iccurrency impl injection,我认为我可以通过两种方式来实现:

方式一:不含豆子

1
2
3
4
5
6
7
8
9
10
11
12
public class CurrencyOperator {

    private ICurrency currency ;
    private CurrencyProcessor processor;

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

}

其中usdollarcurrency是一个icurrency接口实现

方法二:使用春豆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@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'sBeans有什么好处。我读了一些东西,但我发现使用DI的好处,而且据我所知,这两种方法都注入了货币处理器所需的依赖性,我创建和使用objets的方式发生了什么变化,是不是我错了?所以具体来说,我的问题是:1。在这种情况下使用bean有什么好处?2。为什么我应该使用弹簧而不是像第一种方法那样手动操作?三。说到性能,哪种情况更好?


假设您有两个DAO类,一个用于Oracle,另一个用于MySQL,这两个类都在实现一个DAO接口。在Spring配置文件中将实现定义为bean。在业务类中,您有一个类型为DAO的属性,而在Spring配置文件中,您选择要注入的实际类型whather oracle或mysql,或者使用Spring注释@Autowired

这样就减少了耦合,很容易从Oracle迁移到MySQL。

1
2
3
4
5
6
7
@Service
public class Business {
    @Autowired
    private Dao daoImpl;

    //Business methods that invoks Dao methods
}

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

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

只需更改bean的类属性,就可以更改整个实现,而不必更改业务类!祝你好运。


没有Spring的例子不依赖于注入!通过依赖注入,接口的实际实现是在代码本身之外确定的,以减少耦合!

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

为了回答最后一个问题,使用弹簧(有一点)的性能要差一些,但要灵活得多。

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