目录
1、标签的属性
2、标签的属性
3、标签的子标签
4、spring 配置bean的四种方式:注解方式、xml方式(直接映射方式、静态工厂、实例化工厂)。
<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的时候,总是返回同一个实例对象。
自动装配模式,。若子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.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子标签
注解方式就不在这里作介绍了。
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>
