spring有几个关键字:轻量级框架,Ioc容器(控制反转),AOP(面向切面编程),对事物的支持,对框架的支持。
首先看ioc,视频中给了一个例子,(我也不知道这个和控制反转这4个字有什么关系):
首先是接口层,有一个接口。
package cn.sxt.dao;
public interface UserDao {
public void getUser();//不用管干啥,反正就是模拟获取用户的一个方法
}
然后是两个接口实现类。作用一样,只是一个模拟通过MySql获取用户数据,一个模拟通过Oracle获取用户数据。
MySQL获取用户数据
package cn.sxt.dao.impl;
import cn.sxt.dao.UserDao;
public class UserDaoMySqlImpl implements UserDao{
@Override
public void getUser() {
System.out.println("获取用户数据---MySql");
}
}
Oracle获取用户数据
package cn.sxt.dao.impl;
import cn.sxt.dao.UserDao;
public class UserDaoOracleImpl implements UserDao{
@Override
public void getUser() {
System.out.println("获取用户数据---Oracle");
}
}
然后是服务层接口
package cn.sxt.sevice;
public interface UserService {
public void getUser();
}
服务层接口实现类
package cn.sxt.sevice.impl;
import cn.sxt.dao.UserDao;
import cn.sxt.dao.impl.UserDaoMySqlImpl;
import cn.sxt.dao.impl.UserDaoOracleImpl;
import cn.sxt.sevice.UserService;
public class UserServicImpl implements UserService{
@Override
public void getUser() {
}
}
注意了,UserServiceImpl里面的getUser方法需要调用UserDao的getUser方法。比如,如果我们需要用MySql去获取用户数据,那么就要需要new一个UserDaoMySqlUmpl的对象,然后调用getUser方法。
public class UserServicImpl implements UserService{
private UserDao userDaoMySql=new UserDaoMySqlImpl();
@Override
public void getUser() {
userDaoMySql.getUser();
}
}
这样写是没有问题,但是如果需要用Oracle的方法获取用户数据呢?那么又需要去new一个UserDaoOracleImpl对象
public class UserServicImpl implements UserService{
private UserDao userDaoOracle=new UserDaoOracleImpl();
@Override
public void getUser() {
userDaoOracle.getUser();
}
}
这样就需要去程序内部去修改代码。如果需要有更多的方法去获取用户数据,那么就需要每次都需要修改源代码,很不方便,这种写法就违反了开闭原则(对修改关闭,对拓展开放)而且Servic类与Dao之间的耦合太高了。那么就需要解耦。首先修改一下UserServicImpl的代码
public class UserServicImpl implements UserService{
private UserDao userDao=null;//原来是在这里直接给userDao指定实现的是哪个类。现在先把NUll赋给userDao。
/**
* 新增一个setUserDao去给UserDao指定对象,这样的话UserServicImpl和UserDao就解耦了。
* @param userDao
*/
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
然后测试一下
public class test {
public static void main(String[] args) {
UserServicImpl userServic=new UserServicImpl();
userServic.setUserDao(new UserDaoOracleImpl());
userServic.getUser();
userServic.setUserDao(new UserDaoMySqlImpl());
}
}
测试结果
这个例子其实代码很简单,关键要理解为什么这么写,这么写有什么好处。代码改进后,从结果上来看好像和之前一样,但是改进后,把new对象这一把从源代码移到客户端。这样就有几个好处:
应用程序本身不创建对象了,现在只是被动地接收对象。
程序员可以不再关注对象的创建,而只需要关注业务的实现。
实现了Service与Dao的解耦。
方便拓展。