Spring的三种实例化Bean的方式
Spring的三种实例化Bean的方式
1,xml配置使用bean的类构造器
2,xml配置+factory类,使用静态工厂方法实例化
3,xml配置+factory类,使用实例工厂方法实例化
?
?
?
?
1,xml配置使用bean的类构造器
请参照前一篇文章《第一个Spring程序,HELLOWORLD》。
?
?
2,xml配置+factory类,使用静态工厂方法实例化
请参照以下代码中蓝字的部分,红字的部分为第三种方法所用。
xml文件配置
xml文件名:beans.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-2.5.xsd">
? <!-- the application context definition for the springapp DispatcherServlet -->
? <bean id="sayhello" factory-method="createHelloBean"/>
? <bean id="factory" factory-bean="factory" factory-method="createHelloBean"/>
???
</beans>
工厂java文件
文件名:HelloBeanFactory.java
文件内容:
package test.service.impl;
import test.service.Hello;
public class HelloBeanFactory {
??? public static Hello createHelloBean() {
??? ??? return new HelloBean();
??? }
}
bean接口文件
文件名:Hello.java
文件内容:
package test.service;
public interface Hello {
??? public void sayHello();
??? public void sayHello2();
??? public void sayHello3();
}
bean实现文件
文件名:HelloBean.java
文件内容:
package test.service.impl;
import test.service.Hello;
public class HelloBean implements Hello {
??? public void sayHello() {
??? ??? System.out.println("这是一个测试程序");
??? }
??? @Override
??? public void sayHello2() {
??? ??? System.out.println("这是一个测试程序,测试静态工厂创建bean");
??? }
??? @Override
??? public void sayHello3() {
??? ??? System.out.println("这是一个测试程序,测试实例工厂创建bean");
??? ???
??? }
}
3,xml配置+factory类,使用实例工厂方法实例化
xml文件配置
xml文件名:beans.xml
文件内容:参照方法2中的红字部分
工厂java文件
文件名:HelloBeanInstanceFactory.java
文件内容:
package test.service.impl;
import test.service.Hello;
public class HelloBeanInstanceFactory {
??? public Hello createHelloBean() {
??? ??? return new HelloBean();
??? }
}
bean接口文件
文件名:Hello.java
文件内容:参照方法2中的红字部分
bean实现文件
文件名:HelloBean.java
文件内容:参照方法2中的红字部分
好,最后测试文件
文件名:FirstSpring.java
文件内容:
package test.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import test.service.Hello;
public class FirstSpring {
???
??? public static void main(String[] args) {
??? ???
??? ??? testHello();
??? ??? testHelloForStaticFactory();
??? ??? testHelloForInstanceFactory();
??? }
???
??? public static void testHello() {
??? ??? ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
??? ??? Hello hello =(Hello) applicationContext.getBean("sayhello");
??? ??? hello.sayHello();
??? ???
??? }
???
??? public static void testHelloForStaticFactory() {
??? ??? ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
??? ??? Hello hello =(Hello) applicationContext.getBean("sayhello2");
??? ??? hello.sayHello2();
??? ???
??? }
???
??? public static void testHelloForInstanceFactory() {
??? ??? ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
??? ??? Hello hello =(Hello) applicationContext.getBean("sayhello3");
??? ??? hello.sayHello3();
??? ???
??? }
}
都写完了,来执行一下,结果输出:
这是一个测试程序
这是一个测试程序,测试静态工厂创建bean
这是一个测试程序,测试实例工厂创建bean
总结一下:
三种方法的用处,
第一种方法,通过bean的缺省构造函数创建,当各个bean的业务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用。
第二种方法,利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创建之前需要相同的初始化处理,则可用这个factory方法险进行统一的处理等等。
第三种方法,利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,觉得1可用于集成其他框架的bean创建管理方法,2能够使bean和factory的角色互换。