spring xml配置 bean beans标签及其子标签的全部属性详解
目录1、标签的属性2、标签的属性3、标签的子标签4、spring 配置bean的四种方式:注解方式、xml方式(直接映射方式、静态工厂、实例化工厂)。1、<bean></bean>标签的属性<bean>可以看做是一个对象,容器初始化的时候,默认会将所有的bean实例化(即创建对象),将这些对象放入容器中统一管理。idbean的...
目录
4、spring 配置bean的四种方式:注解方式、xml方式(直接映射方式、静态工厂、实例化工厂)。
1、<bean></bean>标签的属性
<bean>可以看做是一个对象,容器初始化的时候,默认会将所有的bean实例化(即创建对象),将这些对象放入容器中统一管理。
id | bean的唯一标识,不能包含特殊字符 |
class | bean类的完全路径 |
name | bean的名字,基本不用,和id功能一样,可以包含特殊字符 |
destroy-method | beanFactory销毁的时候执行,因为bean的生命周期和beanFactory一样 |
init-method | bean在被实例化之后执行 |
abstract | 声明bean为抽象bean,bean就不会被实例化,作用和parent属性搭配使用 |
autowire | 自动装配模式,有5种:no、byName、byType、constructor、default。 假设bean aaa依赖了bean bbb。 no:默认是这个,不使用自动装配、老老实实地用<ref>标签去指明依赖bbb byName:根据bean的名字,spring在IoC容器中根据bbb的名字查找bean,然后 给aaa注入bbb,前提是aaa中有相关的setter方法。 byType:根据bean的类型,spring在IoC容器中根据bbb的类型查找bean,然后 给aaa注入bbb,如果同一类型的bean有多个,那么报错,如果没有,那么不执行 注入。 constructor:通过构造函数的参数类型,spring在容器中去查找构造函数参数所需 的类型bean,然后注入aaa,如果没有找到,报错,如果同一类型的bean有多个, 报错。 default:采用父级标签(<beans>标签)的default-autowire属性。 |
autowire-candidate | 是否接受被自动装配。autowire可以自动装配所需的依赖,spring就会找到一些bean, 那么如果这些bean不愿意被自动装配呢?这些bean可以设置自己的属性autowire- candidate为false(即不愿意,默认为true)。 |
depends-on | 依赖关系。标明一个bean对其它bean的依赖关系,和<ref>标签不同,depends-on只是 说明一个依赖关系,并不一定就是引用,声明这种依赖关系的作用就是让被依赖的bean 先于此bean实例化,此bean销毁后,才会去销毁被依赖bean。 |
factory-bean | 指定此bean的工厂。让工厂生产一个bean,并赋值给此bean。下文有详细介绍。 |
factory-method | 指定factory-bean工厂中的生产方法。具体的生产是这个方法实现的。下文有详细介绍。 |
lazy-init | 是否延迟实例化。让此bean不在容器初始化的时候就实例化,而是当我们需要它(调用它)的 时候,才去实例化。默认是false,在容器初始化的时候就实例化,true代表用的时候才。。 |
parent | 指定父bean,这里没有任何继承关系,和java里的父子关系不一样。当多个bean的成员 属性都有共同一样的,那我们不必重复地去定义,我们只需要定义一个父bean,父bean 包含了共同的成员属性,然后这些子bean声明parent指定父bean,这些子即可拥有父 bean的全部成员属性。 |
primary | 是否注入优先。默认false。当容器中有多个类型相同的bean时,使用@Autowired注入这个类型的 bean时,由于有多个,那到底注入哪一个呢?当这些bean都没有设置primary为true时,或者 有多个bean设置primary为true,报错,因为不知道要注入哪个(除非只有一个bean)。当只有 一个bean设置primary为true时,@Autowired注入就会优先选择这个bean。 |
scope | 一种实例化模式:prototype 和 singleton。prototype模式,容器初始化的时候,此bean不会被实例化 只有当需要用到这个bean的时候,都 new 一个新的实例化对象返回。 singleton模式,其实就是单例 模式,每次需要用这个bean的时候,总是返回同一个实例对象。 |
2、<beans></beans>标签的属性
default-autowire | 自动装配模式,。若子bean没有设置自己的autowire,那么就用beans ,如果设置了自己的,那么就用自己的自动装配模式。 |
default-autowire-candidates | 是否接受被自动装配,如果是false,那么beans标签下的所有子bean都 不接受被自动装配。默认是true。 |
default-destroy-method | 指定销毁方法。正常情况下,如果bean都有自己的销毁方法,那么要声明 多次,如果在beans标签中声明了此属性,假如方法为 hehe(),那么每个 子bean只需要直接实现各自的hehe()方法即可,即完成销毁代码编写。如果 子bean自己用destroy-method指定了自己的销毁方法,那么就是自己的,不 用beans的default-destroy-method。 |
default-init-method | 指定初始化方法。和销毁方法同理。 |
default-lazy-init | 是否延迟初始化。如果设置为true(要延迟),那么所有的子bean都要延迟。 如果此时有子bean自己设置了lazy-init为false,那么自己的lazy-init优先生效。 |
default-merge | 这是和bean的parent属性搭配使用的,父子bean之间的集合元素继承。为true, 代表beans下的所有子bean都会有这个特性,凡是声明了parent的,子bean就会 继承并合并父bean中的集合元素。默认为false,如果子bean中的list集合标签中 声明了merger属性,那么子bean的merger优先生效。 |
profile | 指定一类bean配置。项目的开发分开发、测试、生产,三个阶段的项目配置肯定 略有不同,一般我们手动地去修改配置,完了再部署,可是很不方便,可能没修 改完或修改正确,那么此时如果我们事先把三种配置分别用三个文件写好,然后 每次将profile指定其中一个文件启动项目,那不就方便多了。profile就是这个功能。 |
3、<bean>标签的子标签
3.1 meta子标签
<meta key = "" value = ""></meta>,meta:元数据,以键值对形式存在,key是键,value是值,在一个bean中声明meta子元素,这个meta并不是bean的成员,这是在这个bean里面声明一下,借用这个bean而已,需要调用meta的时候,是需要借用bean来调用的。
3.2 property子标签
<property name = "" value = ""></property> 或者 <property name = "" ref = ""></property> ,property:成员属性,属性名,属性值,属性值可以是一个引用。value代表值,ref代表引用。property是通过setter方法来设置值的。
3.3 constructor-arg 子标签
property标签通过setter方法来初始化bean的成员,constructor-arg通过构造函数来初始化bean。
<constructor-arg name = "" value = ""></constructor-arg>表示构造函数的参数名和参数值。value是值,ref是引用。
<constructor-arg type = "" value = ""></constructor-arg>表示构造函数的参数类型 和 参数值。value是值,ref是引用。
<constructor-arg index = "" value = ""></constructor-arg>表示构造函数的参数顺序 和 参数值。value是值,ref是引用。
3.4 description 子标签
<description>描述信息</description> ,作为描述信息存在。
3.5 lookup-method子标签
4、spring 配置bean的四种方式:注解方式、xml方式(直接映射方式、静态工厂、实例化工厂)。
注解方式就不在这里作介绍了。
public class Student{
private String name;
private Integer age;
public Student(){}
public Student(String name, Integer age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(Integer age){
this.age = age;
}
public Integer getAge(){
return this.age;
}
}
1、xml 直接映射方式
<bean id = "student" class = "Student">
<property name = "name" value = "小明">
<property name = "age" value = "23">
</bean>
2、静态工厂方式
bean工厂就是通过这个工厂可以得到bean。静态工厂就是将我们的bean放在静态区中,要用的时候调用即可。
public class StudentFactory{
public static Map<Integer, Student> map = new HashMap<>();
static{
map.put(1, new Student("小明","23"));
...
}
public static Student getStudent(Integer id){
return map.get(id);
}
}
工厂我们声明好了,那如何才能利用这个工厂获取我们需要的bean呢?做法如下:
<bean id = "student" class = "StudentFactory" factory-method = "getStudent">
<constructor-arg value = "1"></constructor-arg>
</bean>
为什么不将StudentFactory也配置成bean,而是直接就可以调用它的getStudent方法了呢?原因是:StudentFactory类中的map是在静态块中就已经设置完值了,而静态块是在加载代码的时候就已经执行了,所以StudentFactory代码被加载的时候,map就已经初始化完了,静态的不需要实例化,因此student bean可以直接那样配置。
3、实例化工厂方式
实例化工厂方式就不用静态了。因此需要配置为bean,否则spring找不到这个类的对象。
public class StudentFactory{
private Map<Integer, Student> map = new HashMap<>();
public StudentFactory(){
map.put(1, new Student("小明", "23"));
}
public Student getStudent(Integer id){
return map.get(id);
}
}
配置学生 bean时,要声明factory-bean属性。
<bean id = "studentFactory" class = "StudentFactory"></bean>
<bean id = "student" factory-bean = "studentFactory" factory-method = "getStudent">
<constuctor-arg value = "1"></constuctor-arg>
</bean>
更多推荐
所有评论(0)