2016-10-21 3 views
0

В настоящее время я экспериментирую на методах обратного вызова bean-компонента и замечаю, что если я определяю методы обратного вызова для одного компонента, эти методы также вызывают для других bean-компонентов.Весна: init-метод bean запускается при вызове других bean-компонентов

У меня есть классы с именем x.HelloWorld (без обратных вызовов) и y.HelloWorld (имеет методы init и destroy callback).

HelloWorld.java:

public class HelloWorld { 
    private String message; 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public void getMessage() { 
     System.out.println("Your Message : " + message); 
    } 
} 

HelloWorld2.java:

public class HelloWorld { 
    private String message; 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public void getMessage() { 
     System.out.println("Your Message : " + message); 
    } 

    public void init() { 
     System.out.println("Bean is going through init."); 
    } 

    public void destroy() { 
     System.out.println("Bean will destroy now."); 
    } 
} 

x.MainApp.java:

import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class MainApp { 
    public static void main(String[] args) { 

     AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 

     HelloWorld obj = (HelloWorld) context.getBean("helloWorld"); 
     obj.getMessage(); 
    } 
} 

y.MainApp.java:

import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class MainApp { 
    public static void main(String[] args) { 

     AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 

     HelloWorld obj = (HelloWorld) context.getBean("helloWorld2"); 
     obj.getMessage(); 
     context.registerShutdownHook(); 
    } 
} 

beans.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:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 

    <bean id="helloWorld" class="x.HelloWorld"> 
     <property name="message" value="Hello World (1)" /> 
    </bean> 
    <bean id="helloWorld2" class="y.HelloWorld" 
     init-method="init" destroy-method="destroy"> 
     <property name="message" value="Hello World (2)" /> 
    </bean> 
</beans> 

Результаты: Запуск y.MainApp (работает как ожидалось):

Bean is going through init. 
Your Message : Hello World (2) 
Bean will destroy now. 

Бег x.MainApp (обратный вызов init x.HelloWorld инициируется y.HelloWorld. Confused этого один .. любая помощь очень ценится ...)

Bean is going through init. 
Your Message : Hello World (1) 
+0

Если вы поставите другой метод инициализации в x.MainApp, он будет срабатывать тоже. Вы создаете новый контекст приложения с указанной конфигурацией xml, но это не значит, что все бобы загружаются в момент создания контекста. –

ответ

0

Пожалуйста, измените метод инициализации, как это:

public void init() { 
    System.out.println("Bean with message '"+ message +"' is going through init."); 
} 

Вы увидите, что все бобы инициализируются при запуске и сообщение, которое вы видите, действительно происходит из класса с помощью метода init.

Если вы не хотите, чтобы это поведение, которое вы можете использовать ленивый INIT:

<bean id="helloWorld2" class="y.HelloWorld" 
     init-method="init" destroy-method="destroy" lazy-init="true"> 
Смежные вопросы