• Spring 创建Bean的实例的3种方式


    创建Bean的实例有3种方式:

    • 构造器方式
    • 静态工厂方式
    • 实例工厂方式

    构造器方式

    构造器方式是最简单,也是最常用的。

    写一个Bean,

    • 提供带参的构造器:使用带参的构造器创建bean的实例。
    • 或者提供无参的构造器+setter方法:先使用无参的构造器创建对象,再调用setter方法注入依赖。

    使用注解或xml文件配置bean,注入所需依赖。

    此种方式是使用构造方法直接创建Bean的实例,不由工厂类负责生产Bean的实例。


    静态工厂方式

    需要创建一个工厂类,在工厂类中写一个静态方法,返回该Bean的一个实例。

    1、写一个Bean,提供带参的构造器

    public class Student {
        private int no;
        private String name;
        private float score;
    
        public Student(int no, String name, float score) {
            this.no = no;
            this.name = name;
            this.score = score;
        }
    
        //......
    }

    2、写一个工厂类,用静态方法生产该Bean的实例

    public class StudentFactory {
        public static Student createStudent(int no,String name,float score) {
            return new Student(no, name, score);
        }
    }

     因为在工厂中使用的是静态方法来生产该Bean的实例,所以称为静态工厂方式。

    一个工厂可以有多个静态方法,生产多个Bean的多种实例。

    3、在xml文件中配置工厂类

        <bean name="student" class="com.chy.utils.StudentFactory" factory-method="createStudent">
            <constructor-arg index="0" value="1"/>
            <constructor-arg index="1" value="chy"/>
            <constructor-arg index="2" value="100"/>
        </bean>

    配置的是class="工厂类",因为是静态方法,直接通过工厂类调用,所以不需要工厂类的实例,也就不需要在xml文件中配置工厂类的实例。这个配置创建的是Student类的实例。

    factory-method指定用哪个静态方法生产bean,<constructor-arg>给静态方法传入参数。

    注解简化了配置,但注解只能进行简单的配置,复杂的配置还得在xml中配置。

    通常注解、xml结合使用,简单的配置用注解,复杂的配置写在xml中。

    4、使用

    Student student = applicationContext.getBean("student", Student.class);

    也可以使用空参构造器+setter方法注入,要麻烦些。只有1、2步不同:

    1、提供空参构造器、setter方法

    public class Student {
        private int no;
        private String name;
        private float score;
    
        public void setNo(int no) {
            this.no = no;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setScore(float score) {
            this.score = score;
        }
    
        //......
    }

    2、先调用空参构造器创建实例,再调用setter方法赋值

    public class StudentFactory {
        public static Student createStudent(int no,String name,float score) {
            Student student = new Student();
            student.setNo(no);
            student.setName(name);
            student.setScore(score);
            return student;
        }
    }

    实例工厂方式

    工厂中生产该Bean的方法不是静态的,在xml文件中需要同时配置工厂、该Bean。

    1、写一个Bean,提供带参的构造器

    2、写一个工厂类,用实例方法生产Bean(方法不用static修饰)

    3、在xml文件中同时配置工厂类、该Bean

        <bean name="studentFactory" class="com.chy.utils.StudentFactory" />
        <bean name="student" class="com.chy.bean.Student" factory-bean="studentFactory" factory-method="createStudent">
            <constructor-arg index="0" value="1"/>
            <constructor-arg index="1" value="chy"/>
            <constructor-arg index="2" value="100"/>
        </bean>

    因为没有使用static修饰方法,不能通过工厂类的类名来调用,只能通过工厂类的实例来调用,所以要配置工厂类的实例。

    4、使用

    Student student = applicationContext.getBean("student", Student.class);

    同样可以使用空参构造器+setter方法的方式。


    上面静态工厂、实例工厂的xml配置,都是直接生产目标类的实例。

    创建实例需要传入实参,把实参写死在xml中,这显然不可取。上面的xml配置不常用。

    一般只管理工厂类的实例:

    <bean name="studentFactory" class="com.chy.utils.StudentFactory"/>

    scope默认就是单例,不必显式配置。

    在程序中通过工厂创建目标对象,实参可变化:

    StudentFactory studentFactory = applicationContext.getBean("studentFactory", StudentFactory.class);
    Student student = studentFactory.createStudent(1, "chy", 100);

    静态工厂甚至不必进行配置,直接通过类名调用静态方法创建目标对象:

    Student student = StudentFactory.createStudent(1, "chy", 100);
  • 相关阅读:
    libsvm参数学习和核函数使用(转载)
    libsvm 训练后的模型参数讲解(转)
    Ternary Search Trees 三分搜索树
    分支界定法 branch-and-bound 分析与实现)(转载)
    几种常见的激活函数(转载)
    matlab神经网络实验
    递归神经网络2(转载)
    线性代数和numpy——黑板客老师课程学习
    关于 Intellij IDEA Ultimate Edition 14.1控制台中文乱码 解决
    Intellij IDEA Ultimate Edition 14.1 破解
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/11117723.html
Copyright © 2020-2023  润新知