Spring的IOC入门
- 方法区别
context.getBean("id值", 类型.class);//无需转型
context.getBean("id值");//需转型
- bean标签的属性
id:bean标签的识别ID,理论上可以随便写
class:你要上Spring给你创建那个类的对象,需要协商该类的全部路径名 - 赋值的方式有两个
Person person1 = new Person();
//设置方法
person1.setId(1);
System.out.println(person1);
//构造方法赋值
Person person2 = new Person(1,"jack",20,new Date());
System.out.println(person2);
name :成员变量的名字
value :成员变量的值
一个property标签最后会调一个对应的set方法
<bean id="person2" class="com.wzx.domain.Person" >
<property name="id" value="10"/>
<property name="name" value="rose"/>
<property name="age" value="20"/>
</bean>
通过构造方法创建对象
</bean>
<bean id="date1" class="java.util.Date"/>
<bean id="person3" class="com.wxx.domain.Person">
<constructor-arg name="id" value="10"/>
<constructor-arg name="name" value="hello"/>
<constructor-arg name="age" value="20"/>
<constructor-arg name="birthday" ref="date1"/>
</bean>
- 配置构造方法的参数的constructor-arg如果有四个,就表示调用的是一个含有四个参数的构造方法。
- value可以赋上基本类型数据与String,但是其他对象,需要使用ref表示在当前容器中查找一个已存在的对象
静态工厂创建对象
- 什么是静态工厂
XxxFactory.get(); - 通过调用静态方法获取bean对象
public class PersonFactory{
public static Person getBean(){
return new Person();//静态方法返回创建的对象
}
}
- factory-method
指定获取对象的静态工厂的方法
<bean class="com.wzx.demo02.PersonFactory" factory-method="getBean" id="person4"/>
//静态工厂造对象
@Test
public void test03(){
Person person1 = (Person)context.getBean("person4");
log.debug(person1.toString());
}
实例工厂创建对象
- 什么是实例工厂
xxxFactory - 通过工厂对象调用成员方法获得bean对象
XxxFactory factory = new XxxFactory(); //实例化工厂对象
factory .yyy() //获得对象 - factory-bean创建工厂对象
- factory-method调用方法获得bean对象
public class PersonFactory2 {
//没有静态方法,所以必须先要new PersonFactory2()才能调用
public Person getBean(){
return new Person();
}
}
<bean class="com.wxx.demo03.PersonFactory2" id="factory2"/>
<bean factory-bean="factory2" factory-method="getBean" id="person5"/>
@Test
public void test04(){
Person person1 = (Person)context.getBean("person5");
log.debug(person1.toString());
}
单例和多例
- 单例是什么?
内存中只有一个对象,每次获取到的该对象的地址值是相同的 - 多实例是什么?
内存中的每次创建的对象都是一个新的对象,他们的地址值都是不同的 - 问题1.每次获取对象的时候,spring是新创建一个对象还是始终给我们返回的是同一个对象
- 答:spring默认的情况下创建的对象都是单例的,(每次返回的对象都是同一个)
scope="singleton" 单例(默认值)
scope="prototype" 多例
scope="request" 创建的对象放到request域中
scope="session" 创建对象放到session对象
- 多实例
<bean id="person" class="com.wzx.domain.Person" scope="prototype"/>
- 单实例
<bean id="person" class="com.wzx.domain.Person" scope="singleton"/>