Fai*_*sra 8 java singleton spring postconstruct
在我的春季申请中遇到一些问题.
我有非常简单的春豆,它们被注入各种其他春豆.在我发现调试时,它们被调用了两次,Constructor和@PostConstruct都被调用了两次.
我的应用程序没有前端技术.它仅用于与后端任务相关.
弹簧配置
<?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>
Run Code Online (Sandbox Code Playgroud)
春豆类
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
构造函数"TransactionDAO"被调用两次.
我试着看看调用堆栈的跟踪
Throwable t = new Throwable();
System.out.println(t.getStackTrace()[1].toString());
Run Code Online (Sandbox Code Playgroud)
每次它显示以下内容
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
Run Code Online (Sandbox Code Playgroud)
Fai*_*sra 16
我刚刚想出了问题,特别感谢@Juan Alberto给我提示这个问题.
描述:实际上我给了contextListner和dispatcher servlet的一个applicationContext.xml文件.因此,第一个bean正在初始化弹簧核心,第二个弹簧调度程序.
我现在将配置泄漏到applicationContext.xml和applicationContext-dispatcher.xml中,它们只有相关的配置,我的bean正在初始化一次.
有问题的配置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
Run Code Online (Sandbox Code Playgroud)
解决了配置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-dispatcher.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
Run Code Online (Sandbox Code Playgroud)
实际上你的问题是你可能在调度程序servlet中定义bean以及你的spring上下文,调度程序提供了一个不同的上下文但是它(我认为是一个子上下文)的主要上下文所以正确的方法就是让你的主上下文扫描您的"模型类",调度程序只扫描控制器.
我希望这可以帮助你.
归档时间: |
|
查看次数: |
12099 次 |
最近记录: |