bean

SpringIOC——DI循环依赖

ε祈祈猫儿з 提交于 2020-03-01 06:28:27
要弄清楚循环依赖 1、需要知道Bean初始化的两个阶段 ① Bean实例化创建实例对象(new Bean()) ② Bean实例对象初始化(DI在自动注解注入) 2、DefaultSingletonBeanRegistry类中的5个容器 /** 记录已将创建的单例<beanName,singletonBean> */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); /** 记录singletonFactory<beanName,singletonFactory> singeletonFactory中存放beanName和上面的①:Bean实例化实例对象(还未初始化DI)*/ private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16); /** 记录早期的singletonBean 存放的也是① */ private final Map<String, Object> earlySingletonObjects = new HashMap<>(16); /** 存放已经初始化后的beanName,有序 */ private final Set<String>

看看Spring源码(二)——bean实例化

故事扮演 提交于 2020-03-01 06:11:59
本文出于我的独立博客: Geeekr 首先来看一段代码,看过上一节的朋友肯定对这段代码并不陌生。这一段代码诠释了Spring加载bean的完整过程,包括读取配置文件,扫描包,加载类,实例化bean,注入bean属性依赖。 public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory

Spring什么时候实例化bean

好久不见. 提交于 2020-03-01 05:10:30
Spring什么时候实例化bean,首先要分2种情况 第一:如果你使用BeanFactory作为Spring Bean的工厂类,则所有的bean都是在第一次使用该Bean的时候实例化 第二:如果你使用ApplicationContext作为Spring Bean的工厂类,则又分为以下几种情况: (1):如果bean的scope是singleton的,并且lazy-init为false(默认是false,所以可以不用设置),则 ApplicationContext启动的时候就实例化该Bean,并且将实例化的Bean放在一个map结构的缓存中,下次再使用该Bean的时候, 直接从这个缓存中取 (2):如果bean的scope是singleton的,并且lazy-init为true,则该Bean的实例化是在第一次使用该Bean的时候进行实例化 (3):如果bean的scope是prototype的,则该Bean的实例化是在第一次使用该Bean的时候进行实例化 来源: oschina 链接: https://my.oschina.net/u/2494018/blog/536057

spring中bean的加载时间

余生颓废 提交于 2020-03-01 05:07:09
1.从ApplicationContext中取bean ApplicationContext ac = new ClassPathXmlApplicationContext("/com/bean.xml"); 当我们实例化bean.xml时,该文件中配置的bean都会被实例化。(该bean scope是singleton) 2. 从BeanFactory中取bean BeanFactory factory= new XmlBeanFactory(new ClassPathResource("/com/bean.xml")); factory.getBean("student"); //取bean的时候才会实例化 当使用beanfactory去获取bean,当你只是实例化该容器,那么容器内的bean不会被实例化,只有当使用某个bean(getBean)时,才会实时去实例化该bean。 总结 1.如果使用ApplicationContext,则配置的bean如果是singleton不管你用还是不用,都被实例化。好处是可以预先加载,坏处是浪费内存。 2.BeanFactory,当使用BeanFactory实例化对象时,配置的bean不会马上被实例化。当你使用该bean时才会被实例化(getBean)。好处是节约内存,缺点是速度比较慢。多用于移动设备的开发上。 3.一般没有特殊要求

20200229——Spring复习 框架概述以及spring中基于xml的配置 一

百般思念 提交于 2020-03-01 02:59:39
spring是分层的javaSE/EE应用,full-stack轻量级开源框架,以IOC控制反转和AOP面向切面编程 spring的优势 方便解耦,简化开发 通过IOC容器,可以将对象的关系交给Spring进行控制管理,避免硬编码所造成的过度程序耦合,用户也不必再为单例模式,属性文件解析这些很底层的代码进行编写 我觉得就是依赖注入和依赖查找 削减耦合,并不是完全消除 AOP编程支持 程序间的耦合 比如jdbc程序,如果我们不引入mysql的驱动包,程序就运行不了 耦合:程序间的依赖关系 包括两种,类之间的依赖关系 方法间的依赖关系 解耦:降低程序间的依赖关系 实际开发中 编译器不依赖,运行时才依赖 解耦的思路 第一步,使用反射来创建对象,而避免使用关键字new 第二步,通过配置文件来获取创建的对象全限定类名 上升到java web 在没有使用spring的时候,表现层调用业务层,需要创建业务层对象的实例 但是这样就具有了耦合行 javabean bean 在计算机语言中,有可重用的组件 spring就相当于相当于一个bean工厂 创建service和dao对象 第一个 需要配置文件来配置我们service和dao 配置的内容,全限定类名与唯一标识 key,value 第二个 通过读取配置文件中配置内容,创建反射对象 自定义Spring 创建一个BeanFactory 有一个属性

