IOC原型理论推导(代码解读)

  1. UserDao 接口

     package com.huisang.dao;
     ​
     ​
     public interface UserDao {
         void getUser();
     }

    此处只定义接口

  2. UserDaoImpl 实现类

    package com.huisang.dao;
     ​
     public class UserDaoImpl implements UserDao {
         @Override
         public void getUser() {
             System.out.println("默认获取用户的数据");
         }
     }

    该抽象实体的一种实现方法

  3. UserService 业务接口

     package com.huisang.service;
     ​
     ​
     public interface UserService {
         void getUser();
     }

    业务接口声明

  4. UserServiceImpl业务实现类

     package com.huisang.service;
     ​
     import com.huisang.dao.UserDao;
     import com.huisang.dao.UserDaoImpl;
     ​
     public class UserServiceImpl implements UserService {
         
         private UserDao userDao=new UserDaoImpl();
         @Override
         public void getUser() {
             userDao.getUser();
         }
     }

    通过业务层实现类去调用实体层实现类

    测试类:

    package com.huisang;
     ​
     import com.huisang.service.UserService;
     import com.huisang.service.UserServiceImpl;
     ​
     public class AppTest 
     {
         public static void main(String[] args) {
             //用户调用的是业务层,dao层它们不需要接触
             UserService userService=new UserServiceImpl();
             userService.getUser();
         }
     }

        测试结果截图:

我们可以思考一个问题,当我们想要去实现另外一种抽象实体的方法时,我们需要对业务层实现类进行更改,如实现一个以下方法

 package com.huisang.dao;
 ​
 public class UserDaoMysqlImpl implements UserDao {
     @Override
     public void getUser() {
         System.out.println("MySql获取用户数据");
     }
 }

这时候我们观察UserServiceImpl业务实现类,发现这一语句private UserDao userDao=new UserDaoImpl();将方法写死了,要想实现当前这个UserDaoMysqlImpl的方法,必须修改代码为private UserDao userDao=new UserDaoMysqlImpl();

这也就出现一个问题,我们要根据用户的需求去修改代码,显然在一个运行的项目中,这个操作是不可行的,而且如果需求很多岂不是程序员要不停的敲代码了?

当我们将UserServiceImpl业务实现类进行以下修改

 package com.huisang.service;
 ​
 import com.huisang.dao.UserDao;
 ​
 ​
 public class UserServiceImpl implements UserService {
     
     private UserDao userDao;
 ​
     //利用set进行动态实现值的注入!
     public void setUserDao(UserDao userDao) {
         this.userDao = userDao;
     }
     
     @Override
     public void getUser() {
         userDao.getUser();
     }
 }

这时我们发现,这个userDao的值不是直接赋值,而是需要进行set来设置值,我们再看测试类

 package com.huisang;
 ​
 import com.huisang.dao.UserDaoMysqlImpl;
 import com.huisang.service.UserService;
 import com.huisang.service.UserServiceImpl;
 ​
 public class AppTest 
 {
     public static void main(String[] args) {
         //用户调用的是业务层,dao层它们不需要接触
         UserService userService=new UserServiceImpl();
         ((UserServiceImpl)userService).setUserDao(new UserDaoMysqlImpl());//这里强转是因为setUserDao方法存在于UserServiceImpl中
         userService.getUser();
     }
 }

这时我们发现,从原来的用户需求改代码变成了当前的根据用户需求更改了实体类的实现

这就叫做控制反转!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值