草庐IT

Bean-IOC

全部标签

Java SpringBoot Bean InitializingBean

Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象。Spring初始化bean有两种方式:实现InitializingBean接口,实现afterPropertiesSet方法。(比通过反射调用init-method指定的方法效率要高一点)配置文件中通过init-method指定,两种方式可以同时使用。(init-method方式消除了对spring的依赖)InitializingBean使用场景:通过外部对类是否是

生产中遇到的Spring项目Bean的多次加载问题

问题现象最近在本地调试公司的一个Web项目时,无意中发现日志中出现了两次同一个服务的init记录,项目都是基于Spring来搭建的,按理说服务都是单例的,应该只有一次服务加载日志才对,本着对工作认真负责(闲来无事)的态度,必然要一探究竟。问题分析为什么同一个Bean会被容器初始化两次?首先,我们先来梳理一下Web容器中如何加载Bean:在Web容器中,ContextLoaderListener和DispatchServlet都会在容器启动的时候加载Bean,区别在于DispatchServlet一般会加载MVC相关的Bean,ContextLoaderListener会加载Spring相关的B

生产中遇到的Spring项目Bean的多次加载问题

问题现象最近在本地调试公司的一个Web项目时,无意中发现日志中出现了两次同一个服务的init记录,项目都是基于Spring来搭建的,按理说服务都是单例的,应该只有一次服务加载日志才对,本着对工作认真负责(闲来无事)的态度,必然要一探究竟。问题分析为什么同一个Bean会被容器初始化两次?首先,我们先来梳理一下Web容器中如何加载Bean:在Web容器中,ContextLoaderListener和DispatchServlet都会在容器启动的时候加载Bean,区别在于DispatchServlet一般会加载MVC相关的Bean,ContextLoaderListener会加载Spring相关的B

动态代理类注册为Spring Bean的坑

背景介绍:最近在搭建一个公共项目,类似业务操作记录上报的功能,就想着给业务方提供统一的sdk,在sdk中实现客户端和服务端的交互封装,对业务方几乎是无感的。访问关系如下图:访问关系示意图这里采用了http的方式进行交互,但是,如果每次接口调用都需要感知http的封装,一来代码重复度较高,二来新增或修改接口也需要同步更改客户端代码,就有点不太友好,维护成本较高;能否实现像调用本地方法一样调用远程服务(RPC)呢,当然是可以的,并且也有好多可以参考的例子。例如,feignclient的实现思路,定义好服务端的接口,通过Java代理的方式创建代理类,在代理类中统一封装了http的调用,并且将代理类作

动态代理类注册为Spring Bean的坑

背景介绍:最近在搭建一个公共项目,类似业务操作记录上报的功能,就想着给业务方提供统一的sdk,在sdk中实现客户端和服务端的交互封装,对业务方几乎是无感的。访问关系如下图:访问关系示意图这里采用了http的方式进行交互,但是,如果每次接口调用都需要感知http的封装,一来代码重复度较高,二来新增或修改接口也需要同步更改客户端代码,就有点不太友好,维护成本较高;能否实现像调用本地方法一样调用远程服务(RPC)呢,当然是可以的,并且也有好多可以参考的例子。例如,feignclient的实现思路,定义好服务端的接口,通过Java代理的方式创建代理类,在代理类中统一封装了http的调用,并且将代理类作

Spring IOC官方文档学习笔记(五)之bean的作用域

1.Bean的作用域(1)Bean的作用域即Bean实例的作用范围,Spring支持6种bean的作用域,其中4种只能在web环境中使用,具体如下作用域描述singleton默认作用域,采用单例模式,Spring只会创建一个该bean实例,每次请求时Spring返回的都是同一个bean实例prototype采用原型模式,Spring会创建多个该bean实例,每次请求时Spring返回的都是一个新的bean实例request仅用于web环境,Spring会为每次Http请求创建一个新的bean实例session仅用于web环境,Spring会为每个Session创建一个新的bean实例appli

Spring IOC官方文档学习笔记(五)之bean的作用域

1.Bean的作用域(1)Bean的作用域即Bean实例的作用范围,Spring支持6种bean的作用域,其中4种只能在web环境中使用,具体如下作用域描述singleton默认作用域,采用单例模式,Spring只会创建一个该bean实例,每次请求时Spring返回的都是同一个bean实例prototype采用原型模式,Spring会创建多个该bean实例,每次请求时Spring返回的都是一个新的bean实例request仅用于web环境,Spring会为每次Http请求创建一个新的bean实例session仅用于web环境,Spring会为每个Session创建一个新的bean实例appli

Spring(二):IoC理论推导

在Spring的简介中我们知道了Spring的核心是控制反转(IoC:InverseofControl)和面向切面编程(AOP:AspectOrientedProgramming),我们不直接对IoC进行学习,而是先学习IoC的理论推导。   这是我一个maven项目的结构。UserDao:packagecom.jms.dao;publicinterfaceUserDao{voidgetUser();}UserDaoImpl:packagecom.jms.dao;publicclassUserDaoImplimplementsUserDao{@OverridepublicvoidgetUser

Spring(二):IoC理论推导

在Spring的简介中我们知道了Spring的核心是控制反转(IoC:InverseofControl)和面向切面编程(AOP:AspectOrientedProgramming),我们不直接对IoC进行学习,而是先学习IoC的理论推导。   这是我一个maven项目的结构。UserDao:packagecom.jms.dao;publicinterfaceUserDao{voidgetUser();}UserDaoImpl:packagecom.jms.dao;publicclassUserDaoImplimplementsUserDao{@OverridepublicvoidgetUser

Spring(三):IoC的本质

一、图例  对照上面的图,我们回想上一篇中几个代码的实现,在没有set注入之前,代码运行完全由Service层控制,用户没有选择权,选择权在程序员手中;但是使用set注入之后,用户可以主动控制service层要执行带代码,具体执行由用户自己选择。二、本质控制反转(IoC)是一种设计思想,DI(DependencyInjection依赖注入)是实现IoC的一种方法。在没有IoC的程序中,对象的创建以及对象之间的依赖完全在硬编码在程序中,对象的创建是由程序自己控制,是一成不变的(是指在不修改代码的前提下无法改变);但在有IoC的程序中,对象的的创建由第三方控制,我们无需对代码做出更改即可使程序的执