最近在对Spring进行研究,Spring是一个轻量级的容器框架,对于Spring的基本定位就是"可有可无",如何进行解释呢,比如对于SSH框架来说,Spring的出现就是为了辅助Hibernate和Struts2更好的发挥其作用,对于其特性我们稍后再进行介绍,本次我们只是通过一个简单的demo来分析一下,既然"可有可无",为何我们还要使用呢?
对于项目,我们只需要建立一个Java项目来描述我们想要过程即可,他和Web并没有什么关系。我们通过分层来表述想要的思想,通过建立两个数据库,来实现客户端的调用。
先看未使用Spring之前的实现过程:
通过Clinet调用服务端,通过服务端调用实现层。Client->Manager->Dao简单的一个过程,我们实现的就是使用Mysql或者Oracle来完成客户端的调用,数据库之间转换的一个过程。
Client端代码:
public class Client {
public static void main(String[] args) {
// 由我们的应用程序负责服务(对象)定位
UserManager userManager = new UserManagerImpl();
// 直接对添加方法赋值
userManager.addUser("张三", "123");
}
}
Manager实现类和接口类:
public class UserManagerImpl implements UserManager {
public void addUser(String username, String password) {
// 由我们的应用程序负责服务(对象)定位
// UserDao userDao=new UserDao4MySqlImpl();
UserDao userDao = new UserDao4OracleImpl();
userDao.addUser(username, password);
}
}
public interface UserManager {
// 接口,从实现获取具体信息
public void addUser(String username, String password);
}
D层接口和两个实现类:
public interface UserDao {
// 添加用户的方法
public void addUser(String username, String password);
}
public class UserDao4MySqlImpl implements UserDao {
// Mysql的一个测试实现
public void addUser(String username, String password) {
System.out.println("UserDao4MySqlImpl.addUser()");
}
}
public class UserDao4OracleImpl implements UserDao {
// Oracle的测试实现
public void addUser(String username, String password) {
System.out.println("UserDao4OracleImpl.addUser()");
}
}
简单的三层方法,如果我们想将Mysql更换成Oracle,就必须修改Manager实现层的调用,才能满足需求。庆幸的是我们是基于接口编程的,我们随时可以更换实现方法。
通过上部分代码我们可以分析道,我需要使用什么数据库,都是需要穷主观上去控制的,比如我使用Mysql,那么我就必须要手动修改Manager来更换。那么该如何避免更改代码,且减轻“自己”的负担呢?通过Spring则可以达到我们想要的需求。
我们只需要把对象以及对象之间的依赖关系全权交给Spring即可。它负责查对象,然后再注入给你,这就是IOC容器的依赖注入的过程,所有的过程都依赖反正SPring来给你负责,你只负责最终结果就好。
加入Spring,我们可以分几步进行:
1、Spring的依赖包配置
- 用来记录日志:../dist/log4j-1.2.14.jar
- Spring核心包:../lib/spring.jar
- 通用日志/日志的抽象(辅助log4j记录日志,支持log4j日志器):../lib/jakarta-commons/commons-logging.jar
2、提供spring配置文件applicationContext.xml(核心)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="userDao4Mysql" class="com.bjpowernode.spring.dao.UserDao4MySqlImpl"></bean>
<bean id="userDao4Oracle" class="com.bjpowernode.spring.dao.UserDao4OracleImpl"></bean>
<bean id="userManager" class="cpm.bjpowernode.spring.manager.UserManagerImpl">
<!-- 构造函数作用 -->
<!-- <constructor-arg ref="userDao4Mysql" /> -->
<constructor-arg ref="userDao4Oracle" />
</bean>
</beans>
3、提供log4j.properties配置文件
4、在userManager中提供构造函数,让spring将UserDao实现注入(DI)过来
public class UserManagerImpl implements UserManager {
// 定义成员变量
private UserDao userDao;
// 生成构造方法赋值
public UserManagerImpl(UserDao userDao) {
this.userDao = userDao;
}
public void addUser(String username, String password) {
userDao.addUser(username, password);
}
}
5、让spring管理我们对象的创建和依赖,必须将依赖关系配置到Spring配置文件中。
6、最后看一下我们客户端的调用
public static void main(String[] args) {
/* 通过BeanFactory来自动解析我们的配置文件 */
BeanFactory factory = new ClassPathXmlApplicationContext(
"applicationContext.xml");
/* 通过getBean来获取对象 */
UserManager userManager = (UserManager) factory.getBean("userManager");
userManager.addUser("张三", "123");
}
温馨提示:记得将Jar包引入咱们的项目中 啊,之前的一步只是将我们需要的三个jar包存入了一个自定义的包内,剩下的就是引入我们的项目中了,右键项目->properties->Java Build Path
最后我们来分析一下,使用Spring优势体现在哪里?
- 1、大量减少了Factory和SingleTon的数量,代码层次会清楚,使代码层次更加清晰;
- 2、主要原因是我们不在查找,定位,创建和管理对象之间的关系了,都可以全权的交给IoC容器。
- 3、Spring是一个轻量级的一个框架,相关的类没有继承,也没有实现它的任何一个接口,所以我们完全可以随时将Spring摒弃掉。