Spring BeanPostProcessor не вызывается его реализованным bean-компонентом, но вызывается для всех других bean-компонентов

мой bean.xml

привет друзья .., я только изучаю весну . я реализую интерфейс BeanPostProcessor в HelloWorld.java. его методы вызываются для всех других компонентов, но не для него самого (компонент Helloworld.java)

 <bean id="helloWorld" class="com.tutorialspoint.HelloWorld" >     </bean>  
   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.tutorialspoint.TextEditor">
      <property name="spellChecker" ref="spellChecker"/>
   </bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
   </bean>

Helloworld.java

public class HelloWorld implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String name)
            throws BeansException {

        System.out.println();       
        System.out.println(bean.getClass().getName() +"---------------"+name+"--->This is after bean initialized ");

        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String name)
            throws BeansException {

        System.out.println(bean.getClass().getName() +"---------------"+name+"----------->This is before bean initialized ");

        return bean;
    }
}

основная программа

public class MainApp {
    public static void main(String arg[])throws Exception{
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");        

    }
    }

мой вывод

com.tutorialspoint.SpellChecker---------------spellChecker----------->This is before bean initialized 

com.tutorialspoint.SpellChecker---------------spellChecker--->This is after bean initialized 

com.tutorialspoint.TextEditor---------------textEditor----------->This is before bean initialized 

com.tutorialspoint.TextEditor---------------textEditor--->This is after bean initialized 

почему методы интерфейса BeanPostProcessor не вызываются для HelloWorld.java .., но вызываются для других несвязанных компонентов, которые не реализуют интерфейс BeanPostProcessor ..?


person P.JAYASRI    schedule 06.04.2015    source источник
comment
@mtyurt, пожалуйста, посмотрите еще раз мой bean.xml. я объявил класс HelloWorld как Hello bean первым   -  person P.JAYASRI    schedule 06.04.2015


Ответы (1)


любой bean-компонент, реализующий BeanPostprocessor, работает как постпроцессор для всех bean-компонентов. /factory/config/BeanPostProcessor.html" rel="nofollow">URL для более подробной информации. Четко указано, что ApplicationContexts can autodetect BeanPostProcessor beans in their bean definitions and apply them to any beans subsequently created. **Plain bean factories allow for programmatic registration of post-processors, applying to all beans created through this factory**.

Вы хотите, чтобы конкретный bean-компонент имел некоторый код инициализации, а затем реализовал InitializingBean, как показано ниже

package org.studyspring.beanfactory    
public class HelloWorld implements InitializingBean {
        private String name;

        public void setName(String name) {
            this.name = name;
        }


        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println(this.getClass().getName() +"---------------name = "+name+"--->This is after bean initialized ");
        }
    }

добавить запись для этого компонента в XML

 <bean id="helloWorld" class="org.studyspring.beanfactory.HelloWorld">
        <property name="name" value="Shirish"/>
    </bean>

или, в качестве альтернативы, вы можете иметь методы инициализации и уничтожения для каждого компонента, как показано ниже.

package org.studyspring.beanfactory;

import org.springframework.beans.factory.InitializingBean;


public class HelloWorld1  {
    private String name;

    public void setName(String name) {
        this.name = name;
    }



    public void init() throws Exception {
        System.out.println(this.getClass().getName() +"---------------name = "+name+"--->This is before bean initialized");
    }

    public void destroy() throws Exception {
        System.out.println(this.getClass().getName() +"---------------name = "+name+"--->This is after bean destroyed ");
    }
}

зарегистрируйте свой компонент, как показано ниже в XML

<bean id="helloWorld1" class="org.studyspring.beanfactory.HelloWorld1" init-method="init" destroy-method="destroy">
    <property name="name" value="Shirish"/>
</bean>

Кроме того, если вы следуете общепринятой практике именования методов инициализации и уничтожения, вы можете определить эти методы в <beans>, как показано ниже.

<beans default-init-method="init" default-destroy-method="destroy"> 

с указанными выше bean-компонентами, у которых есть доступные методы init и destory, они будут вызываться при инициализации и уничтожении этих bean-компонентов.

person Shirishkumar Bari    schedule 06.04.2015
comment
спасибо за Ваш ответ . но я думаю, что это не приемлемо. я реализовал в одном компоненте, но как он может работать как глобальный? любая ссылка - person P.JAYASRI; 06.04.2015
comment
проголосуйте за ваш супер ответ и другие методы init, destoy, InitializingBean - person P.JAYASRI; 06.04.2015
comment
тогда почему он не вызывает bean-компонент HelloWorld...? - person P.JAYASRI; 06.04.2015
comment
любой ответ на мой вопрос, почему он не вызывает helloworld bean и любую ссылку на него - person P.JAYASRI; 06.04.2015
comment
Вот это да!! удивительно описано, сэр... :) Очень полезно. - person Pallav Raj; 01.05.2015