spring的懒加载和depends-on】的更多相关文章

在spring的IOC容器中,可以通过设置<beans default-lazy-init="XXX"></beans>来设置是否为懒加载模式,懒加载的意思就是说是否在spring容器加载的时候将bean加载到容器中.在没有设置的情况下,默认是false的,就是说不使用懒加载模式. 当设置为false(或者没有设置的时候)tomcat启动的时候出现的是: Initializing Spring root WebApplicationContext log4j:W…
①延迟初始化Bean(惰性初始化Bean)是指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean.  配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean.配置文件: <!--HelloWorld.xml--> <bean id="helloApi" class="cn.javass.spring.chapter2.helloworld.HelloImpl" laz…
代码入口 上文[Spring源码分析]Bean加载流程概览,比较详细地分析了Spring上下文加载的代码入口,并且在AbstractApplicationContext的refresh方法中,点出了finishBeanFactoryInitialization方法完成了对于所有非懒加载的Bean的初始化. finishBeanFactoryInitialization方法中调用了DefaultListableBeanFactory的preInstantiateSingletons方法,本文针对p…
上文[Spring源码分析]Bean加载流程概览,比较详细地分析了Spring上下文加载的代码入口,并且在AbstractApplicationContext的refresh方法中,点出了finishBeanFactoryInitialization方法完成了对于所有非懒加载的Bean的初始化. finishBeanFactoryInitialization方法中调用了DefaultListableBeanFactory的preInstantiateSingletons方法,本文针对preIns…
项目结构如下: ResourceBean.java代码: package com.it.res; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class ResourceBean { private FileOutputStream out; private File file; publ…
默认情况下,容器初始化的时候便会把bean实例化,通常这样做可以让一些配置或者bean实例化的异常在容器启动的时候就发现,而不是在N久之后.但有时候,我们希望某个可能不会用到但又不是100%不用的bean能够在我们用的时候才实例化,这样可以节省系统资源.所以万能的Spring为我们提供了lazy-init属性: <bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true&…
doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireCapableBeanFactory的doCreateBean方法代码: protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[]…
前言 之前两篇文章[Spring源码分析]非懒加载的单例Bean初始化过程(上篇)和[Spring源码分析]非懒加载的单例Bean初始化过程(下篇)比较详细地分析了非懒加载的单例Bean的初始化过程,整个流程始于AbstractApplicationContext的refresh()方法: public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownM…
Spring Jpa这项技术在Spring 开发中经常用到. 今天在做项目用到了Entity的关联懒加载,但是在返回Json的时候,不管关联数据有没有被加载,都会触发数据序列化,而如果关联关系没有被加载,此时是一个HibernateProxy,并不是真实的数据,而导致了报错. 例如这个Topic Entity: @Entity @Table(name = "yms_topics") @Getter @Setter @NoArgsConstructor @EntityListeners(…
之前两篇文章Spring源码分析:非懒加载的单例Bean初始化过程(上)和Spring源码分析:非懒加载的单例Bean初始化过程(下)比较详细地分析了非懒加载的单例Bean的初始化过程,整个流程始于AbstractApplicationContext的refresh()方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40…
上文Spring源码分析:非懒加载的单例Bean初始化过程(上),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireCapableBeanFactory的doCreateBean方法代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41…
懒加载机制 Spring默认会在容器初始化的过程中,解析xml,并将单例的bean创建并保存到map中,这样的机制在bean比较少的时间问题不大,但一旦bean非常多时,Spring需要在启动的过程中花费大量的时间来创建bean,花费大量的空间储存bean,但这些bean可能很久都用不上,这种在启动时在时间和空间上的浪费显得非常的不值得. 所以Spring提供了懒加载机制.所谓的懒加载机制就是可以规定指定的bean不在启动时立即创建,而是在后续第一次用到时才创建,从而减轻在启动过程中对时间和内存…
引用地址 在使用Spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例: @RequestMapping("login") @ResponseBody public Object login(@RequestParam String username,@RequestParam String password){ List<User> list=userDAO.findByUsername(username); if(…
首先,Spring默认是提前加载,这意味着当项目启动,spring初始化,spring会把所有的扫描包下的 ,所有带spring 注解(@Component.@Repository.@Service.@Controller)的类都初始化. 注意:当初始化时,会调用默认构造方法,即一个空的构造方法,但当在类中加入非空构造方法,spring会报错误,显示找不到合适的构造方法. 当spring创建bean时,设置default-lazy-init="true",即懒加载时,spring不会主…
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://j…
在使用spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例: @RequestMapping("login") @ResponseBody public Object login(@RequestParam String username,@RequestParam String password){ List<User> list=userDAO.findByUsername(username); if(list.…
最近在使用spring jpa 的过程中经常遇到懒加载的错误:"` org.hibernate.LazyInitializationException: could not initialize proxy [xxxx#18] - no Session 通过查询资料,整理了一下常见的几种解决办法. 一.spring.jpa.open-in-view 配置 测试 dao 层或者 service 层时,会出现 no Session 的错误:访问 controller 时,又不会出现上面的错误.查询资…
写在前面 Spring在启动时,默认会将单实例bean进行实例化,并加载到Spring容器中.也就是说,单实例bean默认在Spring容器启动的时候创建对象,并将对象加载到Spring容器中.如果我们需要对某个bean进行延迟加载,我们该如何处理呢?此时,就需要使用到@Lazy注解了. 项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotation 懒加载 懒加载就是Spring容器启动的时候,先不创建对象,在第一次使用(获…
Spring中bean的作用域 默认情况下,Spring只为每个在IOC容器里声明的bean创建唯一一个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调用和bean引用都将返回这个唯一的bean实例.该作用域被称为singleton,它是所有bean的默认作用域. 在Spring中使用@Scope注解来设置bean的作用域 不设置作用域时,两个getBean的打印结果 com.atguigu.pojo.Person@76508ed1 com.atguigu.pojo.Pe…
关于延迟加载 在 Spring 中,默认情况下所有定的 bean 及其依赖项目都是在应用启动时创建容器上下文是被初始化的.测试代码如下: @Slf4j @Configuration public class DemoConfig { public DemoConfig() { log.warn(" > > > demoConfig 被初始化 > > >"); } } 启动应用日志: [ main] o.a.c.c.C.[Tomcat].[localh…
出现问题:  SSH整合项目里,项目目录结构如下: 在EmployeeAction.java的list()方法里将employees的list放入到request的Map中. EmployeeAction.java: package com.tt.ssh.actions; import java.util.Arrays; import java.util.Map; import org.apache.struts2.interceptor.RequestAware; import com.ope…
在ApplicationContext容器中,当容器一启动时,所有的bean(单例的)都会被创建和注入依赖,这也被视为IOC容器启动过程中的一个步骤. 那如何让一个bean在需要的时候再被创建,而不是容器一加载的时候呢? 在配置文件的bean标签中,将lazy-init属性设置为true <bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/> &…
1.bean的作用域 1.新建一个maven工程,添加如下依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.5.RELEASE</version> </dependency> 2,新建一个实体Person类 package com.yefengyu…
       首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如果没有这一特性,当查询某一个含有外键的实体对象时,hibernate会把其他实体对象的数据都查询出来.简单的来说,当你想查询某个对象时,实际上调用了多条查询语句.有了延迟加载特性,就避免了这种情况的发生,当你真正的使用get另外一个实体对象时,才再执行下面一条查询语句.           但有些时…
产生原因: 当使用hibernate查询一个对象的时候,如果Session关闭,再调用该对象关联的集合或者对象的时候,会产生懒加载异常! 解决方案: 方案一: 在Session关闭之前,查询对象关联的集合或者对象,所有在业务层的方法上添加: public ElecUser findUserByLogonName(String name) { String condition = " and o.logonName = ?"; Object [] params = {name}; Lis…
1.项目背景概述 事情是这样子的,使用了spring data jpa的项目jeesite jeesite的实体中使用了懒加载模式. 并且一个实体类中还不止一个属性设置了懒加载模式. 项目本身已经存在登录页面,但是我的目的是把此项目当成中间层来给一个.net项目提供服务,不需要一个有页面的登录接口.所以现在我需要重新写个servlet处理登录请求. 如下 如果用户已经登录,用如下方式处理: 如果用户未登录,则进行登录验证: 2.错误描述 然后在vs上写了个winform版的测试程序用来发送登录请…
首先我们来看下面这个图,解释了一个web程序的一次请求流程! 懒加载异常的说明: 懒加载就是我们在查询一个对象时,它所有的属性是否要被查出来! 如果懒加载开启的话,session在service层就被关闭了,而我们的view如果不需要他的属性的话,那就不会出现懒加载异常,如果需要属性,这时候session已经关闭了所以就会出现懒加载异常,这个时候我们就考虑能否把session放到请求完成之后再进行关闭. 解决: 答案当然是可以,那就是使用过滤器,在请求结束之后将session关闭,在web.xm…
问题1:session.flush()调用之后,懒加载还生效吗? 如果不生效,那是抛异常还是没有任何反应,或者直接返回null? 答案:生效.可以理解为在同一个session当中,懒加载只会执行一次. 问题2: 多次调用实体类的导航属性,是否会多次进行sql查询? 如果session.flush()调用之后呢? 答案:不会进行多次sql查询,即使是在session.flush之后. 问题3:新创建的某个实体类对象,当调用session.flush()之后,能否直接加载其导航属性? 比如下方的代码…
首先我们不要在学习Spring的开始产生畏难情绪.Spring没有臆想的那么高深,相反,它帮我们再项目开发中制定项目框架,简化项目开发.它的主要功能是将项目开发中繁琐的过程流程化,模式化,使用户仅在固定文件中增加特定标签并实现特定逻辑层的代码就能完成项目开发.下面我们来分析web项目启动时bean的初始化过程. 我们遵循类的依赖,引用关系来理清spring在这一过程中的架构和细节实现.java web项目入口在web.xml,Spring在此配置入口servlet完成bean的加载.Dispat…
交代本项目中要求获取session的方式如下: public Session getCurrentSession() { // 增删改使用的session,事务必须是开启的(Required,即propagation="REQUIRED"),否则获取不到 return sessionFactory.getCurrentSession(); } public Session getQueryCurrentSession() { // 查询使用的session,,该生成的session没有…