spring bean中属性解释:
<bean abstract="true" autowire-candidate="default" autowire="default" class="" depends-on="" destroy-method="" factory-bean="" factory-method="" id=" " init-method="" lazy-init="default" name="" parent="" primary="true" scope=""></bean>
abstract:
1、通过<bean>标签定义公共的属性,指定abstract=true,具有相同属性的类在<bean>标签中指定其parent属性;(最好和parent属性一起使用)
例子代码:
Bean1.java
public class Bean1 {
private int id;
private String name;
private String password;
Bean2.java
public class Bean2 {
private int id;
private String name;
private String loginpass;
applicationContext.xml:
<bean id="beanAbstract" abstract="true">
<property name="id" value="1"/>
<property name="name" value="Jack"/>
</bean>
<bean id="bean3" class="spring.Bean1" parent="beanAbstract">
<!-- 可以覆盖父类赋予的值 -->
<property name="name" value="Tom"/>
<property name="password" value="123"/>
</bean>
<bean id="bean4" class="spring.Bean2" parent="beanAbstract">
<property name="loginpass" value="123"/>
</bean>
autowire-candidate:
1、作用是为了避免1个接口,2个实现类自动注入时,其中一个设置此属性为fasle表示不注入,即autowire-candidate属性设置为false时,容器在查找自动装配对象时,将不考虑该bean,即它不会被考虑作为其它bean自动装配的候选者,但是该bean本身还是可以使用自动装配来注入其它bean的
autowire:
当我们要往一个bean的某个属性里注入另外一个bean,我们会使用<property> + <ref/>标签的形式。但是对于大型项目,假设有一个bean A被多个bean引用注入,如果A的id因为某种原因修改了,那么所有引用了A的bean的<ref/>标签内容都得修改,这时候如果使用autowire="byType",那么引用了A的bean就完全不用修改了
autowire属性有5种模式,如下表:
模式 | 说明 |
no | (默认)不采用autowire机制.。这种情况,当我们需要使用依赖注入,只能用<ref/>标签。 |
byName | 通过属性的名称自动装配(注入)。Spring会在容器中查找名称与bean属性名称一致的bean,并自动注入到bean属性中。当然bean的属性需要有setter方法。例如:bean A有个属性master,master的setter方法就是setMaster,A设置了autowire="byName",那么Spring就会在容器中查找名为master的bean通过setMaster方法注入到A中。 |
byType | 通过类型自动装配(注入)。Spring会在容器中查找类(Class)与bean属性类一致的bean,并自动注入到bean属性中,如果容器中包含多个这个类型的bean,Spring将抛出异常。如果没有找到这个类型的bean,那么注入动作将不会执行。 |
constructor | 类似于byType,但是是通过构造函数的参数类型来匹配。假设bean A有构造函数A(B b, C c),那么Spring会在容器中查找类型为B和C的bean通过构造函数A(B b, C c)注入到A中。与byType一样,如果存在多个bean类型为B或者C,则会抛出异常。但时与byType不同的是,如果在容器中找不到匹配的类的bean,将抛出异常,因为Spring无法调用构造函数实例化这个bean。 |
default | 采用父级标签(即beans的default-autowire属性)的配置。 |
class:
类路径
depends-on:
<!-- redis配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxActive" value="20" />
<property name="maxIdle" value="10" />
<property name="maxWait" value="1000" />
<property name="testOnBorrow" value="true" />
</bean>
<!-- jedis pool配置 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="destroy" depends-on="jedisPoolConfig">
<constructor-arg ref="jedisPoolConfig" />
<constructor-arg value="127.0.0.1" />
<constructor-arg type="int" value="6379" />
</bean>
depends-on 用来指定Bean初始化及销毁时的顺序。如上面jedis pool定义的depends-on = "jedisPoolConfig",这意味着Spring总会保证jedisPoolConfig在jedisPool之前实例化,总是在jedisPool之后再销毁。
destory-method:
此bean被销毁时调用的方法。
factory-bean:
使用这种方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样,配置如下:
Java代码如下
public class BeanFactory {
//实例工厂方法
public Bean newInstance() {
//返回需要的Bean实例
return new Bean();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Xml配置如下
<!--配置工厂-->
<bean id="factorybean" class="spring_1.FactoryBean"></bean>
<bean id="factory" factory-bean="factorybean" factory-method="newInstance"></bean>
factory-method:
参考factory-bean
id:
唯一标识
init-method:
此bean被实例化的时候调用的方法。
lazy-init:
注:lazy-init 设置只对scop属性为singleton的bean起作用
默认为false,即pring启动时,立刻进行实例化。(注意前提:singleton)
为true时,则为懒加载,即第一次调用getBean时实例化。
< beans default-lazy-init ="true" > ....... </beans>注意:此配置能加快项目启动时间(又不是加快运行时速度,启动速度快慢没有什么太大作用)
name:
bean名称,可以设置多个,以逗号分割。
parent:
必要条件:1、子bean必须与父bean保持兼容,也就是说子bean中必须有父bean定义的所有属性。
2、父bean必须是抽象bean或者定义lazy-init=true也就是不让bean工厂实例化该bean
注:好多人将parent指向的类说是子类继承了父类,其实说法不正确,正确的说法应该是子bean父bean而不是子类父类,因为如果子bean指定的类已经继承了其他的类,那么在这里一样可以有一个父bean,(如果真像大家说的那样那不成多重继承了吗)
primary:
设置bean被自动装配时的优先级,有优先级的优先装配,如果1个接口的多个bean都设置优先级的话参照@Qualifier设置id方式消除歧义。
scope:
可以设置是单例还是多例(主要)
水平有限,错误的地方麻烦指出来,其中例子之类参考有其它文章