一、为什么要使用spring
这里我们通过一个示例进行说明(工程pring_whyspring
)
首先我们完成dao层:
UserDao.java
package com.bjsxt.spring.dao;
public interface UserDao {
public void save(String username, String password);
}
而dao层有两种实现,一种是MySQL实现,一种是Orecla实现。
UserDao4MySqlImpl.java
package com.bjsxt.spring.dao;
public class UserDao4MySqlImpl implements UserDao {
public void save(String username, String password) {
System.out.println("--------UserDao4MySqlImpl.save()-------");
}
}
UserDao4OracleImpl.java
package com.bjsxt.spring.dao;
public class UserDao4OracleImpl implements UserDao {
public void save(String username, String password) {
System.out.println("--------UserDao4MySqlImpl.save()-------");
}
}
在看业务层:
UserManager.java
package com.bjsxt.spring.manager;
public interface UserManager {
public void save(String username, String password);
}
实现:
UserManagerImpl.java
package com.bjsxt.spring.manager;
import com.bjsxt.spring.dao.UserDao;
public class UserManagerImpl implements UserManager {
private UserDao userDao;
public UserManagerImpl(UserDao userDao) {
this.userDao = userDao;
}
public void save(String username, String password) {
this.userDao.save(username, password);
}
}
使用一个用例进行测试:
Client.java
package com.bjsxt.spring.client;
import com.bjsxt.spring.dao.UserDao4MySqlImpl;
import com.bjsxt.spring.dao.UserDao4OracleImpl;
import com.bjsxt.spring.manager.UserManager;
import com.bjsxt.spring.manager.UserManagerImpl;
public class Client {
public static void main(String[] args) {
//UserManager userManager = new UserManagerImpl(new UserDao4OracleImpl());
UserManager userManager = new UserManagerImpl(new UserDao4MySqlImpl());
userManager.save("张三", "123");
}
}
说明:在使用的时候上面我们选择了使用MySQL数据库,那么我们在实例化业务对象的时候就要将MySQL的dao层实现传递进去。那如果我们如果要使用Oracle数据库,那么就要将Orecla的dao层实现传递进去,这就需要改动业务类。这里就会有一个问题,如果当我们的数据库系统较多,同时数据库的相关依赖很多的时候,如果我们想在不同的数据库之间进行切换,那么需要改动的地方就会很多,也就是系统的移植性很差。下面我们将这个工程使用spring进行改造。
二、spring入门
下面我们对上面的例子使用spring进行改造(工程spring_beginning
)
1.这里我们使用spring2,首先导入或引入相关的jar包,这里我们只导入三个包:
核心包:SPRING_HOME/dist/spring.jar
日志依赖包:SPRING_HOME/lib/jakarta-commons/commons-logging.jar
、SPRING_HOME/lib/log4j/log4j-1.2.14.jar
2.拷贝spring的配置文件
applicationContext.xml
到src下
<?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="userDao4MySqlImpl" class="com.bjsxt.spring.dao.UserDao4MySqlImpl"/>
<bean id="userDao4OracleImpl" class="com.bjsxt.spring.dao.UserDao4OracleImpl"/>
<bean id="userManager" class="com.bjsxt.spring.manager.UserManagerImpl">
<!-- 构造方法注入
<constructor-arg ref="userDao4OracleImpl"/>
-->
<property name="userDao" ref="userDao4OracleImpl"/>
</bean>
</beans>
3.拷贝log4j配置文件到src下
4.在UserManagerImpl中提供构造函数或setter方法,spring将实例化好的UserDao实现注入给我们
package com.bjsxt.spring.manager;
import com.bjsxt.spring.dao.UserDao;
public class UserManagerImpl implements UserManager {
private UserDao userDao;
/*public UserManagerImpl(UserDao userDao) {
this.userDao = userDao;
}*/
public void save(String username, String password) {
this.userDao.save(username, password);
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
5.让spring管理我们的对象创建和依赖,必须在spring配置中进行定义
````<bean id="userDao4MySqlImpl" class="com.bjsxt.spring.dao.UserDao4MySqlImpl"/>```
同时在使用构造方法和settter方法时的配置是不一样的。这里相关的配置我们在上面已经给出了。6.编写客户端
Client.java
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager userManager = (UserManager) factory.getBean("userManager");
userManager.save("张三", "123");
说明:
- 1.对于业务层,我们需要相关的dao层支持,这里将业务类UserManagerImpl交给spring进行管理,而我们在配置文件中配置了业务层需要dao层的支持,同时在类中提供了相关的setter方法,那么spring会将相关的dao实现实例化之后注入给业务层。
- 2.对于上面的注入dao层实现,那么dao层实现也必须交给spring进行管理,于是我们也需要配置。
- 3.对于业务层需要用到哪个dao层实现则只需要在配置文件中注明即可。
- 4.在使用的时候我们首先读取配置文件,然后直接找spring获取业务实现即可。
spring IOC容器注入的关键点:
- 必须将被管理的对象定义到spring配置文件中
- 必须定义构造函数或setter方法,让spring将对象注入过来
最后:这里我们发现使用spring进行管理非常方便,同时项目变动需要改动的东西也不多。当然这里是使用的配置文件,我们也可以使用注解进行配置。