其实标题中如此高大上的名词,只是一个问题,关于在Spring的applicationContext.xml中的如下语句是什么意思?
<property name="aService" ref="aService"/>
这类语句在SSH的配置中会大量存在,因为Spring所谓的核心机制就是Spring依赖注入IOC。下面举一个例子说明这个问题:
先贴上目录结构:
在Eclipse中新建一个Java工程,不是JavaWeb,在这个Java配置好Spring3.0.5,这个在《【Spring】Spring3.0.5的下载、配置与Helloworld》(点击打开链接)已经说过了,这里不再赘述,然后先在src文件夹中新建一个applicationContext.xml,里面的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 指明A.java中的aService类,来自service包下AService.java --> <!-- A.java中就无须AService aService=new AService();这条语句了 --> <bean id="aJava" class="A"> <property name="aService" ref="aService"/> </bean> <bean id="aService" class="service.AService"/> </beans>
然后src新建一个A.java,里面的内容的如下:
import service.*; public class A { private AService aService; public void setaService(AService aService) { this.aService = aService; } public void print() { System.out.println("A.java在是用AService的print()方法:" + aService.print()); } }
之后,在src中新建一个service包,在service里面新建一个AService.java,代码如下:
package service; public class AService { public String print() { return "呵呵"; } }
之后再于src包里面新建一个SpringTest.java,这个java将包含主函数,是程序的入口,里面的代码如下:
import org.springframework.context.*; import org.springframework.context.support.*; public class SpringTest { public static void main(String[] args) { //初始化Spring ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); //为这个SpringTest.java注入A.java这个类, A a=applicationContext.getBean("aJava",A.class); //注入之后可以直接使用A这个类 a.print(); } }
这样就可以运行了,运行结果如下:
那么,上面这个程序到底是在说明什么问题呢?就是在说,因为Spring依赖注入IOC的设值注入setter还有Spring自身的特性,以致于整个工程没有一个new语句,方便简单,符合架构设计的规范。因为其下有如下的传值的过程:
非常显然的是,这里当然可以用一句简简单单的System.out.println语句完成,即使要用类,也可以用import与static等语句。不过Spring在JavaWeb工程中,大量的Hibernate语句与数据库查询方法,Struts的Action方法,能够把将其管理起来。
假设上面的A.java是关于Struts2的Action的java文件,AService.JAVA是Hibernate的数据库业务类。那么,你可能不会觉得Spring是在呵呵了。