Что такое IOC, как его вывести и понять? Весенняя серия (1)

Java задняя часть
Что такое IOC, как его вывести и понять? Весенняя серия (1)

Это 11-й день моего участия в Gengwen Challenge, смотрите подробности мероприятия:Обновить вызов


Статьи по Теме

Весенняя серия:Весенняя серия


предисловие
Происхождение МОК
1.1 Смоделируйте обычный бизнес-процесс запроса информации:

① Слой картографа: поскольку нет подключения к базе данных, здесь мы пишем класс реализации картографа для имитации запроса данных.

public interface PerMapper {
    void getPerInfo();
}
public class StudentMapperImpl implements PerMapper {

    @Override
    public void getPerInfo() {
        System.out.println("我是一个学生");
    }
}

②Служебный уровень: роль сервиса заключается в запросе информации о людях.

public interface PersonService {
    void getPersonInfo();
}
public class PersonServiceImpl implements PersonService {

    private PerMapper studentMapper = new StudentMapperImpl();

    @Override
    public void getPersonInfo() {
        studentMapper.getPerInfo();
    }
}

③Слой контроллера

import service.PersonService;
import service.impl.PersonServiceImpl;

public class IOCTest {
    public static void main(String[] args) {
        PersonService service = new PersonServiceImpl();
        service.getStudentInfo();
    }
}

④ Результат выполнения следующий:在这里插入图片描述

1.2 Несколько типов запросов

①mapper, добавить класс реализации учителя

public class TeacherMapperImpl implements PerMapper {

    @Override
    public void getPerInfo() {
        System.out.println("我是一个老师");
    }
}

②Что делать, если мы одновременно запрашиваем информацию об учителях и учениках?

public class PersonServiceImpl implements PersonService {

    private PerMapper student = new StudentMapperImpl();
    private PerMapper teacher = new TeacherMapperImpl();

    @Override
    public void getPersonInfo() {
        student.getPerInfo();
        teacher.getPerInfo();
    }
}

③Результат выполнения:在这里插入图片描述④ Что, если требования снова изменятся? Что, если мне нужна только информация учителя? Излишне говорить: два подхода, Один из них - напрямую изменить getPersonInfo() PersonServiceImpl.

   @Override
    public void getPersonInfo() {
//        student.getPerInfo();
        teacher.getPerInfo();
    }

Второй — расширить интерфейс сервисного уровня и предоставить учителям и учащимся интерфейсы для запросов:

public interface PersonService {
    void getPersonInfo();
    void getPersonInfo1();
}
    public class PersonServiceImpl implements PersonService {

    private PerMapper student = new StudentMapperImpl();
    private PerMapper teacher = new TeacherMapperImpl();

    @Override
    public void getPersonInfo() {
        teacher.getPerInfo();
    }

    @Override
    public void getPersonInfo1() {
        student.getPerInfo();
    }
}

⑤ Похоже, проблем нет, верно? Что, если есть 100 типов людей? Если вам нужно изменить это, люди сойдут с ума. Это определенно неразумно!

1.3. Оптимизируйте метод запроса

①Умные дети могут подумать об удалении объекта запроса: добавитьset()Метод не реализует интерфейс, а только выполняет зарезервированную работу.

public class PersonServiceImpl implements PersonService {

    private PerMapper per;

    public void setPer(PerMapper per) {
        this.per = per;
    }

    @Override
    public void getPersonInfo() {
        per.getPerInfo();
    }

}

②Реализация уровня контроллера:

public class IOCTest {
    public static void main(String[] args) {
        PersonServiceImpl service = new PersonServiceImpl();
        //学生
        service.setPer(new StudentMapperImpl());
        service.getPersonInfo();
        //老师
        service.setPer(new TeacherMapperImpl());
        service.getPersonInfo();
    }
}

③Вывод: Таким образом, инициатива передается вызывающей стороне, и программе не нужно заботиться о том, как она создается или реализуется, она отвечает только за предоставление интерфейса.

  • Мы больше не управляем созданием объектов, а больше внимания уделяем реализации бизнеса, и сцепление сильно снижается, что является прототипом МОК!
1.4, сущность МОК
  • Инверсия управления — это способ создания или извлечения определенных объектов по описанию (XML или аннотации) и третьими лицами. Именно контейнер IOC реализует инверсию управления в Spring, а его метод реализации — внедрение зависимостей (DI).

Впереди долгий путь, и я обязательно буду его искать вдоль и поперёк~Если вы думаете, что я блогеры хорошо пишу! Писать нелегко, ставьте лайки, подписывайтесь и комментируйте, чтобы поощрить блоггеров~