3.在IOC容器中装配Bean
1.spring的bean的三种配置方式:基于XML、基于注解、基于Java类。
基于XML的配置,spring2.0以后使用Schema格式(书P82)。
注1:针对xml文档的schema约束,Spring是把XSD文件放到本地了,再在spring.schemas里做了一个映射,优先从本地里加载XSD文件。
注2:xml可引入<![CDATA[ ]]>特殊处理标签,作用是让XML解析器将标签中的字符串当作普通的文本对待,防止某些字符串对XML个数造成破坏。
注3:null值对应标签<null/>
2.bean的命名:指定id属性(正常情况都用这个)或者指定name属性
id的命名需要满足XML对id的命名规范:必须以字母开头,后面可以是字母、数字、连字符、下划线、句号、冒号等完整结束的符号,空格和逗号这些非完整结束符是非法的; name属性没有字符上的限制,几乎可以使用任何字符。
spring配置文件不允许出现两个相同的id的bean,但却可以出现两个相同name的bean,如果多个name相同的bean,后面的将覆盖前面的bean。
如果id与name都未指定,spring自动将全限定类名作为Bean的名称。如果多个实现类相同的匿名bean,后面的加#加数字。
3.依赖注入三种方式:属性注入、构造函数注入、接口注入(工厂注入)。
注:通过属性注入时,一般情况下,java的属性变量名都以小写字母开头。必须满足“变量的前两个字母要么全部大写,要么全部小写”的要求。
构造函数注入:按类型匹配入参、按索引匹配入参、联合使用类型和索引匹配入参通过自身类型反射匹配入参。(书P91)
4.引用其他bean:<ref>元素可以通过以下三个属性引用容器中其他bean:bean、local、parent。
bean:通过该属性可以引用同一容器或父容器的bean,这是最常见的形式
local:通过该属性只能引用同一配置文件中定义的bean,在开发时它可以利用XML解析器自动检验引用的合法性。
parent:引用父容器中的Bean,如<ref parent="car">的配置说明car的Bean是父容器中的Bean。
5.集合类型属性:主要包括List、Set、Map、Properties,Spring为这些集合类型属性提供了专门的配置元素标签。(书P99)
6.简化配置方式(书P103)
7.自动装配:bean元素提供了一个指定自动装配类型的属性:autowire="<自动装配类型>"
spring提供了4种自动装配类型:byName、byType、constructor、autodetect。
注:与之类似的,利用注解实现spring基本配置:如http://blog.****.net/vstar283551454/article/details/8683708
在Java代码中使用@Autowired或@Resource注解方式进行装配 ,这两个注解的区别是:@Autowired默认按类型装配,@Resource默认按名称装配,当找不到名称匹配的bean才会按类型装配
8.如果要实现在单实例对象获取多实例属性对象:通过实现BeanFactoryAware接口或者lookup方法注入。(书P107)
9.整合多个配置文件:spring允许我们通过<import>元素将多个配置文件引入到一个文件中。
10.bean作用域:singleton(默认单例)、prototype、request、session、globalSession。
后面三个是在web项目里,同时还需要在配置文件中添加http请求的过滤器或监听器。
11.基于注解的配置(书P120):
1>注解定义bean: @Component:普通bean; @Repository:对DAO实现类标注; @Service:对Service实现类进行标注; @Controller:对Controller实现类标注;
2>通过注解定义bean与<bean>元素配置一样,默认作用域singleton,可通过@Scope注解修改作用域。
@PostConstruct和@PreDestroy注解与init-method、destroy-method属性一样,指定bean的初始化及容器销毁前执行的方法。
3>通过context命名空间提供通过扫描类包以应用注解特定Bean的方式,可以使用过滤表达式。
4>自动装配bean: 使用@Autowired:@Autowired 默认按类型匹配方式,在容器查找匹配bean
如果容器有1个以上匹配bean时,使用@Qualifier指定注入bean的名称
12.bean不同配置方式比较(书P133)
一般可以采用XML配置DataSource、SessionFactory等资源Bean,在XML中利用aop、context命名空间进行相关主题的配置。其他所有项目中开发的Bean,都通过基于注解配置的方式进行配置,即整个项目采用“基于XML+基于注解”的配置方式,很少采用基于Java类的配置方式。