Spring中实例化Bean的三种方式
通过构造器实例化
可以直接使用默认的构造器实例化Bean
先创建Bean04类,为了等一下能够区分是哪种方式实例化的Bean,所以可以在该类中添加一个方法输出一条语句。
public class Bean04 {
// 构造器实例化
public void msg() {
System.out.println("构造器实例化Bean");
}
}
再编写配置文件bean04.xml,再该配置文件中写入如下内容。
<bean id="bean04" class="top.lukeewin.dao.Bean04"></bean>
最后编写测试类。
// 测试构造器实例化
@Test
public void test01() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean04.xml");
Bean04 bean04 = (Bean04) ctx.getBean("bean04");
bean04.msg();
}
通过静态工厂实例化
创建两个类,一个类作为Bean类,另一个作为静态工厂类,并且静态工厂类中必须有一个静态方法。静态方法返回一个Bean实例。
定义一个Bean类
public class Bean05 {
// 静态工厂实例化
public void msg() {
System.out.println("静态工厂实例化Bean");
}
}
定义一个静态工厂类
public class StaticBeanFactory {
// 静态工厂实例化
public static Bean05 getInstance() {
return new Bean05();
}
}
然后需要配置xml配置文件。
需要注意的是:配置文件中一定要记得加上factory-method
属性,并且该属性的值是静态工厂中的静态方法,即返回实例的方法。同时还需要注意class路径写的是静态工厂的类路径,而不是实例的类路径。
<bean id="bean05" class="top.lukeewin.dao.StaticBeanFactory" factory-method="getInstance"></bean>
最后编写测试代码
// 测试静态工厂实例化
@Test
public void test02() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean04.xml");
Bean05 bean05 = (Bean05) ctx.getBean("bean05");
bean05.msg();
}
通过实例工厂实例化
创建两个类,一个作为Bean类,另一个作为实例工厂类,**这里不需要定义为静态方法。**只需要设置一下配置文件即可。
定义一个Bean类
public class Bean06 {
// 实例工厂实例化
public void msg() {
System.out.println("实例工厂实例化Bean");
}
}
定义一个实例工厂类
public class BeanFactory01 {
// 实例工厂实例化
private Bean06 getInstance() {
return new Bean06();
}
}
然后编写配置文件。
配置文件中需要注意:分别定义两个bean标签,其中实例工厂类中的bean标签和其它普通bean标签一样,但是实例类中的bean标签必须要有factory-bean
属性,并且属性的值是实例工厂的id值。还需要有factory-method
属性,该属性的值指明了由实例工厂中的哪个方法产生实例。
<bean id="bean06_instance" class="top.lukeewin.dao.BeanFactory01"></bean>
<bean id="bean06" factory-bean="bean06_instance" factory-method="getInstance"></bean>
编写测试代码。
// 测试实例工厂实例化
@Test
public void test03() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean04.xml");
Bean06 bean06 = (Bean06) ctx.getBean("bean06");
bean06.msg();
}
最后三种方式的运行结果如图所示。
视频教程在我的B站中
Q.E.D.