`
toknowme
  • 浏览: 139869 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring bean无法初始化

 
阅读更多
今天在开发的时候,想在Bean初始化的时候,将数据库中的数据加载到Redis中所以写了一个Bean,具体如下:
 
(1)加载Bean
package com.crm.application;

import java.sql.Connection;
import java.sql.Statement;

import javax.servlet.ServletContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.context.ServletContextAware;

import com.crm.application.load.RedisLoadThread;
import com.crm.h2.H2Manager;
import com.crm.h2.load.H2LoadThread;

public class CrmApplication implements InitializingBean, ServletContextAware{
 
 private Log log = LogFactory.getLog(CrmApplication.class);
 
 public void setServletContext(ServletContext arg0) {
  log.info("-------------------------【Crm系统初始化】开始-------------------------");
  try {
   
   log.info("----------【H2处理】----------");
   Connection conn = H2Manager.getConnection();
   Statement stmt = conn.createStatement();
   stmt.executeUpdate(H2Manager.getCreateCrmTranslateKindSql());
   stmt.executeUpdate(H2Manager.getCreateCrmTranslateMapSql());
   conn.close();
   new H2LoadThread().start();
   
   log.info("----------【Redis加载】----------");
   new RedisLoadThread().start();
   
  } catch (Exception e) {
   e.printStackTrace();
  }
 
  log.info("-------------------------【Crm系统初始化】结束-------------------------");
 }
 
 
 //InitializingBean
 public void afterPropertiesSet() throws Exception {
  log.info("afterPropertiesSet...");
 }
 
}
 
 
 
(2)Bean配置
<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"

xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"

xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"

xsi:schemaLocation="  

        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd  

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd  

        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd  

        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.1.xsd  

        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd  

        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"

default-lazy-init="true">


<context:component-scan base-package="com.crm.service" />

<context:component-scan base-package="com.crm.repository" />


<bean id="CrmContext" class="com.crm.application.CrmContext" ></bean>

<bean id="CrmApplication" class="com.crm.application.CrmApplication" ></bean>
 
(3)系统启动
可是系统启动的时候,死活不实例化CrmApplication这个Bean,令人费解
找了很久,竟然发现
default-lazy-init="true"

这句话导致的

 
(4)错误分析
 
 
(4.1)InitializingBean接口
为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法,可以获取spring的所有配置信息。但不是100%执行,就想我遇到的这种情况。
 

(4.2)实现ServletContextAware

可以获得servletcontext


 

(4.3)default-lazy-init="true":经常性的拷贝,也不理解这句话的含义


 
spring的容器是提供了lazy-load的,即默认的缺省设置是bean没有lazy-load,该属性处于false状态,这样导致spring在启动过程导致在启动时候,会默认加载整个对象实例图,从初始化ACTION配置、到service配置到dao配置、乃至到数据库连接、事务等等。 

这么庞大的规模,难怪spring的启动时间要花将近1分钟。尝试了一下,把beans的default-lazy-init改为true就,再次启动,速度从原来的55秒,降到8秒钟!!Great!虽然是非常小一个改动,但是影响确实非常大。 

详细内容参考:http://thinkerandthinker.iteye.com/blog/1337706

 
说白了,就是一旦在beans中配置了default-lazy-init="true",bean只有在用到的时候才进行实例化,并不会在启动的实例化
 
 
 
(5)扩展:控制Bean的初始化
 
(5.1)监听模式
implements ServletContextListener 
 
(5.2)配置init-method方式
<bean id="CrmApplication" class="com.crm.application.CrmApplication" init-method=""></bean>
 
(5.3)接口模式
implements InitializingBean
 
(5.2)VS(5.3):
 

在spring初始化bean的时候,如果该bean是实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则是先调用afterPropertiesSet方法,然后在调用init-method中指定的方法。

 
 
 
 
0
1
分享到:
评论

相关推荐

    Spring Bean创建初始化流程.docx

    9. **Bean初始化**: 最后,`initializeBean(beanName, exposedObject, mbd)`对创建好的Bean进行初始化,包括调用初始化方法(如果有`@PostConstruct`注解的方法),以及执行AOP代理等操作。 整个流程中,Spring...

    详解Spring 中如何控制2个bean中的初始化顺序

    Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...

    Spring Bean的初始化和销毁实例详解

    Spring Bean的初始化和销毁实例详解 Spring Bean的初始化和销毁是Spring框架中一个非常重要的概念,它们都是Bean生命周期中不可或缺的一部分。在Spring框架中,我们可以使用多种方式来控制Bean的初始化和销毁,以下...

    Spring bean初始化及销毁你必须要掌握的回调方法.docx

    下面将详细介绍如何通过不同方式定义Spring Bean的初始化和销毁回调方法。 **初始化回调方法** 1. **@PostConstruct注解** 这个Java标准注解用于标记一个方法,该方法将在对象完全构造后但在业务逻辑执行前被调用...

    浅谈spring容器中bean的初始化

    在Spring框架中,Bean的初始化是一个关键的概念,它涉及到Bean的生命周期管理以及Spring容器如何创建、配置和管理这些Bean。本文将深入探讨Spring容器中Bean的初始化过程。 首先,Spring容器根据XML配置文件(如`...

    springBean加载过程源码解析文档,附有代码类名和行数

    Spring Bean 加载过程是 Spring 框架中最核心的部分之一,涉及到 ApplicationContext 的初始化、Bean 的加载和注册等过程。在 Spring Boot 应用程序中,SpringApplication 负责加载和管理 Bean。 SpringApplication...

    spring bean XML配置入门

    一旦XML配置加载到Spring容器中,容器将根据配置创建Bean实例,并按照定义进行初始化、依赖注入,最后完成Bean的生命周期管理。 10. **实践操作**: 在实际开发中,我们可以使用Eclipse的Spring插件来简化Bean...

    spring的初始化

    Spring提供了两种主要的方式来实现bean的初始化:通过实现`InitializingBean`接口和使用`init-method`属性。 首先,`InitializingBean`是一个Spring提供的接口,包含一个方法`afterPropertiesSet()`。当Spring容器...

    spring bean的生命周期

    - **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...

    Spring实例化Bean顺序

    但是,这并不总是可靠的,因为Spring通常会延迟初始化Bean,除非显式要求或存在依赖关系。 2. **依赖注入**:Spring容器会根据Bean之间的依赖关系来决定实例化顺序。如果一个Bean依赖于另一个Bean,那么被依赖的...

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

    3. **@PostConstruct与初始化回调**:Spring允许我们在Bean初始化后执行特定代码,通常通过`@PostConstruct`注解的方法来实现。如果这个方法被意外地调用了两次,那么Bean也会被构造两次。检查是否有多处调用或配置...

    Spring bean 动态注册,jar包热替换

    Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class...测试示例中是spring boot 的部分代码,动态加载的内容为接口实现类,且初始化时加载本地的实现类,动态加载后改为非程序加载目录中的jar实现类。

    Spring Bean 加载顺序 .

    7. **Bean初始化**: 实例化完成后,Spring会执行Bean的初始化方法,包括调用`@PostConstruct`注解的方法。同时,如果Bean实现了InitializingBean接口,其`afterPropertiesSet()`方法也会被调用。 8. **初始化后...

    spring bean life cycle

    通过实现`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`方法,可以在Bean初始化前后进行额外的操作。 在Spring容器中,Bean的生命周期管理也支持通过`BeanDefinition`进行定制。例如,...

    实例化Spring bean的两种工厂方法

    Spring Bean是Spring IoC容器管理的对象,这些对象的生命周期、依赖关系以及初始化行为由Spring容器控制。实例化Spring Bean的方式多种多样,包括XML配置、注解配置以及Java配置等。而工厂方法是其中一种自定义实例...

    初始化后可访问Spring管理的Bean

    初始化后可访问Spring管理的Bean

    Spring源码学习六:bean初始化1

    在本篇文章中,我们将深入探讨Spring源码中关于Bean初始化的过程,特别是`finishBeanFactoryInitialization()`方法和`preInstantiateSingletons()`方法。 首先,`finishBeanFactoryInitialization(Confi‌...

    spring bean 属性总结

    - **init-method属性**:指定Bean初始化方法,通常用于资源的初始化。 - **destroy-method属性**:指定Bean销毁方法,用于清理资源。 - **factory-bean/factory-method属性**:通过工厂方法创建Bean。`factory-...

    Spring 源码分析(Bean的初始化)

    总结起来,Spring的Bean初始化是一个复杂而精细的过程,涉及XML解析、BeanDefinition的构建、依赖注入、初始化回调、AOP代理等多个环节。通过深入理解这一过程,开发者能更好地掌握Spring框架的工作原理,从而更高效...

    spring bean的生命周期测试代码

    4. **容器回调**:在Bean初始化之后,Spring容器可能会调用自己的回调方法,如`BeanPostProcessor`接口实现的`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`方法,允许自定义逻辑进一步...

Global site tag (gtag.js) - Google Analytics