Как самая популярная и мощная легкая рамка в Java, Spring была тепло приветствована программистами. Очень необходимо точно понять жизненный цикл весеннего фасоли. Мы обычно используем ApplicationContext в качестве пружинного контейнера. Здесь мы также говорим о жизненном цикле бобов в ApplicationContext. На самом деле, BeanFactory аналогичен, но процессор должен быть зарегистрирован вручную.
1. Диаграмма потока жизненного цикла:
Полный жизненный цикл пружинного боба начинается с создания пружинного контейнера до тех пор, пока контейнер для пружин в конечном итоге не разрушит фасоль, который содержит ряд ключевых моментов.
Если контейнер регистрирует вышеупомянутые различные интерфейсы, программа будет проводиться в соответствии с вышеуказанным процессом. Функции каждого интерфейса будут подробно объяснены ниже.
2. Классификация различных методов интерфейса
Полный жизненный цикл бобов подвергается различным вызовам методов, которые можно разделить на следующие категории:
1. Собственный метод Бин: это включает методы, вызванные самим бобом, и методы, указанные через инициатор-метод и метод Destress в файле конфигурации.
2. Метод интерфейса жизненного цикла уровня бобов: это включает в себя методы интерфейса, такие как Beannameaware, BeanFactoryAware, инициализация и DipoSableBean
3. Метод интерфейса жизненного цикла на уровне контейнера: это включает в себя две реализации интерфейса: instantiationawarebeanpostprocessor и beanpostprocessor. Их класс реализации обычно называется «постпроцессор».
4. Метод интерфейса заводского постпроцессора: это включает в себя AspectJweavingEnabler, ConfigurationClassPostProcessor, CustomAutowiReConfigurer и другие очень полезные методы интерфейса постпроцессорного интерфейса завода. Заводские постпроцессоры также являются контейнером. Вызывается сразу после применения файла конфигурации контекста.
3. Демо
Давайте продемонстрируем жизненный цикл Spring Bean с простым весенним фасолью.
1. Прежде всего, это простой пружинный фасоль, который называет собственные методы бобов и методы жизненного цикла на уровне бобов. Для удобства демонстрации он реализует четыре интерфейса: Beannameaware, Beanfactoryaware, инициализация и DiposableBean. В одно и то же время существует 2 метода, соответствующие инициатору, и метод уничтожения <Bean> в файле конфигурации. следующее:
Пакет Springbeantest; импорт org.springframework.beans.beansexception; import org.springframework.beans.factory.beanfactory; импорт org.springframework.beans.factory.beanfactoryawar org.springframework.beans.factory.disposablebean; import org.springframework.beans.factory.initializebean;/** * @author QSK */Public Class Person Persons Emeking Beanfactoryaware, Beannameaware, инициализируется, DisposableBean {Private Struce Legine; частный строковый адрес; частный телефон; Частный Beanfactory BeanFactory; Private String Beanname; public Person () {System.out.println ("【Конструктор】 Call Constructor Constructor Constructor"); } public String getName () {return name; } public void setName (string name) {System.out.println ("【Атрибут инъекции】 Имя атрибута инъекции"); this.name = name; } public String getAddress () {return Adder; } public void setAddress (строковый адрес) {System.out.println ("【Атрибут инъекции】 Адрес атрибута инъекции"); this.address = адрес; } public int getPhone () {return Phone; } public void setPhone (int phone) {System.out.println ("【Атрибут впрыскивания】 Атрибут впрыскивания телефона"); this.phone = телефон; } @Override public String toString () {return "person [address =" + address + ", name =" + name + ", phone =" + phone + "]"; } // Это метод интерфейса BeanFactoryAware @Override public void setbeanFactory (beanfactory arg0), бросает Beansexception {System.out .println ("【Beanfactoryaware Interface】 Call BeanFactoryAware.setBeanfactory ()"); this.beanfactory = arg0; } // Это метод интерфейса Beannameware @Override public void setBeanName (String arg0) {System.out.println ("【Beannameware Interface】 Call Beannameaware.setbeanName ()"); this.beanName = arg0; } // Это метод интерфейса инициализируемого интерфейса @Override public void efpropertiesset () Throws Exception {System.out .println ("【Инициализируемый интерфейс】 инициализируйте инициализирующие bean.afterpropertiesset ()"); } // Это метод интерфейса diposiblebean @override public void destress () throws exection {System.out.println ("【Diposiblebean interface】 call diposiblebean.destory ()"); } // Метод инициализации, указанный через свойство init-method of <Bean> public void myinit () {System.out.println ("【init-method】 Вызов метод инициализации, указанный в свойстве init-method <bean>"); } // Метод инициализации, указанный в свойстве Dressust-Method of <Bean> public void myDestory () {System.out.println ("【Dissult-Method】 Вызов метод инициализации, указанный в свойстве Dressure-Method <Bean>"); }}2. Далее следует продемонстрировать метод интерфейса Beanpostprocessor, следующим образом:
Пакет Springbeantest; импорт org.springframework.beans.beansexception; import org.springframework.beans.factory.config.beanpostprocessor; открытый класс mybeanpostprocessor реализует Beanpostprocessor {public mybeanpostprocessor () {super (); System.out.println («Это конструктор класса реализации BeanpostProcessor !!»); // TODO Auto Generated Constructor STUB} @Override Public Object PostProcessAfterinitialization (Object Arg0, String Arg1) Throws Beansexception {System.out .println («Метод интерфейса BeanpostProcessor postprocessafterinitiation вносит изменения в свойство!»); вернуть arg0; } @Override public Object postprocessbeforeinialization (Object arg0, String arg1) выбрасывает Beansexception {System.out .println ("Метод интерфейса BeanpostProcessor postprocessbebessbeinitialization изменяет свойство!"); вернуть arg0; }}Как упомянуто выше, интерфейс BeanpostProcessor включает в себя два метода послепроцессафтеринициализации и постопроцесс -рефинитизации. Первым параметром этих двух методов является обработанный объект Bean, а второй параметр - это имя боба. Возвратное значение также является объектом Bean, который будет обработан. Обратите внимание здесь.
3. Интерфейс Instantiationawarebeanpostprocessor является по сути поднтерфейс Beanpostprocessor. Как правило, мы унаследоваем адаптер адаптерного класса instantiationawarebeanpostprocessor, предоставленный весной, чтобы использовать его следующим образом:
Пакет Springbeantest; импорт java.beans.propertydescriptor; import org.springframework.beans.beansexception; import org.springframework.beans.propertyvalues; импорт org.springframework.beans.factory.config.instantiationawarebeanpostprocessessorApter MyInstantiationAwarebeanpostProcessor Extends InstantiationAwareBeanpostProcessorAdapter {public myInstantiationAwareBeanpostProcessor () {super (); System.out .println («Это создание Constructor Class Class Class !!»); } // CALL @Override Public Object PostProcessbeforeInstantiation (Class Beanclass, String Beanname) Throws Beansexception {System.out .println ("instantiationawarebeanpostprocessor вызывает метод Postprocessbeforeinstantiation"); вернуть ноль; } // Метод интерфейса, вызов @Override public Object postprocessafterinitialization (Object Bean, String Beanname) Throws Beansexception {System.out .println ("instantiationawarebeanpostprocessor вызывает постопроцессафтеринициализацию метода"); вернуть бон; } // CALL @Override Public PropertyValues PostProcessPropertyValues (PropertyValues PVS, PropertyDescriptor [] PDS, Object Bean, String Beanname) бросает Beansexception {System.out .println ("CentantiationAwareBeanpostProcessor Calls {system.out .println (" stantiationawarebeanpostprocessors wallsprocessproperyvalues "); вернуть PVS; }}Для этого есть 3 метода, а второй метод, постпроцессафтеринициализация, заключается в переписывании метода BeanpostProcessor. Третий метод, PostProcessPropertyValues, используется для эксплуатации свойств, и возвратное значение также должно быть объектом PropertyValues.
4. Продемонстрируйте метод заводского постпроцессорного интерфейса следующим образом:
Пакет Springbeantest; импорт org.springframework.beans.beansexception; import org.springframework.beans.factory.config.beandefinition; импорт org.springframework.beans.factory.config.beanfactorypostprocessor; org.springframework.beans.factory.config.configurablelistablebeanfactory; открытый класс mybeanfactorypostprocessor реализует Beanfactorypostprocessor {public mybeanfactorypostprocessor () {super (); System.out.println («Это конструктор реализации BeanFactoryPostProcessor класса !!»); } @Override public void postprocessbeanfactory (configurelelistablebeanfactory arg0) бросает Beansexception {System.out .println ("BeanFactoryPostProcessor Calls PostProcessBeanFactory Method"); Beandefinition bd = arg0.getbeandefinition ("человек"); Bd.getPropertyValues (). AddPropertyValue ("Phone", "110"); }}5. Файл конфигурации следующим образом Beans.xml, что очень просто. При использовании ApplicationContext процессор не должен быть зарегистрирован вручную:
<? 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" xmlns: aop = "http://www.springframework.org/schema/aop» xmlns: tx = "http://wwww.springframe.orns: tx =" http://wwww.springform. xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <bean id = "beanpostprocessessorsepessessepressorse"> </bean> <bean id = "bean id =" beanpostprocessessor " </bean> <bean id = "beanfactorypostprocessor"> </bean> <bean id = "person" init-method = "myinit" destry-method = "mydestory" scope = "singleton" p: name = "zhang san" p: адрес = "guangzhou" p: phone = "15900000000"/> </bean
6. Проверьте следующее:
Пакет Springbeantest; Import org.springframework.context.applicationContext; Import org.springframework.context.support.classpathxmlapplicationcontext; открытый класс Beanlifecycle {public static void main (string [] just) {System.out.println (»Начало инициализируйте контейнер теперь»; ApplicationContext factory = new ClassPathxMlapplicationContext ("Springbeantest/Beans.xml"); System.out.println ("инициализация контейнера успешно"); // Получить предложение и использовать личность = factory.getbean ("person", person.class); System.out.println (человек); System.out.println (человек); System.out.println («Начните закройте контейнер сейчас!»); ((ClassPathxMlapplicationContext) Factory) .RegisterShutDownHook (); }}Закройте контейнер, используя метод крюка, который на самом деле является абстрактным ApbrateApplicationContext.
Давайте посмотрим на результаты:
Начните инициализацию контейнера сейчас 2014-5-18 15:46:20 org.springframework.context.support.abstractapplicationcontext Информация о подготовке: освещение org.springframework.context.support.classpathxmlacplication context@19a0c7c7c: startup дата. root of context hierarchy2014-5-18 15:46:20 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions information: Loading XML bean definitions from class path resource [springBeanTest/beans.xml] This is the BeanFactoryPostProcessor implementation class constructor! ! BeanFactoryPostProcessor Calls PostProcessbeanFactory Метод Это конструктор класса реализации BeanpostProcessor! ! Это конструктор реализации CentantiationAwareBeanPostProcessorAdapter Class Class! ! 2014-5-18 15:46:20 org.springframework.beans.factory.support.defaultlistablebeanfactory preinstantiateSingletonSinformation: предварительная инстатью синглтона в org.springframework.beans.factory.support.default stistable @9934: definting.support.defaultbainbablebactor [Beanpostprocessor, instantiationawarebeanpostprocessor, beanfactorypostprocessor, человек]; Корень фабрики иерархинстатиации awerbeanpostpostprocessorals postprocessbeforeinstantaniation [Constructor] Call Call Constructor Constructor Constructor Constructor Method [Injectawarebeanpostprocessor Calls [инъекция атрибута инъекционного атрибута [инъекция атрибута. Beannameaware.setbeanName () [BeanFactoryAware Interface] Вызов BeanFactoryAware.SetBeanFactory () Метод интерфейса BeanPostProcessor PostProcessbebeforeinialization изменяет атрибут! [Инициализирующий интерфейс Bean] Call InitiazingBean.afterPropertiesset () [init-method] Вызовите метод инициализации, указанный в свойстве инициации Method <Bean>, метода интерфейса Beanpostprocessor postprocessafterinitialial для изменения свойства! Instantiationawarebeanpostprocessor вызывает метод послепроцессафтеринициализации. Контейнер успешно инициализируется. Человек [Адрес = Гуанчжоу, имя = Zhang San, телефон = 110] Теперь начните закрывать контейнер! 【Dostiblebean interface】 Call DiposibleBean.destory () 【Уничтожение-метод】 Вызовите метод инициализации, указанный в свойстве Dressustmethod <Bean>
Вышеуказанное представляет собой сборник информации о жизненном цикле Java Spring Bean. Мы будем продолжать добавлять соответствующую информацию в будущем. Спасибо за вашу поддержку на этом сайте!