我应用程序中充斥着大量的singleton,用程序的方式实现singleton显得麻烦费事。Spring可以帮我们很方便的统一管理这些东西。当然,Spring的功能远远不止这些。
Spring的功能如下:
IOC容器(核心功能),控制反转,实现方式为DI注入。
AOP
事务管理
现在我们开始学习Spring的第一步吧。
本例功能是这样的,做一个公共接口UserDao定义了一个save的方法,他的实现类有两个UserDao4Mysql,UserDao4Oracle,当调用UserDao4Mysql的save方法打印“save user 4 mysql!”,当调用UserDao4Oracle的save方法则打印“save user 4 oracle!”。所以我们大可以将一个具体的子类对象注入给UserDao接口,当以后需求要更换的时候,在配置文件里直接修改就行了。
项目结构如图:
1、新建Web project项目
2、创建User Library,加入如下jar,spring依赖库
* SPRING_HOME/dist/spring.jar
* SPRING_HOME/lib/jakarta-commons/commons-logging.jar
* SPRING_HOME/lib/log4j/log4j-1.2.14.jar
3、拷贝log4j配置文件到src下
4、写相应的DAO
UserDao接口
UserDao4Mysql类
UserDao4Oracle类
5、写相应的BO(要注入的属性需提供构造函数或者setter)
UserService接口
UserServiceImpl类
public void save() {
userDao.save();
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
6、配置applicationContext.xml,让Spring的IOC进行管理我们的对象,默认为singleton,当一个对象有状态的时候,可以设置scope="prototype"
<bean id="userDao4Mysql" class="com.test.dao.impl.UserDao4Mysql" />
<bean id="userDao4Oracle" class="com.test.dao.impl.UserDao4Oracle" />
<bean id="userServiceImpl" class="com.test.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao4Oracle" />
</bean>
</beans>
当以后需求变化的时候,我们UserService的save方法想换为mysql的话,可以将<property name="userDao" ref="userDao4Oracle" />的ref改为userDao4Mysql
7、编写测试类
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService)factory.getBean("userServiceImpl");
userService.save();
}
}