spring框架学习二(IOC)

IOC的理论推导

导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.0.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>

</dependencies>

在我们之前的代码中,我们需要根据用户的需求去修改代码,如果程序十分庞大,修改起来会比较麻烦,修改一次的成本就十分昂贵

1.userDao接口

package com.yms.dao;

/**
 * @Author 杨明书
 * @PackageName: com.yms.dao
 * @ClassName: UserDao
 * @Description:
 * @Date: 2021/12/29 10:09
 */
public interface UserDao {
    void getUser();

}

2.userDaoImpl实现类

package com.yms.dao.impl;

import com.yms.dao.UserDao;

/**
 * @Author 杨明书
 * @PackageName: com.yms.dao.impl
 * @ClassName: UserDaoImpl
 * @Description:
 * @Date: 2021/12/29 10:10
 */
public class UserDaoImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("默认获取用户的数据");
    }
}

3.userService业务接口

package com.yms.service;

/**
 * @Author 杨明书
 * @PackageName: com.yms.service
 * @ClassName: UserService
 * @Description:
 * @Date: 2021/12/29 10:12
 */
public interface UserService {

    void  getUser();
}

4.userServiceImpl业务实现类

package com.yms.service.impl;

import com.yms.dao.UserDao;
import com.yms.dao.impl.UserDaoImpl;
import com.yms.service.UserService;

/**
 * @Author 杨明书
 * @PackageName: com.yms.service.impl
 * @ClassName: UserServiceImpl
 * @Description:
 * @Date: 2021/12/29 10:13
 */
public class UserServiceImpl implements UserService {
    /**
     * 程序控制对象,存在的弊端,使用一次就要去换取一次对象,代码冗余
     */
//    private  UserDao userDao=new UserDaoImpl();
    /**
     * 解决方案,使用set注入,是的每个用户拿到的数据都是一样的
     *
     */
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void getUser() {
        System.out.println("这是一个service实现类");
        userDao.getUser();

    }
}

5.测试类

import com.yms.dao.impl.UserDaoImpl;
import com.yms.dao.impl.UserDaoMysql;
import com.yms.dao.impl.UserDaoOracle;
import com.yms.service.UserService;
import com.yms.service.impl.UserServiceImpl;

/**
 * @Author 杨明书
 * @PackageName: PACKAGE_NAME
 * @ClassName: MyTest
 * @Description:
 * @Date: 2021/12/29 10:16
 */
public class MyTest {
    public static void main(String[] args) {
//        UserService userService = new UserServiceImpl();
//        userService.getUser();
//        UserDaoMysql mysql = new UserDaoMysql();
//        mysql.getUser();
//        UserDaoOracle userDaoOracle = new UserDaoOracle();
//        userDaoOracle.getUser();

        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(new UserDaoMysql());
        userService.getUser();


//        UserServiceImpl userService = new UserServiceImpl();
//        userService.getUser();


    }
}

我们使用set注入后,已经发生了革命性的变化

   /**
     * 程序控制对象,存在的弊端,使用一次就要去换取一次对象,代码冗余
     */
//    private  UserDao userDao=new UserDaoImpl();
    /**
     * 解决方案,使用set注入,是的每个用户拿到的数据都是一样的
     *
     */
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

总结:之前,程序是主动创建对象,控制权是在程序员手上

我们使用set注入后,程序不在拥有主动权,而是编程了被动的接受对象

这种思想称之为:控制反转IOC ,程序员不在去关注对象的创建,程序员可以专注于业务的实现!大大降低了耦合性,这就是ioc的原型。

控制反转是一种通过描述(xml或者注解) ,并通过第三方的生产活可获取特定的对象的方式,在spring中实现控制反转的是ioc容器,其实实现的方式就是依赖注入。

上一篇:VMware虚拟机运行提示模块snapshot 启动失败,未能启动虚拟机


下一篇:Day_62_Spring注解和AOP实现