Spring 春天 给软件行业带来了春天
理念:使现有技术更加实用。本身是个大杂烩,整合现有的框架技术。
Spring的优点:
- 本身是个轻量级框架
- IOC容器——控制反转 核心
- AOP——面向切面编程 核心
- 对事务的支持
- 对框架的支持
主要内容:
Spring的核心就是IOC容器(图中第三层Core Container 核心容器)和AOP
IOC:inversion of control 控制反转 一种解耦的思想
下面举个例子进行对比来了解这个思想
以前的方式:
UserDao层:
package cn.sxt.dao;
public interface UserDao {
public void getUser();
}
package cn.sxt.dao.impl;
import cn.sxt.dao.UserDao;
public class UserDaoMysqlImpl implements UserDao{
@Override
public void getUser() {
System.out.println("Mysql获取用户数据");
}
}
package cn.sxt.dao.impl;
import cn.sxt.dao.UserDao;
public class UserDaoOracleImpl implements UserDao{
@Override
public void getUser() {
System.out.println("Oracle获取数据");
}
}
service层
package cn.sxt.service;
public interface UserService {
public void getUser();
}
package cn.sxt.service.impl;
import cn.sxt.dao.UserDao;
import cn.sxt.dao.impl.UserDaoMysqlImpl;
import cn.sxt.service.UserService;
public class UserServiceImpl implements UserService{
private UserDao userDao=new UserDaoMysqlImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
这个是我们以前的方式,我们自己创建对象,service层里面
private UserDao userDao=new UserDaoMysqlImpl();
这就带来了一个坏处,比如随着业务量的增大,我们要把Mysql换成Oracle,那么所有用到Mysql的地方都要换成Oracle,那就完了,这种设计的耦合性太高了。我们用面向接口编程的目的就是为了降低耦合性,而这将我们的目的跑偏了。
那怎么改呢?
service层修改
package cn.sxt.service.impl;
import cn.sxt.dao.UserDao;
import cn.sxt.dao.impl.UserDaoMysqlImpl;
import cn.sxt.service.UserService;
public class UserServiceImpl implements UserService{
private UserDao userDao=null;
public void setUserDao(UserDao userDao){
this.userDao=userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
测试
package cn.sxt.test;
import cn.sxt.dao.impl.UserDaoMysqlImpl;
import cn.sxt.dao.impl.UserDaoOracleImpl;
import cn.sxt.service.impl.UserServiceImpl;
public class Test {
public static void main(String[] args) {
UserServiceImpl userService=new UserServiceImpl();
userService.setUserDao(new UserDaoMysqlImpl());
userService.getUser();
System.out.println("----------------------");
userService.setUserDao(new UserDaoOracleImpl());
userService.getUser();
}
}
改过以后看上去还是自己创建对象,但是其实已经发生了根本性的变化,
原来是应用程序来创建对象,现在是给客户端来创建,不用修改源码。这种方法是我们手动new放进去,那么有没有一种方法让程序自己本身创建对象放进去。比如Struts2那个Action客户端并没有创建,是Struts2本身为我们创建的。同样的道理,这里我们也是创建对象,我 们有没有办法把它封装到一个配置文件,我们通过读取这个配置文件创建对象。这就完成了一件伟大的事情,原来对象是应用程序本身来创建的,现在应用程序根本不需要管具体实现,哪个对象我们也不需要管,对象外面去给他,在合适的时机给一个对象就ok了,对象怎么创建也不用管,程序员不用再关心具体的对象,可以更关注业务。修改后的案例其实就是IOC的原型。
优点:
- 对象的创建不用应用程序本身来创建,应用程序本身原来是主动去创建对象,现在是被动地接受这个对象
- 程序员主要的精力集中于业务的实现
- 实现了Dao层和Service层的解耦。Service层和Dao层实现了分离。没有直接依赖关系,通过上面修改前的案例可以看出,Service需要导入Dao层的类,所以存在依赖关系。
- 如果Dao的实现发生改变,应用程序本身不用改变。