Spring之IOC(二)

2021-02-01 06:17

阅读:648

标签:默认   spring容器   tty   nstat   return   方法   通过   single   public   

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();

    }

//配置
    

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();
    }

//配置
 

4) 通过Spring工厂创建对象

Spring 内置了工厂接口,也可以通过实现这个接口来开发Spring工厂,通过这个工厂创建对象。

//没有无参构造

//Spring内置工厂
public class PersonSpringFactory implements FactoryBean {
    /**
     * 生产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();
    }

//配置

Spring之IOC(二)

标签:默认   spring容器   tty   nstat   return   方法   通过   single   public   

原文地址:https://www.cnblogs.com/juzhuxiaozhu/p/12814019.html


评论


亲,登录后才可以留言!