3. 实例化Bean的三种方式

本文详细介绍了在Spring框架中实例化Bean的三种常见方式:通过构造方法、静态工厂以及实例工厂。每种方式都配合XML配置文件进行说明,并展示了运行结果和注意事项,特别是强调了无参构造方法在构造方法方式中的必要性。

实例化Bean的三种方式

一、构造方法方式

1.1 BookDaoImpl

package com.lin.dao.daoimpl;

import com.lin.dao.BookDao;

public class BookDaoImpl implements BookDao {

    public BookDaoImpl() {
        System.out.println("BookDao的无参构造器");
    }

    /**
     * 数据层实现
     */
    public String queryBooks() {
        System.out.println("数据层查询书本方法");
        return "数据层查询书本方法";
    }
}

1.2 applicationContext.xml配置

   <!--
           bean标签:表示配置bean,
          id属性:bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一
          class属性:表示给bean定义类型,即配置的bean的全路径类名
         -->
       <!--方式一:构造方法实例化bean-->
    <bean id="bookDao"  class="com.lin.dao.daoimpl.BookDaoImpl"></bean>

1.3 ConstructorMethodForInstance

package com.lin.beaninstance;

import com.lin.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * bean实例化方式一:构造方法方式
 */
public class ConstructorMethodForInstance {
    public static void main(String[] args) {
        //1.创建IoC容器对象,加载spring核心配置文件
        ApplicationContext springContext = new ClassPathXmlApplicationContext("applicationContext.xml");

        //2 从IOC容器中获取Bean对象(BookDao对象)
        BookDao bookDao = (BookDao) springContext.getBean("bookDao");
        //3 调用Bean对象(BookDao对象)的方法
        bookDao.queryBooks();


    }
}

运行结果

image-20221215230042227

注意:无参构造方法如果不存在,将抛出异常BeanCreationException

二、静态工厂方式

2.1 BookDaoStaticFactory静态工厂

package com.lin.factory;

import com.lin.dao.BookDao;
import com.lin.dao.daoimpl.BookDaoImpl;

public class BookDaoStaticFactory {
    //静态工厂创建对象
    public static BookDao getBookDao(){
      System.out.println("静态工厂的方法执行了");
        return new BookDaoImpl();
    }

}

2.2 applicationContext.xml配置

 <!--方式二:使用静态工厂实例化bean-->
<bean id="bookDao" class="com.lin.factory.BookDaoStaticFactory" factory-method="getBookDao"></bean>

2.3 关系图

image-20221215225848215

2.4 StaticFactoryForInstance

package com.lin.beaninstance;

import com.lin.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * bean实例化方式二:静态工厂方式
 */
public class StaticFactoryForInstance {

    public static void main(String[] args) {
        //1.创建IoC容器对象,加载spring核心配置文件
        ApplicationContext springContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2 从IOC容器中获取Bean对象(BookDao对象)
        BookDao bookDao = (BookDao) springContext.getBean("bookDao");
        //3 调用Bean对象(BookDao对象)的方法
        bookDao.queryBooks();

    }
}

2.4 运行结果

image-20221215230326381

三 、实例工厂方式

3.1 BookDaoFactory工厂类

package com.lin.factory;

import com.lin.dao.BookDao;
import com.lin.dao.daoimpl.BookDaoImpl;

public class BookDaoFactory {
    //实例工厂创建对象
    public BookDao getBookDao(){
        return new BookDaoImpl();
    }
}

3.2 applicationContext.xml配置

     <!--方式三:使用实例工厂实例化bean-->
    <bean id="bookDaoFactory" class="com.lin.factory.BookDaoFactory"></bean>

    <bean id="bookDao" factory-bean="bookDaoFactory" factory-method="getBookDao"></bean>

3.3 关系图

image-20221215231354502

3.4 实现FactoryBean<T>方式

定义BookDaoFactoryBean实现FactoryBean
package com.lin.beaninstance;

import com.lin.dao.BookDao;
import com.lin.dao.daoimpl.BookDaoImpl;
import org.springframework.beans.factory.FactoryBean;

public class BookDaoFactoryBean implements FactoryBean<BookDao> {
    @Override
    public BookDao getObject() throws Exception {
        return new BookDaoImpl();
    }

    @Override
    public Class<?> getObjectType() {
        return BookDao.class;
    }
}

applicationContext.xml配置
    <bean id="bookDao" class="com.lin.beaninstance.BookDaoFactoryBean"></bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖分你俩颗~~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值