springBean的三种实例化

本文详细介绍了Spring容器如何通过构造方法、静态工厂和实例工厂三种方式创建JavaBean实例,包括使用构造函数-arg、bean标签配置、静态工厂类和方法,以及XML配置文件的编写示例。
摘要由CSDN通过智能技术生成

spring容器创建javaBean的实例,有三种方式。 分别是通过构造方法、 静态工程方法、 实例工厂方法。

前言:

1.构造方法实例化方式:

我的理解: 通过bean标签结合property调用set方法;通过bean标签结合constructor-arg调用构造方法;通过@Componen、@Repository、@Service、@Controller注解; 都属于调用构造方法对对象进行实例化。 因为如果调用bean标签结合property调用set方法而不提供无参构造方法就会报错。 而通过注解方式创建bean对象,不提供无参构造方法就会因为无法给有参构造方法的参数传入值而报错。

2.静态工厂实例化:

从spring容器中获取静态工厂时, spring会自动执行静态工厂的静态方法来返回另一个bean对象。

效果:用getBean获取静态工厂时,返回的是另一个bean对象

代码关键点:

  • 需要被实例化的java类、

  • 静态工厂类和静态方法(方法内返回需要被实例化的java类的对象)、

  • 用bean标签配置需要被实例化的类、 用bean标签配置静态工厂类,用另一个bean标签配置factory-method指定静态工厂方法、并用factory-bean指定静态工厂类的beanId。

注: 最终当要用 需要被实例化的java类对象时, 只需要获取指定factory-method的bean对象即可(会返回需要被实例化的java类的对象)

3.实例工厂实例化:

从spring容器中获取配置了factory-method的bean对象时, spring会自动执行实例工厂的创建对象的方法来返回另一个bean对象。

效果:用getBean获取配置了factory-method的bean对象时,返回的是另一个bean对象

代码关键点:

  • 需要被实例化的java类、

  • 实例工厂类和创建对象的方法(方法内返回需要被实例化的java类的对象)、

  • 用bean标签配置需要被实例化的类、 用bean标签配置实例工厂类并用factory-method指定实例工厂方法。

注: 最终当要用 需要被实例化的java类对象时, 只需要获取实例工厂类的bean对象即可(会返回需要被实例化的java类的对象)

这里演示后两种: 静态工厂实例化、 实例工程实例化

一、静态工厂实例化:

  • 需要被实例化的java类、

  • 静态工厂类和静态方法(方法内返回需要被实例化的java类的对象)、

  • 用bean标签配置需要被实例化的类、 用bean标签配置静态工厂类,用另一个bean标签配置factory-method指定静态工厂方法、并用factory-bean指定静态工厂类的beanId。

    注: 最终当要用 需要被实例化的java类对象时, 只需要获取指定factory-method的bean对象即可(会返回需要被实例化的java类的对象)

1.1.需要被实例化的java类Student:
package staticFactory;
public class Student {
    private String stuName,stuPwd;
    public Student() {  }
    public Student(String stuName, String stuPwd) {
        this.stuPwd = stuPwd;
        this.stuName = stuName;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public String getStuPwd() {
        return stuPwd;
    }
    public void setStuPwd(String stuPwd) {
        this.stuPwd = stuPwd;
    }
    public String toString() {
        return String.format("学生姓名:%s,学生密码:%s",stuName,stuPwd);
    }
}

1.2.静态工厂类:
package staticFactory;
​
public class StudentServiceFactory {
    private static Student student;
    public static Student createStudentServiceBean()
    {
        student=new Student();
        return  student;
    }
}

1.3.applicationContext.xml配置静态工厂:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="">
    <!--  静态工厂方式:  -->
    <bean id="stuFactory1" class="staticFactory.StudentServiceFactory" 
          factory-method="createStudentServiceBean">
        <constructor-arg name="userName" value="张三"> </constructor-arg>
        <constructor-arg name="userPwd" value="123"> </constructor-arg>
    </bean>
</beans>

1.4.Test测试类:
package staticFactory;
​
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class Test {
public static void main(String[] args) {
        ApplicationContext applicationContext = 
            new ClassPathXmlApplicationContext("applicationContext.xml");
        Student stu = (Student) applicationContext.getBean("stuFactory1");
        System.out.println( "stu学生对象的信息: " + stu.toString());
    }
}

二、实例工厂方式案例:

  • 需要被实例化的java类、

  • 实例工厂类和创建对象的方法(方法内返回需要被实例化的java类的对象)、

  • 用bean标签配置需要被实例化的类、 用bean标签配置实例工厂类并用factory-method指定实例工厂方法。

    注: 最终当要用 需要被实例化的java类对象时, 只需要获取实例工厂类的bean对象即可(会返回需要被实例化的java类的对象)

2.1.需要被实例化的java类Student:

package noStaticFactory;
​
public class Student {
    private String stuName,stuPwd;
    public Student() {  }
    public Student(String stuName, String stuPwd) {
        this.stuPwd = stuPwd;
        this.stuName = stuName;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public String getStuPwd() {
        return stuPwd;
    }
    public void setStuPwd(String stuPwd) {
        this.stuPwd = stuPwd;
    }
    public String toString() {
        return String.format("学生姓名:%s,学生密码:%s",stuName,stuPwd);
    }
}
2.2.实例工厂类:
package noStaticFactory;
​
public class StudentServiceFactory {
    private  Student student;
    public Student createStudentServiceBean(String userName,String userPwd){
       this.student=new Student(userName,userPwd);
       return  student;
    }
}
​
2.3.applicationContext.xml配置实例工厂:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
​
​
​
    <!--  非静态工厂方式:  -->
    <bean id="studentServiceFactory" class="noStaticFactory.StudentServiceFactory">
    </bean>
    <bean id="stuFactory2"  factory-bean="studentServiceFactory" 
          factory-method="createStudentServiceBean">
        <constructor-arg name="userName" value="张三"> </constructor-arg>
        <constructor-arg name="userPwd" value="123"> </constructor-arg>
    </bean>
​
</beans>
2.4.Test测试类:
package noStaticFactory;
​
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import staticFactory.Student;
​
public class Test {
    public static void main(String[] args) {
        ApplicationContext applicationContext = 
            new ClassPathXmlApplicationContext("applicationContext.xml");
        staticFactory.Student stu = (Student) applicationContext.getBean("stuFactory2");
        System.out.println( "stu学生对象的信息: " + stu.toString());
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值