默认情况下,会调用Bean的无参数构造方法。
定义一个Bean
package com.powernode.spring6.bean;public class SpringBean {public SpringBean() {System.out.println("SpringBean的无参数构造方法执行");}
}
Spring配置文件
测试
package com.powernode.spring6.test;import com.powernode.spring6.bean.SpringBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanInstantiationTest {@Testpublic void testInstantiation1(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");SpringBean springBean = applicationContext.getBean("springBean", SpringBean.class);System.out.println(springBean);}
}
定义一个Bean
package com.powernode.spring6.bean;
/*** Bean*/
public class Star {public Star() {System.out.println("Star的无参数构造方法执行");}
}
编写简单工厂模式当中的工厂类
package com.powernode.spring6.bean;
/*** 简单工厂模式中的工厂类角色*/
public class StarFactory {// 工厂类中有一个静态方法public static Star get(){// Star对象最终实际上创建的时候还是我们负责new的对象return new Star();}
}
在Spring配置文件中指定创建该Bean的方法(使用factory-method属性指定)
编写测试程序
@Test
public void testInstantiation2(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Star star = applicationContext.getBean("star", Star.class);System.out.println(star);
}
这种方式本质上是:通过工厂方法模式进行实例化。
定义一个Bean
package com.powernode.spring6.bean;
/*** 工厂方法模式当中的 具体产品角色*/
public class Gun {public Gun() {System.out.println("Gun的无参数构造方法执行");}
}
定义具体工厂类,工厂类中定义实例方法
package com.powernode.spring6.bean;
/*** 工厂方法模式中的 具体工厂角色*/
public class GunFactory {// 工厂方法模式中的具体工厂角色中的方法是:实例方法public Gun get(){// 实际上new对象还是我们自己new的return new Gun();}
}
在Spring配置文件中指定factory-bean以及factory-method
编写测试程序
@Test
public void testInstantiation3(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Gun gun = applicationContext.getBean("gun", Gun.class);System.out.println(gun);
}
以上的第三种方式中,factory-bean是我们自定义的,factory-method也是我们自己定义的。
在Spring中,当你编写的类直接实现FactoryBean接口之后,factory-bean不需要指定了,factory-method也不需要指定了。
factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向getObject()方法。
定义一个Bean
package com.powernode.spring6.bean;
/*** 普通的Bean*/
public class Person {public Person() {System.out.println("Person的无参数构造方法执行");}
}
编写一个类实现FactoryBean接口
package com.powernode.spring6.bean;import org.springframework.beans.factory.FactoryBean;public class PersonFactoryBean implements FactoryBean {// PersonFactoryBean也是一个Bean,这个Bean比较特殊,叫做工厂Bean// 通过工厂Bean可以获取普通的Bean@Overridepublic Person getObject() throws Exception {// 最终这个Bean的创建还是我们自己new的return new Person();}@Overridepublic Class> getObjectType() {return null;}/*** 这个方法在接口中有默认实现* 默认返回true,表示单例的* 返回false,表示多例的* @return*/@Overridepublic boolean isSingleton() {return FactoryBean.super.isSingleton();}
}
在Spring配置文件中配置FactoryBean
测试程序:
@Test
public void testInstantiation4(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Person person = applicationContext.getBean("person", Person.class);System.out.println(person);
}
FactoryBean在Spring中是一个接口。被称为“工厂Bean”。“工厂Bean”是一种特殊的Bean。所有的“工厂Bean”都是用来协助Spring框架来创建其他Bean对象的。
Spring IoC容器的顶级父接口,BeanFactory被翻译为“Bean工厂”,在Spring的IoC容器中,“Bean工厂”负责创建Bean对象。
BeanFactory是工厂。
FactoryBean:它是一个Bean,是一个能够辅助Spring实例化其它Bean对象的一个Bean。
在Spring中,Bean可以分为两类:
java.util.Date在Spring中被当做简单类型,简单类型在注入的时候可以直接使用value属性或value标签来完成。但对于Date类型来说,采用value属性或value标签赋值的时候,对日期字符串的格式要求非常严格,必须是这种格式的:Mon Oct 10 14:30:26 CST 2022。其他格式是不会被识别的。
package com.powernode.spring6.bean;import java.util.Date;/*** 普通的Bean*/
public class Student {// java.util.Date 在Spring当中被当做简单类型,注入日期字符串格式有要求// java.util.Date 在Spring当中也可以被当做非简单类型private Date birth;public void setBirth(Date birth) {this.birth = birth;}@Overridepublic String toString() {return "Student{" +"birth=" + birth +'}';}
}
编写DateFactoryBean类实现FactoryBean接口
package com.powernode.spring6.bean;import org.springframework.beans.factory.FactoryBean;import java.text.SimpleDateFormat;
import java.util.Date;public class DateFactoryBean implements FactoryBean {// 定义属性接收日期字符串private String strDate;// 通过构造方法给日期字符串属性赋值public DateFactoryBean(String strDate) {this.strDate = strDate;}@Overridepublic Date getObject() throws Exception {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(strDate);return date;}@Overridepublic Class> getObjectType() {return null;}
}
在Spring配置文件中配置
测试:
@Test
public void testDate(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Student student = applicationContext.getBean("student", Student.class);System.out.println(student);
}