Spring Ioc 实例化 bean 对象的三种方式 :
默认构造器创建
<bean id="userService" class="com.shsxt.service.UserService"></bean>
//构造器实例化,默认调用其空构造
@Test
public void test01(){
UserService userService = null;
BeanFactory factory = new ClassPathXmlApplicationContext("spring01.xml");
userService = (UserService) factory.getBean("userService");
userService.test();
}
通过默认构造器创建,空构造必须存在,否则创建失败
静态工厂
package com.shsxt.factory;
import com.shsxt.service.UserService;
public class StaticFactory
{
public static UserService createUserService()
{
return new UserService();
}
xml中bean的配置
<bean id="userService" class="com.shsxt.factory.StaticFactory" factory-method="createUserService"/>
使用静态工厂的方式创建Bean
//静态工厂实现实例化
@Test
public void test02(){
UserDao userDao = null;
BeanFactory factory = new ClassPathXmlApplicationContext("spring02.xml");
userDao = (UserDao) factory.getBean("userDao");
userDao.test();
}
实例化工厂实现
package com.factory;
import com.shsxt.dao.AccountDao;
public class InstanceFactory {
public AccountDao getAccountDao(){
return new AccountDao();
}
}
//实例化工厂实现实例化
@Test
public void test03(){
BeanFactory factory = new ClassPathXmlApplicationContext("spring03.xml");
AccountDao accountDao = (AccountDao) factory.getBean("accountDao");
accountDao.test();
//测试是不是单例模式
System.out.println(factory.isSingleton("accountDao"));//true
}
<!-- 实例化工厂实现-->
<bean id="instanceFactory" class="com.factory.InstanceFactory" ></bean>
<bean id="accountDao" factory-bean="instanceFactory" factory-method="getAccountDao"></bean>
三者之间的比较:
通过bean缺省构造函数创建:当各个bean的业务逻辑相互比较独立时,或者与外界关联较少时可以使用
静态factory方法创建:可以统一管理各个bean的创建,各个bean在创建之前需要相同的初始化处理,则可用这个factory方法进行统一的处理
实例化factory方法创建:1.将factory方法也作为业务bean控制,可以用于集成其他框架的bean创建管理方法,2.能够使bean和factory的角色互换