当系统规模变大,业务逻辑复杂,此时使用面向对象编程拓展业务变得不易,因此我们找到其他方法来提高系统灵活性,Spring框架就是一个不错的选择。
那么它究竟如何实现的呢?
spring框架中一个组件化思想,它的目的是解耦和,实现每个组件只专注组件内部的事。通过定义接口,运行注入对象,强制将组件的构建和使用分开。这样就涉及spring使用时的一个重要概念——依赖注入。
什么是依赖注入:由容器维护程序之间的关系(程序中不需要使用 new 关键字,直接在容器中定义组件之间的关系)
下面以“Hello Spring”的代码为例,说明如何使用依赖注入。
创建web工程MySpring,添加需要的包,这里使用的是MyEclipse,可以通过该工具导包。点击项目,选择MyEclipse-->add Spring Capabilities-->Spring 3.0,这里并没有什么特殊的功能要求,选择 核心包(Core Libraries)就可以了,后面会和Struts集成,所以还选择了Web Libraries这个包。(也选择了将包Copy到lib目录下)这里是第一次使用,只能选择new一个配置文件,然后next-->finish即可,具体过程,见图,如下:
然后在src下就会创建applicationContext.xml文件,这个配置文件可以写多个,文件名可以任意取,在这里定义各个组件之间的关系,实现依赖注入。
Spring强调组件编程,这里的组件可以看做接口,由接口实现类来实现组件。首先定义一个Action接口,
public interface Action {
public void execute();
}
再定义其实现类 HelloActionImpl,
public class HelloActionImpl implements Action{
@Override
public void execute() {
// TODO Auto-generated method stub
System.out.println("hello spring!");
}
}
新建一个TestAction是测试类,这里如果要输出
"hello spring!"
,之前的做法是在这里的main方法中,直接new
HelloActionImpl
对象,然后调用
execute
方法,而在spring则是在
applicationContext.xml
进行定义。代码如下:
<bean id="helloAction" class="com.huaxin.spring.HelloActionImpl">
一个bean节点,代表就是action类的实例,ID属性和class,id代表对象名称,class里面填写实现类的完整路径,整个bean节点的定义就等价于
Action helloAction=new com.huaxin.spring.HelloActionImpl() ;
在容器中定义后,一旦解析配置文件,就会根据id设置对象名,class设置实例,去指定对象,如何将实例返回测试类中呢?
在测试类TestAction文件中,代码如下:
public static void main(String[] args) {
// 读取配置文件(此时会将bean节点实例装载至内存,可以识别ID对应的实例)
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//根据ID返回容器中的bean节点(类实例)
Action action=(Action)context.getBean("helloAction");
action.execute();
}
这里ApplicationContext 是一个接口,在构造方法中可以指定配置文件的路径,然后通过
getBean
获取配置文件中的bean节点,运行后即可输出"hello spring!"
。
这里只是简单使用spring,但似乎并为给程序带来便利。那么假设现在有新的业务类需要实现,不仅要打招呼,还要有笑脸,将其定义为NewHelloActionImpl,同样实现Action接口。它的execute方法中的输出语句为:
System.out.println("(*^__^*) 嘻嘻…… HelloAction!");
如果我们要替换旧的业务,使用新的业务,就需要修改Java代码,new新的对象。那么问题来了,如果在一个庞大的系统中,旧的业务使用有很多处,那么就要多次修改,但是使用spring之后就可以避免这种情况,这里Java代码不需要修改,只要修改配置文件bean节点对应的
class即可,修改代码如下
<span style="font-size:18px;"><bean id="helloAction" class="com.huaxin.spring.NewHelloActionImpl"></span>
这样就可以了,十分方便。可见使用spring的扩展性更高。