关闭

Spring 创建对象的问题,不同构造方法创建对象,使用工厂类类获取对象、单例或多例、延迟创建问题

标签: Spring工厂类单例
1010人阅读 评论(0) 收藏 举报
分类:

创建实体类Student

package star.july.b_ioc;
public class Student {
          private String name;
          private int age;
          public Student() {
                   System.out.println("执行了Student构造方法");
          }
          public Student(String name, int age) {
                   System.out.println("调用了有参构造方法");
                   this.name = name;
                   this.age = age;
          }
          @Override
          public String toString() {
                   return "Student [name=" + name + ", age=" + age + "]";
          }
          
          
}

再创建工厂类,

package star.july.b_ioc;
public class StudentFactory {
          
          public StudentFactory() {
//                 new Student();  
                   System.out.println("调用StudentFactory构造方法");
          }
          
          public boolean setHaha(){
                   System.out.println("哈哈");
                   return true;
          }
          
          public Student getStudent(){
                   System.out.println("进入了StudentFactory的getStudent()方法");
                   return new Student();
          }
          
          public static Student getStu(){
                   System.out.println("调用静态方法");
                   return new Student();
          }
}


配置Spring的xml,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"
         default-lazy-init="true"
        >
<!--         <beanms default-lazy-init="true"/> -->
          <!-- 配置一个javabean
                   id:对象的唯一标记
                   class:需要创建的对象
                    -->
                    <!-- 使用无参构造方法 -->
        <!-- <bean id = "students" class="star.july.b_ioc.Student">
        </bean>  -->
        <!--
          有参方法
          index:构造方法的参数索引,从0开始
          value:需要传递的参数值
          type:参数类型
         -->
      <!--   <bean id ="students" class="star.july.b_ioc.Student">
          <constructor-arg index="0"
                   value="小火"
                   type="String"
          >
                   </constructor-arg>
          <constructor-arg index="1"
                   value="20"
                   type="int"
          >
                   </constructor-arg>
        </bean> -->
       
        <!-- 先创建工厂类的成员方法获取对象 -->
          <!-- 1、先创建工厂类对象 -->
        <bean  id="factory" class="star.july.b_ioc.StudentFactory" >
        </bean>
                   <!-- 2、调用工厂类的成员方法
                             factory-bean:使用哪个工厂类的对象
                             factory-method:使用工厂类的哪个方法
                   -->       
                    <bean id="invocation" factory-bean="factory" factory-method="setHaha" ></bean>
                   
                   
                   <!-- 调用工厂类的静态方法 -->
                   <bean  id="invokeStatic"  class="star.july.b_ioc.StudentFactory" factory-method="getStu"  ></bean>
                   
                   <!-- 对象单例子
                             单例:singleton(默认)
                             多例:prototype
                    -->
                   <bean  id="s1"  class="star.july.b_ioc.StudentFactory"  scope="prototype" ></bean>
                   
                   <!--
                             对象的延迟创建问题
                             lazy-init:是否延迟加载(创建)对象
                                      false:在初始化工厂的时候(调用getBean()方法
                                      true:在调用getBean()的时候创建对象
                             注意:该方法只能用在单例子
                    -->
                   <bean  id="s"  class="star.july.b_ioc.StudentFactory"  scope="singleton" lazy-init="true" ></bean>
</beans>


最后分别测试

package star.july.b_ioc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Demo {
          public static void main(String[] args) {
                   ApplicationContext ac = new ClassPathXmlApplicationContext("/star/july/b_ioc/applicationContext.xml");
//                Student s = (Student)ac.getBean("students");
                   StudentFactory s = (StudentFactory) ac.getBean("s");
                   //调用静态方法
//                StudentFactory s = (StudentFactory) ac.getBean("invokeStatic");
          }
}


0
0
查看评论

spring容器创建对象的3种方式(bean的实例化)

spring容器创建对象的3种方式(bean的实例化) 1,调用默认的构造函数(默认) 1)指定bean的class属性 2)class需要一个默认的空构造器 得到实例对象:HelloWorld helloWorld = (HelloWorld)context.ge...
  • A__17
  • A__17
  • 2015-09-23 16:05
  • 4528

