初识spring01 - 控制反转 IOC思想的体会

  • 如果要调用UserDaoMysqlImpl接口实现类,那么需要在UserServiceImpl这个业务接口实现类,改变private UserDao userDao= new UserDaoImpl();这句代码为private UserDao userDao= new UserDaoMysqlImpl();
  • 由于每一次调用不同的dao接口实现类,都要在业务接口实现类UserServiceImpl做出更改,很不方便,显得不灵通
  • 因此我们采用另一种方式【也就是类似IOC的原型思想?】用set来进行动态实现值的注入!使得程序不再具有主动性,它被动地接受对象
  • 这种思想从本质上解决了问题,程序员不需要再管理对象的创建,系统的耦合性大大降低~这是IOC的原型!
1.dao层
 1.1、UserDao接口
package com.lobster.dao;

public interface UserDao {
    void getUser();
}

 1.2、UserDaoImpl接口实现类

package com.lobster.dao;

public class UserDaoImpl implements UserDao{

    public void getUser() {
        System.out.println("默认获取用户的数据");
    }
}

 1.3、UserDaoMysqlImpl接口实现类

package com.lobster.dao;

public class UserDaoMysqlImpl implements  UserDao {
    public void getUser() {
        System.out.println("Mysql输出");
    }
}

2.service层
 2.1、UserService业务接口

package com.lobster.service;

public interface UserService {
    void getUser();
}

 2.2、UserServiceImpl业务接口实现类

package com.lobster.service;

import com.lobster.dao.UserDao;
import com.lobster.dao.UserDaoImpl;
import com.lobster.dao.UserDaoMysqlImpl;

public class UserServiceImpl implements UserService {

    private  UserDao userDao= new UserDaoImpl() ;

    public void getUser() {
        userDao.getUser();
    }
}

3.测试

import com.lobster.service.UserService;
import com.lobster.service.UserServiceImpl;

public class MyTest {


    public static void main(String[] args) {
        //用户实际调用的是业务层,不需要接触dao
        UserService userService = new UserServiceImpl();
        //打印输出的会是dao层
        userService.getUser();
    }

}

========================================
以IOC的思想来做,利用set动态实现值的注入
dao层的UserDao接口和两个接口实现类UserDaoImpl、UserDaoMysqlImpl以及UserService业务接口跟上面的一样不需改变,
只改变UserServiceImpl和测试类即可
UserServiceImpl业务接口实现类
package com.lobster.service;

import com.lobster.dao.UserDao;
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    //使用set动态实现值的注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void getUser() {
        userDao.getUser();

   }
}
测试
import com.lobster.dao.UserDaoImpl;
import com.lobster.service.UserService;
import com.lobster.service.UserServiceImpl;

public class MyTest {


    public static void main(String[] args) {
        //用户实际调用的是业务层,不需要接触dao
        UserService userService = new UserServiceImpl();

        ((UserServiceImpl) userService).setUserDao(new UserDaoImpl());
        //打印输出的会是dao层
        userService.getUser();
    }

}
================================
如果要调用的是UserDaoMysqlImpl,只需要在测试类中将**((UserServiceImpl) userService).setUserDao(new UserDaoImpl());**更改为((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());
**也就是说不需要再去动UserServiceImpl这个业务接口实现类,只需要在测试类中稍作改变即可!**
posted @ 2020-08-26 12:24  L小龙虾  阅读(123)  评论(0编辑  收藏  举报