Frühjahr singleton wird zweimal aufgerufen
immer einige problem in meiner spring-Anwendung.
Habe ich sehr relativ einfachen spring-beans injiziert werden Sie in verschiedenen anderen spring-Bean. Während der Fehlersuche fand ich, Sie zweimal aufgerufen, Konstruktor & @PostConstruct aufgerufen, zwei mal.
Meine Applikation haben keine front-end-Technologie. Einfach für die backend-Aufgabe im Zusammenhang.
Spring-Konfiguration
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:lang="http://www.springframework.org/schema/lang" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">
<context:component-scan base-package="com.green.integration" />
<!-- ######################################################## -->
<!-- EXPOSING SPRING BEAN VIA HTTPINVOKER SPRING REMOTING -->
<!-- ######################################################## -->
<bean name="/switch"
class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="SwitchController" />
<property name="serviceInterface"
value="com.green.ISwitchController" />
</bean>
<!-- Load in application properties reference -->
<bean id="applicationProperties"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:application.properties" />
</bean>
<bean id="mongo" class="com.mongodb.Mongo">
<constructor-arg value="${mongo.server}" />
<constructor-arg value="${mongo.port}" />
</bean>
<bean id="morphia" class="com.google.code.morphia.Morphia">
</bean>
</beans>
Spring-Bean-Klasse
@Repository
public class TransactionDAO extends BasicDAO<Transaction, ObjectId> {
private Datastore datastore;
@Autowired
public TransactionDAO(Mongo mongo, Morphia morphia) {
super(mongo, morphia, "itransact");
morphia.map(Transaction.class);
//TO USE MONGO WITHOUT SECURITY
this.datastore = morphia.createDatastore(mongo, "itransact");
logger.debug("***** CONNECTED TO MONGODB SUCCESSFULLY *****");
this.datastore.ensureIndexes();
//this.datastore.ensureCaps();
}
}
Konstruktor "TransactionDAO" wird zweimal genannt.
Habe ich versucht zu beobachten, call-stack-trace von
Throwable t = new Throwable();
System.out.println(t.getStackTrace()[1].toString());
und jedes mal zeigte die folgenden
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
- Sind Sie absolut sicher, dass
@PostConstruct
genannt wird, doppelt so gut? Konstruktor wird zweimal aufgerufen werden kann es leicht zu erklären, aber nicht@PostConstruct
. - Hast du ein dispatcher-servlet-Konfiguration?
- Vielleicht haben Sie Ihre Anwendung, die Kontext-xml importiert aus einem anderen Kontext der xml-Konfiguration-Datei über <import ..>?
- Spring-Konfiguration nicht die DAO Klasse, die Sie aufgelistet. Es fehlen Informationen hier.
- Ja, ich habe einen dispatcher-servlet für spring httpinvoker. Ist es das problem verursacht?
- Boris, ich hatte mehrere verschüttete spring config-Dateien & importieren in eine main spring config-Datei. Dann entfernte ich alle Importe und alle config in die main-spring-Datei, aber es machte keinen Unterschied.
- Juan, ich habe überprüft durch entfernen der dispatcher-servlet und beans sind nach der Initialisierung. Seine dispatcher, verursacht zweimal Initialisierung. Was ist also das Update, bitte?
- Was ist deine Umgebung? Sind Sie sicher, dass Ihre Klassen verwaltet von spring nur stackoverflow.com/questions/9077966/postconstruct-method-called-twice-for-the-same-request
- Ja, alle Klassen sind wird verwaltet von spring-container.
- wenn Ihr dispatcher scannt die Pakete dann können Sie Scannen die gleichen Bohnen in zwei verschiedenen Kontexten!
- Ich ' ll fügen Sie es als Antwort, wenn es das problem gelöst
- Konstruktor wird zweimal aufgerufen werden kann es leicht zu erklären, aber nicht @PostConstruct ...wenn der Aufruf von verschiedenen Kontexten in der gleichen JVM,
PostConstruct
wird jedes mal aufgerufen, nachdem der Konstruktor; was war die rationale hinter deinem Kommentar?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich gerade herausgefunden, das problem, und besonderen Dank an @Juan Alberto, die mir Hinweis auf das problem.
Beschreibung: Eigentlich war ich indem Sie den einen applicationContext.xml Datei für beide contextListner und dispatcher-servlet. Also 1. bean war die Initialisierung für den Frühling-core und 2. Zeit für den Frühling dispatcher.
Ich verschüttete die Konfiguration wird nun, in applicationContext.xml und applicationContext-dispatcher.xml die haben nur Ihre relevanten Konfigurationen und meine Bohnen sind die Initialisierung erst einmal richtig.
Problematisch Configs
Gelöst Configs
applicationContext-dispatcher.xml
und was sollte inapplicationContext.xml
Eigentlich dein Problem ist, dass Sie werden können, definieren Sie die Bohnen in das dispatcher-servlet-und auch spring-Kontext, der dispatcher stellt einen anderen Zusammenhang, aber Es (eine sub-Kontext glaube ich) der wichtigste Kontext also der richtige Weg, Dinge zu tun, ist, dass Ihre wichtigsten Kontext-scan-Ihr "Modell-Klassen" und der dispatcher einfach nur Scannen für die Controller.
Ich hoffe das hilft dir.