Аннотация: При использовании Spring для конфигурации IOC настройка и использование bean-компонентов всегда была важной частью.В то же время, как разумно использовать и создавать bean-объекты, также является той частью, на которую малым партнерам необходимо обращать внимание при обучении и используя Spring, поэтому в этой статье я расскажу вам о масштабах и жизненном цикле bean-компонентов в Spring.
Эта статья опубликована в сообществе HUAWEI CLOUD.«Подробное объяснение масштабов и жизненного цикла фасоли весной», оригинальный автор: серая обезьяна.
При использовании Spring для конфигурации IOC настройка и использование bean-компонентов всегда была важной частью.В то же время разумное использование и создание bean-объектов также является частью, на которую малым партнерам следует обращать внимание при изучении и использовании Spring. , так это В этой статье я расскажу вам о сфере применения и жизненном цикле бобов в Spring.
1. Объем бина
Сначала поговорим о сфере применения beans
Как правило, информация о конфигурации, которую мы пишем в контейнере IOC, будет создаваться при запуске нашего контейнера IOC., что приводит к тому, что при получении bean-объектов через IOC-контейнер мы часто получаем одноэкземплярные Bean-объекты.
Это означает, что независимо от того, сколько методов getBean() мы используем, один и тот же полученный JavaBean является одним и тем же объектом, который является компонентом с одним экземпляром, и весь проект будет совместно использовать этот объект компонента.
В Spring вы можете установить область действия bean-компонента в атрибуте scope элемента, чтобы определить, является ли bean-компонент одноэкземплярным или многоэкземплярным.. Свойство Scope имеет четыре параметра, конкретное использование можно увидеть на следующем рисунке:
1. Объявление одного экземпляра bean-компонента
По умолчанию Spring создает только уникальный экземпляр каждого bean-компонента, объявленного в контейнере IOC, который является общим для всего контейнера IOC: все последующие вызовы getBean() и ссылки на bean-компоненты будут возвращать этот уникальный экземпляр bean-компонента. Область действия называется singleton, который является областью действия по умолчанию для всех bean-компонентов. То есть единичный экземпляр.
Чтобы проверить это утверждение, мы создаем bean-компонент с одним экземпляром в IOC и получаем объект bean-компонента для сравнения:
<!-- singleton单实例bean
1、在容器创建时被创建
2、只有一个实例
-->
<bean id="book02" class="com.spring.beans.Book" scope="singleton"></bean>
Проверьте, является ли полученный bean-компонент с одним экземпляром одинаковым:
@Test
public void test09() {
// 单实例创建时创建的两个bean相等
Book book03 = (Book)iocContext3.getBean("book02");
Book book04 = (Book)iocContext3.getBean("book02");
System.out.println(book03==book04);
}
Полученный результат соответствует действительности
2. Объявление многоэкземплярного компонента
И поскольку существует один экземпляр, должно быть несколько экземпляров. Мы можем установить параметр прототипа для свойства области видимости объекта bean-компонента, чтобы указать, что экземпляр является многоэкземплярным, одновременно получить многоэкземплярные bean-компоненты в контейнере IOC, а затем сравнить полученные многоэкземплярные bean-компоненты.
<!-- prototype多实例bean
1、在容器创建时不会被创建,
2、只有在被调用的时候才会被创建
3、可以存在多个实例
-->
<bean id="book01" class="com.spring.beans.Book" scope="prototype"></bean>
Проверьте, является ли полученный компонент с несколькими экземплярами одинаковым:
@Test
public void test09() {
// 多实例创建时,创建的两个bean对象不相等
Book book01 = (Book)iocContext3.getBean("book01");
Book book02 = (Book)iocContext3.getBean("book01");
System.out.println(book01==book02);
}
Полученный результат является ложным
Это показывает, что объекты bean-компонентов, созданные несколькими экземплярами, различны.
Обратите внимание здесь:
В то же время создание одноэкземплярных и многоэкземплярных bean-компонентов также различается.Когда областью действия bean-компонента является синглтон, Spring создаст объектный экземпляр bean-компонента при создании объекта-контейнера IOC. И когда областью действия bean-компонента является прототип, контейнер IOC создает объект экземпляра bean-компонента, когда он получает экземпляр bean-компонента..
2. Жизненный цикл фасоли
1. Инициализация и уничтожение бинов
На самом деле каждый объект bean-компонента, который мы создаем в IOC, имеет свой определенный жизненный цикл. Жизненным циклом bean-компонента можно управлять в контейнере Spring IOC. Spring позволяет выполнять определенные задачи в определенной точке жизненного цикла bean-компонента. Например, методы, выполняемые при инициализации компонента, и методы, выполняемые при его уничтожении.
Процесс управления контейнером Spring IOC жизненным циклом bean-компонентов можно разделить на шесть этапов.:
1. Создайте экземпляр компонента с помощью конструктора или фабричного метода.
2. Установите значения для свойств бина и ссылки на другие бины
3. Вызвать метод инициализации бина
4. Фасоль можно использовать как обычно
5. Когда контейнер выключится, вызовите метод уничтожения компонента.
Так как же объявить методы, которые выполняются при инициализации и уничтожении компонента?
Сначала мы должны добавить методы, которые будут выполняться при инициализации и уничтожении внутри класса компонента. Например, следующий javabean:
package com.spring.beans;
public class Book {
private String bookName;
private String author;
/**
* 初始化方法
* */
public void myInit() {
System.out.println("book bean被创建");
}
/**
* 销毁时方法
* */
public void myDestory() {
System.out.println("book bean被销毁");
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book [bookName=" + bookName + ", author=" + author + "]";
}
}
В настоящее время, когда мы настраиваем компонент, мы можем указать методы инициализации и уничтожения компонента через атрибуты init-method и destroy-method.
<!-- 设置bean的生命周期
destory-method:结束调用的方法
init-method:起始时调用的方法
-->
<bean id="book01" class="com.spring.beans.Book" destroy-method="myDestory" init-method="myInit"></bean>
Таким образом, когда мы создаем и уничтожаем bean-объекты через IOC-контейнер, будут выполняться соответствующие методы.
Но здесь есть одно замечание:
Как мы сказали выше, время создания одноэкземплярного компонента и многоэкземплярного компонента отличается, поэтому время выполнения их начального метода и метода уничтожения немного отличается.
Жизненный цикл компонента в одном экземпляре
Запуск контейнера -> метод инициализации -> (выключение контейнера) метод уничтожения
Жизненный цикл компонента с несколькими экземплярами
Запуск контейнера -> вызов bean-компонента -> метод инициализации -> завершение работы контейнера (метод уничтожения не выполняется)
2, постпроцессор бобов
Что такое постпроцессор бина? постпроцессоры компонентов позволяют вызыватьДо и после метода инициализацииВыполните дополнительную обработку бобов
Постпроцессор bean-компонента обрабатывает все экземпляры bean-компонентов в контейнере IOC один за другим вместо одного экземпляра..
Типичными приложениями являются: проверка правильности свойств бина или изменение свойств бина в соответствии с определенными критериями.
Постпроцессор компонента должен реализовать интерфейс при его использовании:
org.springframework.beans.factory.config.BeanPostProcessor.
До и после вызова метода инициализации Spring будет передавать каждый экземпляр компонента следующим двум методам вышеуказанного интерфейса:
Перед вызовом postProcessBeforeInitialization(Object, String)
После вызова postProcessAfterInitialization(Object, String)
В этом интерфейсе реализован следующий постпроцессор:
package com.spring.beans;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* 测试bean的后置处理器
* 在这里要注意一点是为了出现bean和beanName,而不是arg0、arg1,需要绑定相应的源码jar包
* */
public class MyBeanPostProcessor implements BeanPostProcessor{
/**
* postProcessBeforeInitialization
* 初始化方法执行前执行
* Object bean
* String beanName xml容器中定义的bean名称
* */
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
// TODO Auto-generated method stub
System.out.println("【"+ beanName+"】初始化方法执行前...");
return bean;
}
/**
* postProcessAfterInitialization
* 初始化方法执行后执行
* Object bean
* String beanName xml容器中定义的bean名称
* */
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
// TODO Auto-generated method stub
System.out.println("【"+ beanName+"】初始化方法执行后...");
return bean;
}
}
Добавьте этот постпроцессор в контейнер IOC:
<!-- 测试bean的后置处理器 -->
<bean id="beanPostProcessor" class="com.spring.beans.MyBeanPostProcessor"></bean>
Так как наш объект bean-компонента теперь является единственным экземпляром, объект bean-компонента будет создан непосредственно при запуске контейнера, а также будут выполняться метод постпроцессора и метод инициализации bean-компонента, а метод уничтожения будет выполняться, когда контейнер уничтожен.. Тестируем следующим образом:
//*************************bean生命周期*****************
// 由于ApplicationContext是一个顶层接口,里面没有销毁方法close,所以需要使用它的子接口进行接收
ConfigurableApplicationContext iocContext01 = new ClassPathXmlApplicationContext("ioc1.xml");
@Test
public void test01() {
iocContext01.getBean("book01");
iocContext01.close();
}
результат операции:
Обобщить процесс выполнения постпроцессора:
1. Через конструктор или фабричный методСоздать экземпляр компонента
2. Для фасолизаданное значение свойстваи ссылки на другие бобы
3. Передайте экземпляр компонента в постпроцессор ** компонента.
метод postProcessBeforeInitialization()**
4. Вызвать бининициализацияметод
5. Передайте экземпляр компонента в постпроцессор ** компонента.
метод postProcessAfterInitialization()**
6. Фасоль готова к использованию
7. Вызовите метод destroy компонента, когда контейнер закрывается.
Таким образом, жизненный цикл бина после добавления постпроцессора бина:
Запуск контейнера - до... -> метод инициализации постпроцессора -> после... -> (выключение контейнера) метод уничтожения постпроцессора
Нажмите «Подписаться», чтобы впервые узнать о новых технологиях HUAWEI CLOUD~