1.无参构造器方法
现在开始测试无参构造器方法实例化bean:
第一步:创建一个类Bean1
public class Bean1 {
}
第二步:spring配置文件applicationContext.xml种配置bean
<bean id="bena1" class="com.igeek.Bean1"></bean>
第三步:编写测试类SpringTest,获取bean实例
public class SpringTest {
@Test
public void test1(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean1 bean1 = (Bean1) ac.getBean("bean1");
System.out.println(bean4);
}
}
运行测试类后结果拿到了bean1实例:
这里要注意每个类都会有一个默认的无参构造器来实例化bean实例,但是如果类中定义了有参的构造器,那么无参的构造器会被覆盖掉,需要显示地在类中去声明无参的构造器来实例化bean.下面来测试证明这一结论:
还是上面的测试案例,只改动以下Bean1这个类,加入一个有参构造器:
public class Bean1 {
private String name;
public Bean1(String name){
this.name = name;
}
}
再次运行SpringTest测试类:
报错信息中提示没有空的构造方法来实例化bean,所以要显示的去添加无参构造方法来实例化bean
修改Bean1类:
public class Bean1 {
private String name;
public Bean1(String name){
this.name = name;
}
public Bean1(){
}
}
加入了无参构造方法后,再次运行测试类,就可以正常的实例化bean了。
2.静态工厂方法
第一步:创建Bean1类
public class Bean2 {
//静态方法,用来返回对象的实例
public static Bean2 getBean2(){
//在做实例化的时候,可以做其他的事情,即可以在这里写初始化其他对象的代码
//Connection conn....
return new Bean2();
}
}
第二步:配置Spring配置文件applicationContext.xml
<!--静态工厂的方式创建bean,用来自己定义以下工厂,让Spring的大工厂来调用我们的小工厂可以将对象的创建权限
交给我们的小工厂,factory-method:工厂的静态放过,在实例化bean的时候自动调用-->
<bean id="bean2" class="com.igeek.Bean2" factory-method="getBean2"/>
第三步:编写测试类SpringTest.java
public class SpringTest {
@Test
public void test1(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean2 bean2 = (Bean2) ac.getBean("bean2");
System.out.println(bean2);
}
}
3.实例工厂方法
第一步:创建Bean3类
public class Bean3 {
}
第二步:创建实例工厂类Bean3Factory
public class Bean3Factory {
//普通的方法,非静态方法
public Bean3 getBean3(){
//初始化实例对象返回
return new Bean3();
}
}
第三步:Spring容器的配置,applicationContext.xml
<!-- 3:实例工厂的方式实例化bean -->
<bean id="bean3Factory" class="com.igeek.Bean3Factory"/>
<!-- factory-bean相当于ref:引用一个bean对象 -->
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"/>
第四步:使用测试类SpringTest进行测试
public class SpringTest {
@Test
public void test1(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean3 bean3 = (Bean3) ac.getBean("bean3");
System.out.println(bean3);
}
}
4.FactoryBean方式
第一步:创建Bean4类
public class Bean4 {
}
第二步:创建工厂Bean,Bean4FactoryBean.java,实现FactoryBean的接口
//实现FactoryBean接口的方式
//泛型,想要返回什么类型的对象,泛型就是什么,FactoryBean提供getObject方法返回目标类型对象
public class Bean4FactoryBean implements FactoryBean<Bean4>{
//用来获取bean的实例,对象
public Bean4 getObject() throws Exception {
//写一些初始化数据库连接等等其他代码
return new Bean4();
}
public Class<?> getObjectType() {
return null;
}
public boolean isSingleton() {
return false;
}
}
第三步:applicationContext.xml配置
<!--实现接口FactoryBean的方法,spring在准备实例化bean的时候,new Bean4FactoryBean没有急着返回bean
对象,会判断类型对象是否实现了FactoryBean接口,如果实现了就调用接口的getObject方法。得到bean的实例返回-->
<bean id="bean4" class="com.igeek.Bean4FactoryBean"></bean>
第四步:启动SpringTest测试类来测试
public class SpringTest {
@Test
public void test1(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Bean4 bean4 = (Bean4) ac.getBean("bean4");
System.out.println(bean4);
}
}
//测试结果成功获取到了bean4实例对象
小结
第一种最常用,
第二种,第三种框架初始化的时候用的多
第三种,第四种Spring底层用的多
BeanFactory和FactoryBean的区别:
BeanFactory:是一个工厂(其实是构建了一个spring上下文的环境容器),用来管理和获取很多的bean对象,例如加载applicationContext.xml文件。
FactoryBean:是一个bean生成工具,是用获取一种类型对象的bean,它是构造Bean实例的一种方式。