Spring是一种轻量级的架构,能够帮助我们更好地管理java类(Bean)之间的依赖关系,极大提高企业应用开发速率。我们可以使用MyEclipse自带的增加Spring Capacities工具来为项目增加Spring功能。User Library里面需要有spring lib包下面的所有jar,以及一个名为common-logging的jar包(需要额外下载,web项目需要)。


使用Spring管理Bean

我们可以使用ApplicationContext.xml文件更好地,无浸入地管理Bean之间的关系。Spring把容器中的一切对象统称为Bean。







这种配置方式能够使架构明白各个Bean之间的依存关系,在创建某个Bean之后,其他所需的所有bean都会被创建好。架构会通过反射机制根据bean元素中指定的实现类创建一个java对象,放入Srping容器中。架构只要看到一个property元素,就会在底层执行一次set方法,如果是value则设值,如果是ref,则用容器中的bean设定,所以!当使用ref时注意顺序必须是容器中有的!这就牵扯到一个bean的添加顺序问题。当bean的依赖关系过于复杂时,我们可以强制显式地设定依赖关系。

访问bean使用ApplicationContext这个接口,常用实现类有ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,第一个常用。第一个会在当前类家在路径下寻找xml文件,而第二个则会在整个文件系统寻找xml文件。

ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
Chinese c=ctx.getBean("chinese", Person.class);

这样就得到实例了!因为Spring推荐面向接口编程(当然这里没有使用接口),所以ctx中得到的实例要赋给一个接口实例,以达到最大限度的解耦。


Spring的依赖注入

成员变量的值如果是一个对象,不是主动设置的,而是架构自动完成。如果是值,则直接自动set方法。注入方式分为设值注入跟构造注入。区别就是使用setter还是构造器。PS:这里我们推荐使用面向接口编程。

由于xml中的耦合都是接口层次的,因此我们可以随意地改变实现类并重新配置xml,而无需对代码进行修改。例如:





而我们在person实现类中使用了stoneAxe中的方法,输出“石斧”。当我们不想要石斧了,只需要如下修改:




通过此例,面向接口编程与接口级别的松耦合的好处可见一斑!当然person中的实例变量应该是接口名,而不是具体的实现类名。

构造注入指的是通过构造器设置依赖关系的方式。由于bean元素默认spring使用无参数构造器创建对象,因此我们需要使用constructor-arg子元素来驱动spring来使用有参数构造器创建对象。在这种方式下,实例构建好了,依赖关系也完成了(而设置的方式是,先有实例,然后再set)。这种方式下,对象类型的成员变量无需set方法,而是在构造其中指定。xml中,在bean下使用construcotr-arg ref来传入构造器中的参数,注意顺序数量。它还有个tpye元素用于指定参数类型。

两种方式对比:它们可以同时存在,没有绝对好坏。设置的更容易理解,关系直观,能应对复杂的依赖关系与成员变量可变的情况。构造的,可以在构造器中决定依赖关系的注入顺序,优先依赖优先注入。