4. Bean的实例化方式
大约 3 分钟
本文内容
- 通过构造函数实例化bean
- 通过静态工厂方法实例化bean
- 通过实例工厂方法实例化bean
通过构造函数实例化bean
Spring中可以通过空构造函数或是默认构造函数来实例bean,直接上案例。
定义一个简单类
package com.crab.spring.ioc.demo01;
/**
* @author zfd
* @version v1.0
* @date 2022/1/13 12:05
*/
public class ConstructorBean {
}
配置文件
<?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 class="com.crab.spring.ioc.demo01.ConstructorBean" id="constructorBean"/>
</beans>
来个测试测试进行测试
package com.crab.spring.ioc.demo01;
import static org.junit.Assert.*;
/**
* @author zfd
* @version v1.0
* @date 2022/1/13 13:32
*/
public class Test {
@org.junit.Test
public void test() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("demo01/spring.xml");
ConstructorBean constructorBean = context.getBean(ConstructorBean.class);
System.out.println(constructorBean);
context.close();
}
}
运行结果
com.crab.spring.ioc.demo01.ConstructorBean@371a67ec
通过静态工厂方法实例化bean
在定义使用静态工厂方法创建的 bean 时,使用 class 属性来指定包含静态工厂方法的类,并使用名为 factory-method
的属性来指定工厂方法本身的名称。
定义一个类,包含一个静态工厂方法返回该类的实例
package com.crab.spring.ioc.demo01;
/**
* @author zfd
* @version v1.0
* @date 2022/1/13 13:38
*/
public class StaticBean {
private static StaticBean instance = new StaticBean();
private StaticBean() {
}
/**
* 静态工厂方法返回实例
*
* @return
*/
public static StaticBean factoryMethod() {
return instance;
}
}
配置文件中配置静态工厂方法实例化bean
<?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 class="com.crab.spring.ioc.demo01.StaticBean" id="staticBean" factory-method="factoryMethod"/>
</beans>
测试类
@org.junit.Test
public void test() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("demo01/spring.xml");
ConstructorBean constructorBean = context.getBean(ConstructorBean.class);
System.out.println(constructorBean);
System.out.println("测试静态工厂方法实例化类");
StaticBean staticBean = context.getBean(StaticBean.class);
System.out.println(staticBean); // 实例地址
System.out.println(staticBean == StaticBean.factoryMethod()); // true
context.close();
}
通过实例工厂方法实例化bean
与通过静态工厂方法进行实例化类似,使用实例工厂方法进行实例化从容器中调用现有 bean 的非静态方法来创建新 bean。要使用此机制, class
属性留空,并在 factory-bean
属性中指定当前(或父级或祖先)容器中包含要调用以创建对象的实例方法的 bean 的名称。使用 factory-method
属性设置工厂方法本身的名称。
定义一个类及其工厂类
package com.crab.spring.ioc.demo01;
/**
* @author zfd
* @version v1.0
* @date 2022/1/13 13:48
*/
public class MyBean {
private String name;
public MyBean(String name) {
this.name = name;
}
@Override
public String toString() {
return "MyBean{" +
"name='" + name + '\'' +
'}';
}
}
package com.crab.spring.ioc.demo01;
/**
* @author zfd
* @version v1.0
* @date 2022/1/13 13:48
*/
public class MyBeanFactory {
/**
* 生成一个 MyBean
* @return
*/
public MyBean factoryMethod() {
return new MyBean("xxx");
}
}
配置文件中进行bean定义
<?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 class="com.crab.spring.ioc.demo01.ConstructorBean" id="constructorBean"/>
<!--静态工厂方法-->
<bean class="com.crab.spring.ioc.demo01.StaticBean" id="staticBean" factory-method="factoryMethod"/>
<!--实例工厂方法-->
<!--工厂-->
<bean class="com.crab.spring.ioc.demo01.MyBeanFactory" id="myBeanFactory"/>
<!-- 通过实例工厂方法创建的bean-->
<bean id="myBean" factory-bean="myBeanFactory" factory-method="factoryMethod"/>
</beans>
测试类输出通过实例工厂方法创建的bean
package com.crab.spring.ioc.demo01;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import static org.junit.Assert.*;
/**
* @author zfd
* @version v1.0
* @date 2022/1/13 13:32
*/
public class Test {
@org.junit.Test
public void test() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("demo01/spring.xml");
ConstructorBean constructorBean = context.getBean(ConstructorBean.class);
System.out.println(constructorBean);
System.out.println("测试静态工厂方法实例化类");
StaticBean staticBean = context.getBean(StaticBean.class);
System.out.println(staticBean);
System.out.println(staticBean == StaticBean.factoryMethod());
System.out.println("测试实例工厂方法实例化类");
MyBean myBean = context.getBean(MyBean.class);
System.out.println(myBean);
context.close();
}
}
结果输出,输出了myBean
的name
符合预期
//省略
测试实例工厂方法实例化类
MyBean{name='xxx'}
扩展:上面的工厂bean指的是在 Spring 容器中配置的 bean,它通过实例或静态工厂方法创建对象。Spring中还有一个强大的接口
FactoryBean
,同样可以产生bean,但2者不是同一个概念,感兴趣的可以了解下,后续有机会我们再详细讲。
总结
本篇主要说明了3中实例化bean的方式,可以按照实际需要进行选择使用。