`

Spring Bean重复执行两次(实例被构造两次)问题分析

阅读更多

  在《Spring Bean重复执行两次(实例被构造两次)问题分析》一文中,我们知道web.xml两处配置文件正常需分开。如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   
	<display-name>SpringMVC</display-name>
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml;/WEB-INF/task.xml</param-value>
	</context-param>
	
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<servlet>
		<servlet-name>springMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
		<init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>/WEB-INF/springMVC-servlet.xml</param-value>  
        </init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springMVC</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>  

  其中,如下配置:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/springMVC-servlet.xml</param-value>
</context-param>

  因为该节点指派的applicationContext*.xml是用于实例化除servlet之外的所有对象的,可以说项目中绝大多数的service和dao层操作都由ContextLoaderListener传递给Spring来进行实例化。

  而如下配置:

<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

  这个是用来处理所有servlet的,没有它就无法通过请求地址来调用相应的Controller。如果不指定,则会按照注释中所描述地那样自动加载"工程名-servlet.xml"配置文件。无论是servletContext.xml还是applicationContext*.xml都可以按照<beans>...<bean id="XXX" class="XXX" />...</beans>这样的形式来配置。

  问题来了,有时候不注重对象初始化的分类,尤其是使用<context:component-scan base-package="controller" />这样的包扫描形式统一初始化,很容易造成满足条件的对象被初始化两次,那么在计划任务的时候被执行两次也就不奇怪了。其实说来说去,还是要提醒大家,不同的配置文件其作用是不一样的,不要将所有的初始化操作都放到一个配置文件中,更不要重复配置。不仅浪费资源,还很容易导致莫名其妙的故障。

  详细请见阅读《Spring Bean重复执行两次(实例被构造两次)问题分析》。

  SpringMVC工程因此做了拆分,拆分的工程代码详见附件《SpringMVC.rar》。

分享到:
评论

相关推荐

    第四章 Spring Bean基础1

    Spring Bean 是 Spring 框架的核心概念,它代表了应用程序中的一个对象,这个对象可以被 Spring 容器管理,包括创建、初始化、装配、销毁等生命周期过程。在 Spring 中,Bean 定义是由 `BeanDefinition` 接口来表示...

    java_Timer定时器实例_Spring实例

    标题与描述均提到了“Java_Timer定时器实例_Spring实例”,这表明文章主要讨论的是如何在Java中使用Timer类创建定时任务,并将其整合到Spring框架中。以下是对该主题的详细解析: ### Java中的Timer定时器 #### ...

    singleton Bean 创建 prototype Bean

    Singleton Bean是Spring中最常见的作用域,它的特点是无论多少次从容器中获取,都只会返回同一个实例。这种设计模式被称为单例模式,可以有效地减少资源消耗,提高系统效率。Singleton Bean的创建过程通常包括以下...

    Tom_深入分析Spring源码doc

    《Spring源码深度解析》 在Java开发领域,Spring框架无疑是最重要的存在之一。它以其强大的功能、灵活的设计和丰富的生态,...无论是为了提升个人技能,还是为了解决实际问题,Spring源码的探索都是一次宝贵的旅程。

    Spring系列面试题129道(附答案解析)

    20、springbean容器的生命周期是什么样的? Spring Bean的生命周期包括以下几个主要阶段: - Bean的实例化。 - 对Bean进行属性赋值和依赖注入。 - 如果Bean实现了BeanNameAware、BeanFactoryAware等接口,会调用相应...

    spring 个人小结 源码分析机制原理

    默认情况下,Spring创建的Bean是单例的,这意味着在整个应用中,对同一个Bean名的多次请求将返回相同的实例。如果需要每次请求都创建新的Bean实例,可以将Bean定义为原型作用域。 总结来说,Spring的IoC容器通过XML...

    spring学习之路(黑马课程笔记)

    构造方式实例化是通过构造方法对Bean进行实例化,包括无参构造和有参构造两种形式。工厂方式实例化是通过调用自定义的工厂方法对Bean进行实例化,包括静态工厂方法实例化和实例工厂方法实例化两种形式。 Bean的延迟...

    Spring 多线程下注入bean问题详解

    // 只适合一个 class 只被定义一次的 bean(也就是说,根据 class 不能匹配出多个该 class 的实例) public static Object getBeanByType(Class clazz) { if (clazz == null || context == null) { return null;...

    我做了个简单的性能测试,发现从bean工厂里单例执行方法效率比new对象执行慢很多

    标题提到的问题——“从bean工厂里单例执行方法效率比new对象执行慢很多”,涉及到Java编程中的两种常见对象管理方式:单例模式和直接实例化。这个现象可能让开发者感到困惑,因为通常认为单例模式在性能上具有优势...

    Spring Reference - Core Technologies.pdf

    但有时Bean的创建可能会被延迟到第一次使用时,这称为懒加载。 1.4.5 自动装配依赖 Spring容器可以根据类型或名称自动装配Bean之间的依赖关系,这种方式可以减少配置工作量,但有时候也会引起问题。 1.4.6 方法...

    Spring Bean

    在Spring框架中,Bean通常指的是被Spring管理的对象,这些对象的生命周期、装配和配置都由Spring容器负责。Spring Bean的配置可以通过XML、注解或Java配置类来完成。 ### Spring Bean的生命周期 Spring Bean的生命...

    Spring学习笔记,精华摘要

    Spring实现单例模式的方式是通过静态工厂方法`getInstance()`确保任何时候返回的都是同一对象,防止了类的多次实例化。 依赖注入是Spring的核心特性,它允许组件之间的依赖关系在运行时通过容器进行管理,而不是在...

    spring其他标签

    - **BeanFactoryAware**:该接口的`setBeanFactory`方法会被Spring容器回调,将当前的`BeanFactory`实例传递给bean,便于bean访问容器内的其他bean。 - **ApplicationContextAware**:此接口的`...

    Spring设计思想.ppt

    它遵循工厂模式的原则,使得客户端(也就是使用Spring的开发者)不需要关心bean的创建细节,只需要通过配置或注解声明所需的bean,然后通过Spring容器来获取这些bean的实例。这样,客户端与bean的具体实现逻辑解耦,...

    Spring2.5.6源代码分析(一):IOC容器

    Spring支持单例和原型两种作用域,单例bean只实例化一次,原型bean每次请求都会创建新的实例。 5. 处理依赖注入:在实例化bean后,IoC容器会检查其依赖,并通过设值注入(setter方法)或构造器注入来满足这些依赖。...

    使用java类配置Bean

    每个`@Bean`方法都会被Spring调用一次,以创建对应的Bean实例。 **依赖注入**:在Java配置中,依赖注入可以通过构造函数、setter方法或者字段注解实现。例如,如果`MyService`需要依赖`MyRepository`,可以这样修改...

    Bean的生命周期介绍

    1. **构造函数创建**:当Bean需要被创建时,Spring会调用其无参构造函数(或通过`@Autowired`注解依赖注入的构造函数)来实例化Bean。 - 如上文代码所示,`Car`类通过无参构造函数进行实例化。 2. **依赖注入**:...

    spring 配置文件简单说明

    在Spring中,`&lt;beans&gt;`和`&lt;bean&gt;`元素是两个非常重要的元素,它们分别用于定义整个配置上下文和单个Bean的属性。 首先,我们来看`&lt;beans&gt;`元素。它作为配置文件的根元素,提供了几个全局属性来控制所有包含的Bean的...

Global site tag (gtag.js) - Google Analytics