Spring IOC & DI на основе XML

1 Инверсия управления

  Инверсия управления (Inversion of Control, сокращенно IoC) - это [принцип проектирования в объектно-ориентированном программировании, который можно использовать для уменьшения степени связи между компьютерными кодами. Самый распространенный метод называется внедрением зависимостей (DI), а другой метод - поиском зависимостей. Через инверсию управления, когда объект создается, внешний объект, который регулирует все объекты в системе, передает ему ссылку на объект, от которого он зависит. Также можно сказать, что зависимость вводится в объект.

  В Spring для уменьшения степени связи между классами используется инверсия управления. Spring использует контейнер IoC для управления относительными ресурсами.Мы передаем управление всеми классами Java-бинов Spring, которая реализует создание классов. Если нам нужно переключаться между различными классами реализации, такими как класс Dao уровня персистентности или класс Service уровня транзакции, требуется лишь небольшой объем кода конфигурации, чтобы действительно уменьшить взаимосвязь.

2 Обычно используемые классы

2.1 ApplicationContext 和 BeanFactory

  • ApplicationContext: он создает объекты при построении основного контейнера, и принятая стратегия заключается в использовании немедленной загрузки. Другими словами, как только файл конфигурации будет прочитан, объекты, сконфигурированные в файле конфигурации, будут созданы.

  • BeanFactory: при построении основного контейнера используется отложенная загрузка. Другими словами, когда объект нужно получить, будет ли он действительно создан.

2.2 ApplicationContext три класса реализации

  • ClassPathXmlApplicationContext: вы можете загрузить файл конфигурации по пути к классам, и файл конфигурации должен находиться в пути к классам;
  • FileSystemXmlApplicationContext: вы можете загружать файлы конфигурации по любому пути на диске (должны иметь права доступа);
  • AnnotationConfigApplicationContext: используется для чтения аннотаций для создания контейнера

2.3 Простой случай

public static void main(String[] args) {
    
    
    //1.获取配置文件,创建Spring核心容器对象
    ApplicationContext ac = new ClassPathXmlApplicationContext("Spring.xml");

    //2.根据id获取Bean对象
    IAccountService as  = (IAccountService)ac.getBean("accountService");
    IAccountDao adao = (IAccountDao) ac.getBean("accountDao");

    // 3.查看对象是否创建成功
    System.out.println(as);
    System.out.println(adao);

    // 4.查看依赖注入是否成功
    as.saveAccount();
}

3 способа настройки beans

  Обычно существует три способа настроить bean-компонент в файле конфигурации Spring: с помощью конструктора, с использованием обычного метода фабрики и использования статического метода фабрики .

  Первый способ: использовать конструктор для создания. Когда тег bean-компонента используется в файле конфигурации spring с атрибутами id и class, и нет других атрибутов и тегов. Конструктор по умолчанию используется для создания объекта bean. В настоящее время, если в классе нет конструктора по умолчанию, объект не может быть создан. Или вы можете использовать внедрение зависимостей для создания bean-компонента с помощью параметризованного конструктора.

<bean id="accountService" class="service.impl.AccountServiceImpl">
	<!--此时默认使用AccountServiceImpl的无参构造函数进行对象的创建  -->
</bean>

  Второй способ: используйте обычный метод в фабрике для создания объекта (то есть используйте метод в определенном классе для создания объекта и сохранения его в контейнере spring)

<bean id="instanceFactory" class="factory.InstanceFactory">
    <!--配置一个工厂,其中提供一个普通方法getAccountService,该方法返回accountService的实现类  -->
</bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method= "getAccountService">
    <!--使用工厂instanceFactory中的方法getAccountService -->
</bean>

  Третий способ: используйте статический метод в фабрике для создания объекта (используйте статический метод в определенном классе, чтобы создать объект и сохранить его в контейнере spring)

<bean id="accountService" class="factory.StaticFactory" factory-method="getAccountService">
    <!--使用工厂StaticFactory中的静态方法getAccountService  -->
</bean>

4 Область применения и жизненный цикл bean-компонента

4.1 Объем

Область действия bean-компонента включает пять типов, которые можно указать с помощью атрибута scope тега bean-компонента:

  • singleton: singleton (значение по умолчанию)
  • прототип: несколько случаев
  • запрос: объем запроса, действующего в веб-приложении.
  • сеанс: объем сеанса, который действует в веб-приложении.
  • global-session: Область сеанса (глобальная область сеанса), которая действует в кластерной среде. Когда это не кластерная среда, это сеанс.
<bean id="accountService" class="service.impl.AccountServiceImpl" scope="prototype">

</bean>

4.2 Жизненный цикл

Одноэлементный объект:

  • Рождение: объект рождается при создании контейнера;
  • Жив: пока контейнер находится там, субъект жив;
  • Смерть: контейнер разрушается, а объект умирает;
  • Описание: Жизненный цикл одноэлементного объекта такой же, как и у контейнера.

Несколько объектов:

  • Born: когда мы используем объекты, Spring framework создает их для нас;
  • Жив: объект жив, пока используется;
  • Смерть: когда объект не используется в течение длительного времени и нет другой ссылки на объект, он собирается сборщиком мусора Java.
<bean id="accountService" class="service.impl.AccountServiceImpl" scope="prototype" init-method="init" destroy-method="destroy">
	<!--可以指定init和destroy方法  -->
</bean>

5 внедрение зависимостей

Настроить внедрение зависимостей в XML-файле можно двумя способами: с помощью конструктора и метода set.

5.1 Метод внедрения конструктора

Внедрение конструктора (класс должен предоставлять соответствующий метод построения):

  • Тег: конструктор-аргумент
  • Где появляется метка: внутри метки bean-компонента
  • Атрибуты в метке (обычно используются имя + значение или имя + ссылка)
    • type: используется для указания типа данных для ввода, который также является типом одного или нескольких параметров в конструкторе
    • index: используется для назначения данных, которые будут введены параметру в указанной позиции индекса в конструкторе. Позиция индекса начинается с 0
    • name: используется для назначения параметра с указанным именем в конструкторе
    • значение: используется для предоставления данных базового типа и типа String
    • ref: используется для указания данных другого типа bean, этот тип должен быть настроен в контейнере IoC
<bean id="person" class="domain.Person">
    <constructor-arg name="name" value="Tom"></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
    <constructor-arg name="birthday" ref="birth"></constructor-arg>
</bean>
<!-- 配置一个日期对象 -->
<bean id="birth" class="java.util.Date">
    <!--配置一个日期对象,可以供给person对象注入  -->
</bean>

5.2 Использование внедрения тегов P

Внедрение тега P (класс должен предоставить соответствующий метод набора):
добавьте зависимость тега P в верхней части файла xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="student" class="domain.Student" p:name="小明" p:age="23">
</bean>

5.3 установка метода впрыска

5.3.1 Общие типы

внедрение метода набора (класс должен предоставить соответствующий метод набора):

  • Ярлык: свойство
  • Расположение: внутри тега bean-компонента
  • Атрибуты:
    • name: используется для указания имени метода набора, вызываемого во время инъекции
    • значение: используется для предоставления данных базового типа и типа String
    • ref: используется для указания данных другого типа bean, этот тип должен быть настроен в контейнере IoC
<bean id="person" class="domain.Person">
    <property name="name" value="Tom" ></property>
    <property name="age" value="21"></property>
    <property name="birthday" ref="birth"></property>
</bean>

<!-- 配置一个日期对象 -->
<bean id="birth" class="java.util.Date">
    <!--配置一个日期对象,可以供给person对象注入  -->
</bean>

5.3.2 Сложные типы

<bean id="complex" class="domain.Complex">
    <property name="myStrs">
        <!--注入一个数组  -->
        <set>
            <value>AAA</value>
            <value>BBB</value>
            <value>CCC</value>
        </set>
    </property>
    <property name="myList">
        <!--注入一个list   -->
        <array>
            <value>AAA</value>
            <value>BBB</value>
            <value>CCC</value>
        </array>
    </property>
    <property name="mySet">
        <!--注入一个Set   -->
        <list>
            <value>AAA</value>
            <value>BBB</value>
            <value>CCC</value>
        </list>
    </property>
    <property name="myMap">
        <!--注入一个map   -->
        <props>
            <prop key="testC">ccc</prop>
            <prop key="testD">ddd</prop>
        </props>
    </property>
    <property name="myProps">
		<!--注入一个属性集properties   -->
        <map>
            <entry key="testA" value="aaa"></entry>
            <entry key="testB">
                <value>BBB</value>
            </entry>
        </map>
    </property>
</bean>

рекомендация

отblog.csdn.net/Orange_minger/article/details/114466018
рекомендация