在《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 是 Spring 框架的核心概念,它代表了应用程序中的一个对象,这个对象可以被 Spring 容器管理,包括创建、初始化、装配、销毁等生命周期过程。在 Spring 中,Bean 定义是由 `BeanDefinition` 接口来表示...
标题与描述均提到了“Java_Timer定时器实例_Spring实例”,这表明文章主要讨论的是如何在Java中使用Timer类创建定时任务,并将其整合到Spring框架中。以下是对该主题的详细解析: ### Java中的Timer定时器 #### ...
Singleton Bean是Spring中最常见的作用域,它的特点是无论多少次从容器中获取,都只会返回同一个实例。这种设计模式被称为单例模式,可以有效地减少资源消耗,提高系统效率。Singleton Bean的创建过程通常包括以下...
《Spring源码深度解析》 在Java开发领域,Spring框架无疑是最重要的存在之一。它以其强大的功能、灵活的设计和丰富的生态,...无论是为了提升个人技能,还是为了解决实际问题,Spring源码的探索都是一次宝贵的旅程。
20、springbean容器的生命周期是什么样的? Spring Bean的生命周期包括以下几个主要阶段: - Bean的实例化。 - 对Bean进行属性赋值和依赖注入。 - 如果Bean实现了BeanNameAware、BeanFactoryAware等接口,会调用相应...
默认情况下,Spring创建的Bean是单例的,这意味着在整个应用中,对同一个Bean名的多次请求将返回相同的实例。如果需要每次请求都创建新的Bean实例,可以将Bean定义为原型作用域。 总结来说,Spring的IoC容器通过XML...
构造方式实例化是通过构造方法对Bean进行实例化,包括无参构造和有参构造两种形式。工厂方式实例化是通过调用自定义的工厂方法对Bean进行实例化,包括静态工厂方法实例化和实例工厂方法实例化两种形式。 Bean的延迟...
// 只适合一个 class 只被定义一次的 bean(也就是说,根据 class 不能匹配出多个该 class 的实例) public static Object getBeanByType(Class clazz) { if (clazz == null || context == null) { return null;...
标题提到的问题——“从bean工厂里单例执行方法效率比new对象执行慢很多”,涉及到Java编程中的两种常见对象管理方式:单例模式和直接实例化。这个现象可能让开发者感到困惑,因为通常认为单例模式在性能上具有优势...
但有时Bean的创建可能会被延迟到第一次使用时,这称为懒加载。 1.4.5 自动装配依赖 Spring容器可以根据类型或名称自动装配Bean之间的依赖关系,这种方式可以减少配置工作量,但有时候也会引起问题。 1.4.6 方法...
在Spring框架中,Bean通常指的是被Spring管理的对象,这些对象的生命周期、装配和配置都由Spring容器负责。Spring Bean的配置可以通过XML、注解或Java配置类来完成。 ### Spring Bean的生命周期 Spring Bean的生命...
Spring实现单例模式的方式是通过静态工厂方法`getInstance()`确保任何时候返回的都是同一对象,防止了类的多次实例化。 依赖注入是Spring的核心特性,它允许组件之间的依赖关系在运行时通过容器进行管理,而不是在...
- **BeanFactoryAware**:该接口的`setBeanFactory`方法会被Spring容器回调,将当前的`BeanFactory`实例传递给bean,便于bean访问容器内的其他bean。 - **ApplicationContextAware**:此接口的`...
它遵循工厂模式的原则,使得客户端(也就是使用Spring的开发者)不需要关心bean的创建细节,只需要通过配置或注解声明所需的bean,然后通过Spring容器来获取这些bean的实例。这样,客户端与bean的具体实现逻辑解耦,...
Spring支持单例和原型两种作用域,单例bean只实例化一次,原型bean每次请求都会创建新的实例。 5. 处理依赖注入:在实例化bean后,IoC容器会检查其依赖,并通过设值注入(setter方法)或构造器注入来满足这些依赖。...
每个`@Bean`方法都会被Spring调用一次,以创建对应的Bean实例。 **依赖注入**:在Java配置中,依赖注入可以通过构造函数、setter方法或者字段注解实现。例如,如果`MyService`需要依赖`MyRepository`,可以这样修改...
1. **构造函数创建**:当Bean需要被创建时,Spring会调用其无参构造函数(或通过`@Autowired`注解依赖注入的构造函数)来实例化Bean。 - 如上文代码所示,`Car`类通过无参构造函数进行实例化。 2. **依赖注入**:...
在Spring中,`<beans>`和`<bean>`元素是两个非常重要的元素,它们分别用于定义整个配置上下文和单个Bean的属性。 首先,我们来看`<beans>`元素。它作为配置文件的根元素,提供了几个全局属性来控制所有包含的Bean的...
1. **构造器实例化**:这是最基础的方式,通过指定Bean的class属性,Spring会使用默认的无参构造器创建对象。 2. **静态工厂方法实例化**:如果希望使用静态工厂方法创建对象,可以在配置中指定`factory-bean`和`...