Spring是一种轻量级的架构,能够帮助我们更好地管理java类(Bean)之间的依赖关系,极大提高企业应用开发速率。我们可以使用MyEclipse自带的增加Spring Capacities工具来为项目增加Spring
功能。User Library里面需要有spring lib包下面的所有jar,以及一个名为common-logging的jar包(需要额外下载,web项目需要)。
使用Spring管理Bean
我们可以使用applicationContext.xml文件更好地,无浸入地管理Bean之间的关系。Spring把容器中的一切对象统称为Bean。
<bean id="chinese" class="com.cm.Chinese"> <property name="axe" ref="steelAxe"/> </bean> <bean id="steelAxe" class="com.cm.SteelAxe"> <property name="name" value="alvincccc"/> </bean>
这种配置方式能够使架构明白各个Bean之间的依存关系,在创建某个Bean之后,其他所需的所有bean都会被创建好。架构会通过反射根据bean元素中de类名创建一个java对象,放入Srping容器中。架构只要看到一个property元素,就会在底层执行一次set方法,如果是value则设值,如果是ref,则用容器中的bean设定,所以!当使用ref时注意顺序必须是容器中有的!
访问bean使用ApplicationContext这个接口,常用实现类有ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,第一个常用。
ApplicationContext ctx=newClassPathXmlApplicationContext(“beans.xml"); Chinese c=ctx.getBean("chinese",Person.class);
这样就得到实例了!
Spring的依赖注入
成员变量的值如果是一个对象,不是主动设置的,而是架构自动完成。如果是值,则直接自动set。注入方式分为设值注入跟构造注入。区别就是使用set还是构造器。PS:这里我们推荐使用面向接口编程。
由于xml中的耦合都是接口层次的,因此我们可以随意地改变实现类并重新配置xml,而无需对代码进行修改。例如:
<bean id="person" class="com.cm.Person"> <property name="axe" ref="stoneAxe"/> </bean> <bean id="stoneAxe" class="com.cm.StoneAxe"/>
而我们在person实现类中使用了stoneAxe中的方法,输出“石斧”。当我们不想要石斧了,只需要如下修改:
<bean id="person" class="com.cm.Person"> <property name="axe" ref="steelAxe"/> </bean> <bean id="steelAxe" class="com.cm.SteelAxe"/>
通过此例,面向接口编程与接口级别的松耦合的好处可见一斑!当然person中的成员变量应该是接口名,而不是具体的实现类名。
构造注入指的是通过构造器设置依赖关系的方式。由于bean元素默认spring使用无参数构造器创建对象,因此我们需要使用constructor-arg子元素来驱动spring来使用有参数构造器创建对象。在这种方式下,实例构建好了,依赖关系也完成了(而设置是,先有实例,然后再set)。这种方式下,对象类型的成员变量无需set方法,而是在构造其中指定。xml中,在bean下使用construcotr-arg ref来传入构造器中的参数,注意顺序数量。它还有个tpye元素用于指定参数类型。
两种方式对比:它们可以同时存在,没有绝对好坏。设置的更容易理解,关系直观,能应对复杂的依赖关系与成员变量可变的情况。构造的,可以在构造器中决定依赖关系的注入顺序,优先依赖优先注入。