• Spring系列(二)


    系列目录

    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"/>
    
  • 相关阅读:
    偶数求和
    POJ2002Squares
    学习笔记之ulimit
    LeetCode 345. Reverse Vowels of a String
    LeetCode 343. Integer Break
    LeetCode 292. Nim Game
    LeetCode 338. Counting Bits
    LeetCode 344. Reverse String
    [ZZ]良好的编码习惯
    学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程
  • 原文地址:https://www.cnblogs.com/juzhuxiaozhu/p/12814019.html
Copyright © 2020-2023  润新知