java框架学习日志-1

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的解耦。
  • 方便拓展。

猜你喜欢

转载自my.oschina.net/u/4000133/blog/2985986
今日推荐