Spring创建对象的三种方法之一构造函数创建(源码)

Spring创建对象有三种方法,分别是: 1、构造函数创建 2、静态工厂方法 3、实例工厂方法 这里说下第一种方法,采用构造函数来创建,我这里直接给源码,凑合着看看,能用就可以了,如果想要更深入的了解,那么只有自己去找资料了。 第一个类:D1.java pac...
  • java_xuetu
  • java_xuetu
  • 2016-09-25 13:51
  • 887

springIoc创建对象之有参构造器

User.java public class User { private int id; private String name; public User() { super(); System.out.println("------User对象创建【无参数构造器】-...
  • Tomsheng321
  • Tomsheng321
  • 2017-02-02 11:33
  • 296

Spring学习心得(4)-- Spring容器创建对象的单/多例

在前面,我们讨论到了spring容器创建对象的3种方式以及spring容器创建对象的时机,那么我们现在来讨论一下spring容器创建对象的单/多例  那么 怎样判断spring容器创建的对象是单例还是多例呢? public class testHelloSpring { ...
  • helongzhong
  • helongzhong
  • 2017-03-14 11:30
  • 1493

通过私有构造方法创建对象

写一个单例模式:package test.reflect;public class Singleton { private static Singleton s= null; private Singleton() { } public static Singleton getInstanc...
  • liuhe688
  • liuhe688
  • 2009-12-31 09:40
  • 4652

spring IOC容器创建对象的三种方式

SpringIOC容器,是spring核心内容。 作用:创建对象 & 处理对象的依赖关系,把对象的创建交给IOC容器   IOC容器创建对象(默认单例): 创建对象, 有三种方式: 1) 调用无参数构造器 2) 带参数构造器 3) 工厂创建对象  ...
  • xyffly
  • xyffly
  • 2017-02-26 12:13
  • 1496

Java之反射类的构造函数,通过单元测试反射创建类的对象

需要测试的Person类的源代码如下: package cn.itcast.reflect; import java.util.List; public class Person { public String name="wpc"; public Person() {...
  • u012110719
  • u012110719
  • 2015-04-07 21:36
  • 1714

JS中定义对象方式三: 使用构造函数方式创建对象

function Person(username, password) { //在执行第一行代码之前,js引擎会为我们生成一个对象。 this.username = username; this.password = password; this.getInf...
  • Geek_ymv
  • Geek_ymv
  • 2013-03-13 10:55
  • 6184

《Spring》------对象的创建机制剖析

前言 利用Spring框架,我们很方便的将对象管理起来,比如说:“从对象的创建(Ioc),到对象的使用(DI)”。那么在对象是以何种方式创建的,以及其创建的时间,还有创建对象是单例的还是多例是怎么控制的哪?让小编结合在项目中的经验,好好的剖析一下。 1、对象的创建方式1.1、利用构造函数创建对象配置...
  • u013067402
  • u013067402
  • 2016-11-13 19:49
  • 1010

不使用构造方法创建Java对象: objenesis的基本使用方法

objenesis简介:objenesis是一个小型java类库用来实例化一个特定class的对象。使用场合:Java已经支持使用Class.newInstance()动态实例化类的实例。但是类必须拥有一个合适的构造器。有很多场景下不能使用这种方式实例化类,比如: 构造器需要参数 构造器有side ...
  • codershamo
  • codershamo
  • 2016-07-24 17:50
  • 4538
    个人资料
    • 访问:135675次
    • 积分:2624
    • 等级:
    • 排名:第16402名
    • 原创:123篇
    • 转载:0篇
    • 译文:0篇
    • 评论:45条
    文章分类
    最新评论