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