1.bean 就是由spring容器(org.springframework.beans.factory.BeanFactory)初始化,装配,及管理的对象,BeanFactory是IoC容器的核心接口.
2.ApplicationContext 接口是 BeanFactory接口的扩展,继承BeanFactory.
3.XML配置元数据结构:将配置文件拆分成多个部分是非常有用的,为了加载多个XML文件生成一个ApplicationContext实例,可以将文件路径作为字符数组传给ApplicationContext构造器(如ClassPathXmlApplicationContext).另一种方法是使用<import/>元素,如<import resource="services.xml">.我们一般更倾向于第一种做法,因为这样各个配置并不会察觉到它们与其他配置文件的组合.
4.实例化Bean:
^1.(By构造器)当我们采用XML描述配置元数据时候将通过<bean/>元素的class属性来制定的实例化对象的类型.容器将直接通过反射调用指定累的构造器来创建bean(类似 new),
^2.(By静态工厂方法)除了指定class属性外,还需要factory-method属性来指定创建bean实例的工厂方法,spring将调用此方法返回对象,注意我们并不需要指定此方法返回对象类型!
<bean id="exampleBean" class="org.ExampleBean" factory-method="getInstance"/>
^3.(By实例工厂方法)与2类似,容器先实例化beanA,用beanA调用它们工厂方法去生产beanB.为使用此机制,beanB的class属性必须为空,beanB必须新增一个属性factory-method用来指定包含生产beanB工厂方法的beanA的名称.
<bean id="beanA" class="org.beanBFactory"/>
<bean id="beanB" factory-bean="beanA" factory-method="createBInstance"/>
-----------------------------------------------------------------------------------------------------------------------------
1.依赖注入(DI)背后的基本原理是对象间的依赖关系,只会通过一下几种方式来实现:
^构造器参数
^工厂方法的参数
^给构造方法或工厂方法创建的对象设置属性.
因此,容器的工作就是创建bean时注入那些依赖关系.相对于bean自己控制其实例化,直接在构造中指定依赖关系自主控制依赖关系注入方法说,控制从根本上发生了倒转,这也正是(IoC)控制反转的由来.
BeanFactory对于它所管理的bean提供两种注入依赖方式,需要注入的依赖将保存在org.springframework.beans.factory.config.BeanDefinition中,它能一句指定的PropertyEditor实现完成数据类型的装换(如dataSource中的<property />元素的 'value'属性).我们采用XML方式来定义,在内部这些定义将被装换成相应类实例,并最终得到一个Spring IoC容器实例.
^1.构造器注入:
^^类型明确,按顺序自己动匹配
构造方法如 :public Foo(Bar,Baz baz){
//...
}
假如 Bar Baz 不存在关系:
<bean name="foo" class="x.y.Foo">
<constructor-arg> <bean class="x.y.Bar"></constructor-arg>
<constructor-arg> <bean class="x.y.Baz"></constructor-arg>
</bean>
^^但是当使用原始数据类型时,我们需要使用'type'属性显示指定那些构造参数类型如:
<bean id="examBean" class="org.ExamBean">
<constructor-arg type="int" value="111">
<constructor-arg type="java.lang.String" value="lzpeng">
</bean>
^^我们也可以通过显示指定构造参数的索引,如:
<bean id="examBean" class="org.ExamBean">
<constructor-arg index="0" value="111">
<constructor-arg index="1" value="lzpeng">
</bean>
^2.setter注入:
//...........
2.处理bean依赖关系步骤:
^1.根据定义bean的配置(文件)创建并初始化BeanFactory实例.(容器这时会验证每个bean配置,如引用属性是否有效,循环依赖等.)
^2.每个bean的依赖将以属性,构造器参数,静态工厂方法参数的形式出现,当这些bean被实际创建时,这些依赖将会提供给bean.
^3.每个属性或构造器参数可以是实际的值,也可以是对该容器另一个bean的引用.
^4.每个指定的属性或构造器参数值必须能够被转换成特定的格式或构造参数所需的类型.
3.一种配置,多种方式(For Best Practice):
^1.<bean id="dataSource" class="x.y.DataSource">
<property name="driverClass">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>com.mysql.jdbc.Driver</value>
</property>
</bean>
^2.<bean id="dataSource" class="x.y.DataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="url" value="com.mysql.jdbc.Driver"/>
</bean>
4.????
^1.idref元素允许在容器部署时验证所引用的bean是否存在,所以我们用<idref />元素,而非用<property />元素的'value'属性.
^2.<ref /> 的属性 - 'bean' OR 'local'
^^1.bean属性我们可以指定任何存在的bean的name OR id.
^^2.local属性我们只能指定同一文件中的 bean 的 id 属性值.
^^另:我们可以通过ref元素的parent属性指定父容器中的bean
^3.通过<list/>,<set/>,<map/>,<props>元素分别对应java中的List,Set,Map,Properties对应.
5.延迟初始化bean:
<bean id="lazy" class="x.y.BeanA" lazy-init="true"/> //缺点:如果有错误只能当程序用到它时被发现
<bean id="not.lazy" class="x.y.BeanB" />
lazy Bean不会在ApplicationContext启动时候实例化,但如果beanB依赖beanA,那么容器启动时beanA照样被实例化.
other --- <beans default-lazy-init="true">
6.自动装配(autowire)协作者(引用其它bean)
//..............
----------------------------------------------------------------------------------------------------
Bean的作用域:
1.singleton(spring默认作用域) : 每个IoC容器中一个bean定义对应一个对象实例(该实例在IoC容器中共享),该实例会被存储到单例缓存(singleton cache)中.
2.prototype(资源浪费者):一个bean定义对应多个对象实例.每次对该bean的请求(XML中对它每个引用,每次getBean())时都会创建一个新的bean实例.
^<bean id="StuService" class="x.y.StuService" scope="prototype">
^<bean id="StuService" class="x.y.StuService" singleton="false">
对于prototype作用域bean,我们需要自己释放它持有的资源 (可通过 bean后置处理器)
3.request
4.session
5.global
----------------------------------------------------------------------------------------------------
定制自己的Bean
^1.初始化回调 : 我们可以采用 <bean />元素的 'init-method'属性指定bean初始化方法.
^2.析构回调 : 我们可以采用 <bean />元素的 'destroy-method'属性指定bean析构方法.
<beans default-init-method="init">
另:在非web应用中关闭容器 - 调用AbstractApplicationContext实现的registerShutdownHook().
分享到:
相关推荐
spring学习笔记1
在本篇Spring学习笔记中,我们将深入探讨Spring的几个关键知识点,包括其优点、AOP的实现原理以及声明式事务管理。 首先,Spring的优点在于它的轻量级特性,它不对现有类结构造成入侵,允许开发者专注于业务逻辑。...
Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Spring...
Spring学习笔记( spring视频笔记)
spring学习笔记
### Spring学习笔记(精华全记录) #### Spring框架概述 Spring框架源自Rod Johnson的个人项目,最初于2002年末发布。Spring并非一开始就作为一个完整的框架出现,而是从一个项目逐步发展而来。随着项目的成熟,...
本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...
这份"Spring学习笔记+学习源码.zip"资源包含了深入学习Spring及其相关技术的知识点,以及实践代码,对提升Spring技能将大有裨益。 首先,我们来详细讨论Spring框架的主要组件和功能: 1. **依赖注入(Dependency ...
Spring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).doc
根据提供的压缩包文件名,我们可以推测这是一个逐步学习Spring的系列笔记。从"Spring_day1"开始,可能涵盖了Spring的基础概念、环境搭建和基本配置。"Spring_day2"可能涉及了依赖注入和AOP的深入讲解。"Spring_day3...
这份"Spring框架学习笔记"涵盖了Spring框架的基础知识、核心组件以及高级特性,对于初学者来说是一份宝贵的资料。 一、Spring框架概述 Spring框架是为了解决企业应用开发的复杂性而设计的,它提供了一个全面的基础...
“Java Spring学习笔记”是一份宝贵的资源,专门为想要学习和掌握Java Spring框架的开发者而设计。这份学习笔记提供了详细而系统的教程和实践指南,帮助初学者快速入门,并带领已经有一定经验的开发者深入理解和应用...
Spring6学习笔记,师承老杜
Spring Cloud是一套微服务架构下的分布式系统解决方案,提供了在分布式系统环境下快速构建一些常见模式的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式...
"尚学堂Spring学习笔记" 本文档记录了尚学堂Spring学习笔记的重要知识点,涵盖了Spring配置文件的设置、普通属性的注入、自定义属性编辑器、公共属性的注入、Spring注解等内容。 一、Spring配置文件的设置 在...
在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...
### Spring学习笔记知识点详解 #### 一、Spring框架概述 **Spring** 是一个开源的、分层的企业级应用开发框架,旨在简化Java EE应用程序的开发。它的主要目标是提高开发效率,减少耦合度,并提供一种更为简洁的...
8. **Spring学习笔记1——基础知识**: 包含了Spring框架的基本概念,如Bean工厂、ApplicationContext、Bean的作用域、依赖注入的基础知识,以及如何创建和配置Bean。 9. **SqlMapClientTemplate对Ibatis的封装**...
### Spring学习笔记知识点详解 #### 一、Spring框架概述 **1.1 什么是Spring** Spring框架是一个开源的轻量级应用框架,主要用于简化企业级应用程序的开发过程。它的核心特性在于提供了一种灵活的方式来组织和...