天天看点

spring bean定义

id和name

id有命名限制,比如必须以字母开头,在配置文件中id必须唯一

name没有命名限制,在配置文件中可以有多个name一样的bean,getBean时返回最后定义的那个bean

如果二者都没定义,例 <bean class="abc.a">, 默认以全限定类名作为bean名,getBean("abc.a");

如果二者都没定义,并有多个<bean class="abc.a">,则第一个bean用getBean("abc.a")获取,第二个用getBean("abc.a#1")获取,以此类推。

属性注入

命名规则,要么前两个字母都大写,要么全部小写

值为字面量时注意5个特殊字符&<>"',如果值中包含特殊字符,有两种解决办法,一种是<![CDATA[ ]]>,另一种是特殊字符替换,比如<替换为<

值为引用时可用<ref>元素,包含三个属性:bean(引用同一个容器或父容器的Bean)、local(只引用同一个配置文件的Bean)、parent(引用父容器的Bean)

如果不用引用,也可以用内部Bean的配置方式,即Bean的定义在Property元素内,这个Bean只能为对应的外部Bean所用,不能用于其他Bean的引用

null值,如果属性值想为null值,不能像这样<property name="abc"><value></value></property>,这样代表值为空字符串,应该为这样<property name="abc"><value><null/></value></property>

properties与map类似,只是properties的键值只能是字符串

构造函数注入

配置项中最好加索引和类型,比如:<constructor-arg index="0" type="java.lang.String"> <value>abc</value></constructor-arg>,0代表第一个参数,type代表参数类型,这样可以精确定位用类中的哪个构造函数

父子bean(集合合并)

子bean可继承父bean的属性,父bean一般会设置abstract="true"(表示不需要实例化),子类中要写 parent="xxx" ,如果属性同名,子bean会覆盖父bean属性,如果想属性合并,比如父类有一个属性是set类型,子类也有一个属性是set类型,如果想属性合并,需要在对应属性中写merge="true"

简化配置

spring bean定义

当然还可以更简洁,即引用p命名空间,格式p:属性名="xxx" ,p:属性名_ref="xxx".

6.Bean的方法替换

创建一个Bean2,其实现类要实现Methodreplacer,配置方法如下:

<Bean id="Bean1" class="com.abc">

<replaced-method name="getXxx" replacer="Bean2"/>  //用Bean2的getXxx方法覆盖Bean1的getXxx方法

</Bean>

<Bean id="Bean2" class="com.abc">

7.Bean依赖

如果一个bean1用ref元素引用另一个bean2,则创建bean1时如果bean2没有bean2则先会创建Bean2,不过有些情况没有用ref引用依赖的Bean2,而又希望bean2在bean1之前创建,此时需要depends-on属性,例如:

<Bean id="bean1" class="com.abc" depends-on="bean2"/>

<Bean id="bean2" class="com.abcd"/>

8.Bean的引用

ref就不用说了,他是引用一个bean实例,而idref是引用一个bean的id,也就是一个string。

9.注解

@Component @Service @Controller @Repository 等价,都是用来注解一个bean的,即定义一个bean

使用注解需要使用context:component-scan元素指定要扫描的包

自动装配Bean 使用@Autowired注解 对类的属性进行标注时,实现类可以没有set函数,他默认根据类型匹配注入相应的bean (另外如果添加required=false,如果没有匹配到bean,不会抛异常。如果添加@Qualifier注解,如果有一个以上的bean匹配是,会根据Qualifier里定义的名字进行匹配)

@Autowired @Resource @Inject 类似, Autowired根据类型匹配,Resource根据名字匹配,Inject根据类型匹配,没有required属性

bean的作用范围需要@Scope注解

@PostConstruct类似init-method

@PreDestory类似destory-method

10.外部属性文件

Bean的属性值可以放到外部属性文件中定义,类似:

当然也可以通过注解的方式实现@Value(${xxx}).

外部属性文件可以加密。

11.spring容器事件

spring的ApplicatonContext能能够发布事件并且允许注册相应的事件监听器,因此它拥有一套完善的事件发布和监听机制。