1. spring 配置概述
使应用程序中的 spring 容器启动成功,因具备的条件:
Bean配置信息是Bean的元数据信息,由4方面组成 :
Spring容器,Bean配置信息,Bean实现类以及应用程序的关系 :
2. 基于 XML 的配置
- 基于XML的配置,Spring采用Schema格式的配置方案为许多领域的问题提供了简化的配置方法,简化了配置工作
采取基于Schema的配置格式,文件头的声明会复杂一些,看一个示例:
在上面定义了3种命名空间:
- 默认命名空间: 没有空间名,用于Spring Bean的定义
- xsi标准命名空间: 这个命名空间用于为每个文档中的命名空间指定响应的Schema样式文件,是W3C定义的标准命名空间
- aop命名空间: 这个命名空间是Spring配置AOP的命名空间,即一种自定义的命名空间
命名空间的定义分为两个步骤:
指定命名空间的名称 : 需要指定命名空间的缩略名和全名
如:xmlns:aop="http://www.springframework.org/schema/aop"
aop为命名空间的别名,文档后面的元素可以通过命名空间的别名加以区分,如<aop:config/>
,而http://www.springframework.org/schema/aop为空间的全限定名,习惯上用文档发布机构的官方网站或相关网站目录作为全限定名
如果命名空间的别名为空,则表示该命名空间为文档默认命名空间。文档中无命名空间前缀的元素都属于默认命名空间,如<beans/>
属于在①处定义的默认命名空间指定命名空间在Schema文档格式文件的位置,用空格或回车换行分隔 :为每个命名空间指定对应的Schema文档格式的定义文件
语法:<命名空间 1> <命名空间 1 Schema文件> <命名空间 2> <命名空间 2 Schema文件>
指定命名空间的Schema文件地址有两个用途:
- XML解析器可以获取Schema文件并对文档进行格式合法性验证
- 在开发环境下,IDE可以引用Schema文件对文档编辑提供诱导功能(自动补全功能)
对Schema文件的用途进行说明 :
3. Bean 的基本配置
- id为这个Bean 的名称,通过容器的getBean(“Foo”)可以获取对应的Bean,在容器中祈祷定位查找的作用,class属性指定了Bean对应的实现类
4. Bean 的命名
- id 在IoC容器中必须是唯一的,满足XML对id的命名贵方:必须以字母开始,后面可以是字母,数字,连字符。下划线,句号,冒号等完整结束的符号,逗号和空格这些非完整结束符是非法的
- name 可以使用任何字符命名,包括特殊字符。
id和name都可以指定多个名字,名字之间可以逗号,分号或空格分隔
如果有多个 name 相同的 bean,则通过getBean()获取Bean时,将返回后面声明的那个Bean,因为后面那个覆盖了前面的。所以建议使用 id
扫描二维码关注公众号,回复: 1888348 查看本文章- 如果id和name两个属性都没指定,如,Spring将自动将全限定类名作为Bean的名称
4. 依赖注入:属性注入,构造函数注入,工厂方法注入
属性注入(最常用的注入方式): 指通过 setXxx() 方法注入 Bean 的属性值或依赖对象,属性注入具有可选择性和灵活性高的优点
- 属性注入要求Bean提供一个默认的构造函数,并为需要注入的属性提供的Setter方法。 Spring先调用Bean 的默认构造函数实例化Bean对象,然后通过反射的方式调用Setter方式注入属性值
- spring 只会检查 Bean 中是否有对应的 setter 方法,至于 bean 中是否有对应的属性成员变更则不做要求
javaBean 关于属性命名的特殊规范
一般Java的属性名都以小写字母开头,但JavaBean也允许以大写字母开头的属性变量名,但必须满足”前两个字母要么全部大写,要么全部小写” 的要求,为了避免错误,可以将像QQ,MSN,ID等专业术语在Java中一律调整为小写,保证命名的统一性构造函数注入: 保证一些必要的属性在Bean实例化时就得到设置,确保Bean实例化后就可以使用
- **按类型匹配入参 :**spring 的配置文件采用和元素标签顺序无关的策略
在配置文件中使用构造函数注入的配置方式装配这个car Bean:
- 按索引匹配入参: 如果Car构造函数有两个类型相同的入参,仅通过type就无法确定对应关系,这时需要通过入参索引来进行确定
Spring无法确定对应的是brand还是corp,因此通过显式指定参数的索引:
- 联合使用类型和索引匹配入参 :
- 通过自身类型反射匹配入参: 如果Bean构造函数入参的类型是可辨别的(非基础数据类型且入参类型各异),由于Java反射机制可以获取构造函数入参的类型,即使构造函数注入的配置不提供类型和索引的信息,Spring依然可以正确完成构造函数的注入工作
- 循环依赖问题 : Spring容器对构造函数配置的Bean进行实例化有一个前提,即Bean构造函数入参引用的对象必须已经准备就绪。 如果两个Bean都采用构造函数注入,而且都通过构造函数入参引用对方,会有类似死锁的循环依赖问题
这时就需要使用属性注入
- **按类型匹配入参 :**spring 的配置文件采用和元素标签顺序无关的策略
- 工厂方法注入:
- 非静态工厂方法: 必须实例化工厂类后才能调用工厂方法
工厂类负责创建一个或多个目标类实例,工厂类方法一般以接口或抽象类变量的形式返回目标类实例:
public class CarFactory {
//创建Car的工厂方法
public Car createTeslaCar(){
Car car=new Car();
car.setBrand("特斯拉modelS");
return car;
}
}
工厂方法的注入 :
注: 由于 carFactory 工厂类的工厂方法非静态,所以要首先定义一个工厂类的 Bean,然后通过 factory-bean 引用工厂实例,最后通过 factory-method 指定对应的工厂类方法 - 静态(static)工厂方法:
public class CarFactory {
public staticCar createTeslaCar(){ //工厂类方法是静态的
...
}
}
当使用静态工厂类型的方法后,用户就无须在配置文件中定义工厂类的Bean,只需:
- 非静态工厂方法: 必须实例化工厂类后才能调用工厂方法