栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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();
     }
 }

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

这就叫做控制反转!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/571275.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号