创建对象的协作关系称为装配,也就是DI(依赖注入)的本质。而在Spring容器中对bean的创建时就需要对它所依赖的对象进行注入装配。
beans: 整个配置文件的根节点,包含一个或多个Bean元素。在该标记中可配置命名空间与schema的装载路径,还可以通过default-init-method属性为该配置文件中的所有Bean实例统一指定初始化方法,通过default-destroy-method属性为该配置文件中的所有Bean实例统一指定销毁方法,通过default-lazy-init属性为该配置文件中的所有Bean实例统一指定是否进行迟延加载
bean标记:
用该标记定义一个Bean的实例化信息,用以指导Bean工厂正确地进行Bean的生产与装配。由class属性指定类全名,由id(推荐使用)或name属性指定生成的Bean实例名称。init-method属性指定初始化时要调用的方法,destroy-method属性实例销毁时要调用的方法。Bean实例的依赖关系可通过property子标记(set方式注入)或constructor-arg子标记(构造方式注入)来定义。bean标记中的scope属性用以设定Bean实例的生成方式,当scope设置为singleton或默认时以单例模式生成,当scope设置为prototype时则以原型(多例)模式生成。
property: 它是bean标记的子标记,用以调用Bean实例中的相关Set方法完成属性值的赋值,从而完成依赖关系的注入
name: 知道bean实例的属性名称
ref属性或value属性直接指定,也可以通过ref或value子标记指定
ref标记:该标记通常作为constructor-arg、property、list、set、entry等标记的子标记,由bean属性指定一个Bean工厂中某个Bean实例的引用
value标记:该标记通常作为constructor-arg、property、list、set、entry等标记的子标记,用以直接指定一个常量值
list标记:该标记用以封装List或数组类型属性的依赖注入(即赋值),具体的元素通过ref或value子标记指定
set标记:该标记用以封装Set类型属性的依赖注入(即赋值),具体的元素通过ref或value子标记指定
map标记:标记用以封装Map类型属性的依赖注入(即赋值),具体的元素通过entry子标记指定
entry标记:该标记通常用做map标记的子标记,用以设置一个“键/值”对。key属性接收字符串类型的“键”名称,“值”则可由ref或value子标记指定
props标记:该标记用以封装Properties类型属性的依赖注入(即赋值),具体的元素通过prop子标记指定
prop标记:该标记通常用做props标记的子标记,用以设置一个“键/值”对。key属性接收字符串类型的“键”名称,“值”则可放置在prop标记体内
null标记:该标记用于赋一个null值,与在Java中直接为某个属性赋null值效果等同
--------------基于Annotation方式的Bean装配:
在Spring中尽管使用XML配置文件可以完成所有的配置工作,直观表达Java EE程序员的"装配意图",但如果应用中Bean数量成千上万的话,最终会导致XML配置文件体积剧增,面对臃肿的XML配置文件,给维护与升级带来一定的困难。
伟大的Spring开发团队想到了JDK 1.5提供的新特性--Annotation注释技术:
了解了Annotation注释的工作原理之后,方觉得真正伟大的不是Annotation注释本身,而是幕后默默无闻地进行注释处理的Annotation处理器
Annotation处理器是基于JDK的反射机制来实现的,Spring 2.5中定义的一系列Annotation注释
Spring 2.5中常用的Annotation注释说明:
@Autowired:通过@Autowired注解对Bean的属性变量、属性的Setter方法及构造函数进行标注,配合对应的注解处理器AutowiredAnnotationBeanProcessor完成Bean的自动配置工作。
@Autowired注解默认是按Bean类型进行装配的,也就是说注解处理器AutowiredAnnotationBeanProcessor会在Spring容器中寻找与@Autowired注解所在属性同类型的Bean实例进行装配,如果找到多个满足条件的Bean实例时,将会抛出NoSuchBeanDefinitionException异常。
@Autowired注解加上@Qualifier注解的话,可以直接指定一个Bean实例名称来进行装配。
@Resource:@Resource的作用相当于@Autowired,配合对应的注解处理器CommonAnnotationBeanPostProcessor完成Bean的自动配置工作。只不过@Autowired注解默认是按Bean类型进行装配的,而@Resource注解默认是按Bean实例名称进行装配罢了
@Resource有两个属性是比较重要的,分别是name和type。Spring将@Resource注解的name属性解析为Bean实例的名字,而type属性则解析为Bean实例的类型
@Qualifier:如果@Autowired注解加上@Qualifier注解的话,可以将默认按Bean类型进行装配变换为按Bean实例名称进行装配,具体的Bean实例名称由@Qualifier注解的参数指定
@PostConstruct:在Bean中的某个方法上加上@PostConstruct注解,则该方法将会在Bean初始化之后被Spring容器调用,作用等同在Spring配置文件中为bean标签指定init-method属性
@PreDestroy:在Bean中的某个方法上加上@PreDestroy注解,则该方法将会在Bean实例被销毁之前由Spring容器进行调用,作用等同在Spring配置文件中为bean标签指定destroy-method属性