实例化bean的三种方式
1. 构造方法(常用)
Spring创建bean调用的是无参的构造方法,且无论该无参构造方法是公有还是私有的,都可以调用(底层实现原理为反射)
2. 静态工厂(了解)
要配置
factory-method
工厂对象,真正创建对象的方法
<!--方式二:使用静态工厂实例化bean-->
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
使用静态工厂主要是因为部分业务需要由改工厂完成
//静态工厂创建对象
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
System.out.println("factory setup....");
return new OrderDaoImpl();
}
}
3. 实例工厂与FactoryBean
方法为非静态,所有需要先将实例工厂的bean造出来,再声明
factory-method
,然后声明工厂bean的id
和上面第二种静态工厂的区别在于,静态工厂不需要声明工厂配置,因为静态方法自动执行
<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
可以看出该方法缺点非常明显
所有Spring做出了改良,后续有大量使用
创建UserDaoFactoryBean
//FactoryBean创建对象
// 造什么对象,泛型写什么类型
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//代替原始实例工厂中创建对象的方法
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
// 返回UserDao的字节码
public Class<?> getObjectType() {
return UserDao.class;
}
}
xml配置文件
<!--方式四:使用FactoryBean实例化bean-->
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>