目录

1、标签的属性

2、标签的属性

3、标签的子标签

4、spring 配置bean的四种方式:注解方式、xml方式(直接映射方式、静态工厂、实例化工厂)。


1、<bean></bean>标签的属性

<bean>可以看做是一个对象,容器初始化的时候,默认会将所有的bean实例化(即创建对象),将这些对象放入容器中统一管理。

idbean的唯一标识,不能包含特殊字符
classbean类的完全路径
namebean的名字,基本不用,和id功能一样,可以包含特殊字符
destroy-methodbeanFactory销毁的时候执行,因为bean的生命周期和beanFactory一样
init-methodbean在被实例化之后执行
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>

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