【Spring源代码阅读之七】执行postProcessBeanFactory方法对@Configuration配置类的@Bean方法进行CGLIB代理增强

允我心安 提交于 2020-03-01 01:49:52
执行ConfigurationClassPostProcessor#postProcessBeanFactory方法对@Configuration配置类的@Bean方法进行CGLIB代理增强 导图 在哪调用到这里的 ConfigurationClassPostProcessor#postProcessBeanFactory enhanceConfigurationClasses ConfigurationClassEnhancer#enhance newEnhancer CALLBACK_FILTER ConfigurationClassEnhancer.BeanMethodInterceptor BeanMethodInterceptor#intercept BeanAnnotationHelper#determineBeanNameFor isCurrentlyInvokedFactoryMethod resolveBeanReference ConfigurationClassEnhancer.BeanFactoryAwareMethodInterceptor createClass 导图 在哪调用到这里的 ConfigurationClassPostProcessor#postProcessBeanFactory /** * 使用CGLIB代理增强

Spring个人笔记

断了今生、忘了曾经 提交于 2020-02-29 21:04:17
xml配置 1.xml基本结构: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions go here --> </beans> 其中id是bean字符串,bean的唯一标识符,相当于对象名,class是bean类名的完全限定路径 2.别名

spring-mvc源码阅读笔记

爱⌒轻易说出口 提交于 2020-02-29 19:37:13
简要的做一些spring-mvc部分的源码学习笔记 Spring-mvc做的工作主要是俩大方面吧:一个是初始化一个ioc容器,一个是mvc部分的控制和视图模块的实现。 先说下ioc容器的初始化部分:ioc的初始化主要在俩个地方,一个是contextLoadListener里,另一个在DispatcherServlet里。 contextLoadListener: 在contextLoadListener里初始化的ioc容器是整个web项目里的一个父容器。整个初始化的过程也比较简单,首先是实例化一个context,具体是哪个context类呢,我们可以在web.xml的配置里指定,不过我们一般也不会指定这个参数,所以就直接实例化了一个默认的context-XmlWebApplicationContext。实例化以后,就开始加载我们配置文件里的那些bean。配置文件的位置我们一般都在web.xml里进行了配置。具体的加载的过程都在refresh()方法里。 这refresh方法里我们一般比较关心的是不同类型的bean的注册的过程还有实例化的过程。具体的注册过程就不再说了。 在注册完成后,会首先实例化一些ioc关心的bean,比如各种processor,还有一些特定类型的bean,具体可以细看下代码。然后会把实例化后的一些在ioc容器里有特定功能的bean进行注册

Spring Aop详解

扶醉桌前 提交于 2020-02-29 16:40:27
一、AOP背景 aop(aspect oriented progrmming), 面向切面编程. 在oop的概念中, 开发者可以自由的定义纵向关系, 但对横向的关系却有点束手无策. Aop技术的出现可以解决这一问题. 进一步描述问题:   代码混乱: 越来越多的非业务需求(日志和验证等)加入后, 原有的业务方法急剧膨胀, 每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点.    代码分散: 以日志需求为例, 只是为了满足这个单一的需求, 就不得不在多个模块(方法)里多次重复相同的日志代码.如果日志需求发生变化,必须更改所有的模块. aop的主要编程对象是切面,而切面模块化横切关注点. 在应用aop编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能在哪里,以什么方式应用, 并且不必修改受影响的类 aop的好处:   每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级   业务模块更简洁, 只包含核心业务代码 二、AOP基本概念 切面(Aspect): 横切关注点, 跨越应用程序多个模块的功能, 被模块化的特殊对象 通知(Advice): 切面必须要完成的工作 目标(Target): 被通知的对象 代理: 向目标对象应用通知之后创建的对象 连接点(JoinPoint): 程序执行的某个特定位置. 连接点由两个信息确定: 方法表示的程序执行点; 相对点表示的方位. 切点