【Spring】04-2:bean几种被实例化的具体方式

119 阅读1分钟

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,除此之外毫无意义。