java框架白话_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());

}

}

测试结果

69f3fe5a6af44d6a4925c70181f565c6.png

这个例子其实代码很简单,关键要理解为什么这么写,这么写有什么好处。代码改进后,从结果上来看好像和之前一样,但是改进后,把new对象这一把从源代码移到客户端。这样就有几个好处:

应用程序本身不创建对象了,现在只是被动地接收对象。

程序员可以不再关注对象的创建,而只需要关注业务的实现。

实现了Service与Dao的解耦。

方便拓展。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值