首先明确xml文件中的一些配置:
id和name:表示标识这个<bean>节点,name可以有特殊字符
scopebean的生存范围,有singleton(单例,默认)、prototype(非单例)、request、session、globalsession
class表示关联的类文件名称(包名 + 类名)
value注入基本数据类型或字符串
ref注入一个对象引用
factory-bean调用的工厂Bean实例
factory-method调用的工厂方法
<property>节点可以调用类中的setter方法,name对应参数名称,value对应参数值。
<constructor-arg>节点可以调用类中的构造器,name对应参数名称,value对应参数值。
一:通过构造函数创建对象。
1.无参构造函数+setter方法注入值
package com.spring.bean;
public class Person {
private String name;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {//调用这个
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {//调用这个
this.id = id;
}
}
XML配置:
<!--调用了无参构造函数-->
<bean class="com.spring.bean.Person" id="person">
<property name="name" value="LiuChunfu"></property><!--调用了setter方法-->
<property name="id" value="125"></property>
</bean>
</beans>
2 利用有参构造函数直接注入
package com.mc.base.learn.spring.bean;
public class Person {
private String name;
private Integer id;
public Person(String name, Integer id) {//调用这个
super();
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
xml配置:
<bean class="com.spring.bean.Person" id="person">
<!--有参构造函数注入-->
<!--调用有参数构造函数,通过<constructor-arg>标签注入参数-->
<constructor-arg name="id" value="123"></constructor-arg>
<constructor-arg name="name" value="LiuChunfu"></constructor-arg>
</bean>
</beans>
二.静态工厂创建(使用静态方法)
静态工厂的对象,在容器加载的时候就被创建了。
public static Person createPerson(Integer id,String name){
return new Person(name,id);
}
xml:
<!--静态的工厂方法核心是class+factory-method,直接调用类方法-->
<bean id="person" class="com.spring.factory.PersonStaticFactory" factory-method="createPerson">
<!--通过property标签向createPerson传递参数 -->
<property name="name" value="LiuChunfu"></property>
<property name="id" value="125"></property>
</bean>
三、通过实例工厂方式创建对象
实例工厂就是通过实例来调用对象,但是所得到的对象最终也是单例模式。实例工厂和静态工厂创建的对象都是单例模式,两者的区别就是创建对象的实际不同,静态工厂是在创建容器的时候就创建了,实例工厂是在调用方法的时候才创建。
public class PersonFactory {
//非静态方法返回实例
public Person createInstance() {
return new Person();
}
}
xml:
<!--创建类的工厂Bean实例-->
<bean id="personFactory" class="cn.test.util.PresonFactoryInstance"></bean>
<!--有了实例之后才能调用成员方法-->
<bean id="person4" factory-bean="personFactory" factory-method="createPerson">
<property name="name" value="LiuChunfu"></property>
<property name="id" value="125"></property>
</bean>
四.自动装配
在bean节点中, 添加autowire属性来完成自动装配的操作
1,no : 默认设置 , 表示关闭自动装配
2,byName : 通过名称完成自动装配:
例如: 当前我们容器中存在一个对象, id为book;
而刚好当前的这个person类中有一个名称为book的属性
那么这个时候, 我们的容器, 会自动完成两个对象的关联
byName 不会判断传入的参数类型是否匹配, 只要名称相同, 就会强行建立依赖关系 , 导致报错!
3, byType : 通过类型完成自动装配
例如: 当前我们容器中存在一个Book类的对象
而刚好我们当前的Person有一个Book类型的属性
我们的容器, 就会自动完成两个对象的关联。如果存在多个同类型对象则报错
4,constructor 与byType的方式类似,不同之处在于它应用于构造器参数
5,autodetect 通过bean类来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType