系列目录
IOC(二)
Spring创建对象的方式
1. 通过类的无参构造方法创建对象。
当用最普通的方式配置一个bean时,默认就是采用类的无参构造创建对象。
在Spring容器初始化时,通过bean上配置的class属性反射得到字节码对象,再通过 newInstance() 创建对象
class c = Class.forName("类的全路径名称");
Object obj=c.newInstance();
通过这种方式创建对象,要求类必须有无参构造,否则抛出异常。
2. 通过静态工厂创建对象
大多数时候,我们面对的类是无法通过无参构造去创建的,例如该类没有无参构造、是一个抽象类等等,此时可以用静态工厂方式创建对象。
//没有无参构造
public class Person01 {
public Person01(String name){
System.out.println("Person01被创建了:"+name);
}
}
//静态工厂
public class PersonStaticFactory {
private PersonStaticFactory(){}
public static Person01 getInstance(){
return new Person01("zs");
}
}
//测试
@Test
public void test01(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过静态工厂创建对象
Person01 p01 = context.getBean(Person01.class);
((ClassPathXmlApplicationContext)context).close();
}
//配置
<bean id="person01" class="cn.work.factory.PersonStaticFactory" factory-method="getInstance"/>
3.通过实例工厂创建对象
实例工厂也可以解决类无法通过无参构造创建的问题,思路与静态工厂类似,只不过实例工厂提供的方法不是静态的。
Spring需要先创建出实例工厂的对象,在调用实例工厂对象上指定的普通方法来创建对象。所以实例工厂也需要配置到Spring管理。
//没有无参构造
public class Person01 {
public Person01(String name){
System.out.println("Person01被创建了:"+name);
}
}
//实例工厂
public class PersonInstanceFactory {
public Person01 getInstance(){
return new Person01("ls");
}
}
//测试
@Test
public void test02(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext2.xml");
//通过实例工厂创建对象
Person01 p01 = context.getBean(Person01.class);
((ClassPathXmlApplicationContext)context).close();
}
//配置
<bean id="personinstancefactory" class="cn.work.factory.PersonInstanceFactory"/>
<bean id="Person01" factory-bean="personinstancefactory" factory-method="getInstance"/>
4.通过Spring工厂创建对象
Spring 内置了工厂接口,也可以通过实现这个接口来开发Spring工厂,通过这个工厂创建对象。
//没有无参构造
//Spring内置工厂
public class PersonSpringFactory implements FactoryBean<Person01> {
/**
* 生产bean对象方法
* @return
* @throws Exception
*/
@Override
public Person01 getObject() throws Exception {
return new Person01("ww");
}
/**
* 获取bean类型方法
* @return
*/
@Override
public Class<?> getObjectType() {
return Person01.class;
}
/**
* 告知当前bean是否要采用单例模式
* @return
*/
@Override
public boolean isSingleton() {
return true;
}
}
//测试
@Test
public void test03(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext3.xml");
//通过内置的Spring工厂创建对象
//Spring工厂默认延迟创建,其他都不是
Person01 p02 = (Person01)context.getBean("Person01");
((ClassPathXmlApplicationContext)context).close();
}
//配置
<bean id="Person01" class="cn.tedu.factory.PersonSpringFactory"/>