Spring:IOC容器创建Bean的方式有哪几种?

三种:直接使用构造器、从静态工厂中拿、从实例工厂中拿。

 


一、直接使用构造器

1、配置bean

    <bean class="com.lurenjia.dao.DemoDao" id="demoDao"></bean>

2、从容器中获取

        //获取到ioc容器对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        //获取到bean对象
        DemoDao demoDao = applicationContext.getBean("demoDao",DemoDao.class);

二、从静态工厂中拿

  静态工厂:生产对象的方法为静态方法。

1、配置bean

    <!--通过静态工厂获取一个demo对象-->
    <bean id="demoDao2" class="com.lurenjia.factory.DemoFactory" factory-method="getObject"></bean>

2、从容器中获取

        //获取到ioc容器对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        //获取到bean对象
        DemoDao demoDao = applicationContext.getBean("demoDao2",DemoDao.class);

三、从实例工厂中拿

  实例工厂,生产对象的方法不为静态方法,即必须通过工厂的实例对象调用。

1、配置bean

    <!--配置工厂对象-->
    <bean id="factory" class="com.lurenjia.factory.DemoFactory"></bean>
    <!--配置要拿的对象-->
    <bean id="demoDao" factory-bean="factory" factory-method="getObject"></bean>

2、从容器中获取

        //获取到ioc容器对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        //获取到bean对象
        DemoDao demoDao = applicationContext.getBean("demoDao",DemoDao.class);

针对实例工厂的配置繁琐,spring提供了一个FactoryBean接口,实例工厂类只要实现了这个接口就能够简化配置。


四、实例工厂实现FactoryBean接口

1、实现接口,重写方法

//泛型内为要创建的对象类型
public class DemoFactory implements FactoryBean<DemoDao> {
    //创建对象的方法
    public DemoDao getObject(){
        return new DemoDao();
    }

    //拿到对象类型的方法
    @Override
    public Class<?> getObjectType() {
        return null;
    }
    //是否为单例对象,可不重写此方法,默认为true
    @Override
    public boolean isSingleton() {
        return true;
    }
}

问题:如果我在实例工厂声明了我造的对象为原型对象,而在配置文件中配置为单例(scope="singleton"),那会如何?

答案:会造出原型对象,非单例。


2、配置bean

<bean id="demoDao" class="com.lurenjia.factory.DemoFactory"></bean>

3、从容器中获取对象

        //获取到ioc容器对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        //获取到bean对象
        DemoDao demoDao = applicationContext.getBean("demoDao",DemoDao.class);

 

posted @ 2023-03-10 18:34  在博客做笔记的路人甲  阅读(46)  评论(0编辑  收藏  举报