Spring之IOC

Posted 居诸小筑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring之IOC相关的知识,希望对你有一定的参考价值。

IOC(二)

Spring创建对象的方式

1)通过类的无参构造方法创建对象。

当用最普通的方式配置一个时,默认就是采用类的无参构造创建对象。
在Spring容器初始化时,通过上配置的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"/>

以上是关于Spring之IOC的主要内容,如果未能解决你的问题,请参考以下文章

Spring IOC源代码具体解释之容器依赖注入

Spring IOC源代码具体解释之容器初始化

3.1.2 Spring之IoC

Spring系列之IOC容器

Spring入门之IoC

面试之Spring框架IOC和AOP的实现原理