bean就是对象,本节讨论如何创建对象。
UserDao userDao = ctx.getBean("userDao");
那么,这句话究竟是如何实例化对象的呢?
04:使用FactoryBean实例化bean
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//代替原始实例工厂中创建对象的方法
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
public Class<?> getObjectType() {
return UserDao.class;
}
public boolean isSingleton() {
return true; //false:非单例
}
}
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
虽然bean的class是FactoryBean,但是造出的其实是getObject()的对应的对象。
01:无参构造方法
显式无参构造方法,还是不写无参构造方法,都行。默认就什么都不写即可。
如果无参构造方法不存在(有“有参构造”但是无“无参构造”),则抛出异常:BeanCreationException。
02:静态工厂
静态工厂 创建对象:
// AppForInstanceOrder
OrderDao orderDao = OrderDaoFactory.getOrderDao();
// OrderDaoFactory
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
System.out.println("factory setup....");
return new OrderDaoImpl();
}
}
“静态工厂”改成 bean 进行管理:
// AppForInstanceOrder
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
03:实例工厂(先创工厂,再由工厂创建对象)
// AppForInstanceUser
UserDaoFactory userDaoFactory = new UserDaoFactory();
UserDao userDao = userDaoFactory.getUserDao();
// UserDaoFactory
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
“实例工厂”改成 bean 进行管理:
<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
<bean id="userDao" factory-bean="userFactory" factory-method="getUserDao" />
对比“静态工厂”:
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
多了一个工厂的bean。
因为是不是静态方法static,所以得先造userFactory的bean,但是这个userFactory的bean纯粹是为了造userDao的bean,除此之外毫无意义。