spring bean实例化的三种方法

本文详细介绍了Spring框架中bean的四种实例化方式:构造方法实例化、静态工厂实例化、实例工厂实例化以及FactoryBean实例化。通过代码示例和运行结果分析,展示了每种方式的特点和应用场景,帮助读者深入理解Spring bean的实例化过程。
摘要由CSDN通过智能技术生成


昏黄色系的街道上,并没有太多的色彩,唯有这座支在废瓦堆旁的小摊,像仙人掌上的一朵红花,点亮了整片沙漠的活力。​


前言(代码结构)

在这里插入图片描述


一、构造方法实例化bean(实用)

1.代码:

BookDaoImpl类:

package com.hewen.dao.impl;

import com.hewen.dao.BookDao;

/**
 * @author heWen
 */
public class BookDaoImpl implements BookDao {

    /**无参构造器,创建对象时必须要用,在此处代码如果运行了,就代表创建对象时运行了此代码,对于构造器的理解看看example
     公共的和私有的都可以访问,    有无都可以  1.结论:实例化bean就是用构造方法来实例化对象**/
    public BookDaoImpl() {
        System.out.println("book dao 构造器 is running ....");
    }

    @Override
    public void save() {
        System.out.println("book dao save ...");
    }

}

BookDao接口:

package com.hewen.dao;

public interface BookDao {
    public void save();
}

AppForInstanceBook:

package com.hewen;

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

public class AppForInstanceBook {
    public static void main(String[] args) {

        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");

        bookDao.save();

    }
}

xml配置:
在这里插入图片描述

2.运行结果:

在这里插入图片描述

3.实例化说明:

构造方法实例化bean使用了无参构造器,可以省略无参构造器的书写。实例化bean就是用构造方法来实例化对象。


二、使用静态工厂实例化bean(了解)

1.代码

OrderDaoFactory类:

package com.hewen.factory;

import com.hewen.dao.OrderDao;
import com.hewen.dao.impl.OrderDaoImpl;

/**静态工厂创建对象
 * @author heWen*/
public class OrderDaoFactory {
    /**一个方法,返回OrderDao对象的方法*/
    public static OrderDao getOrderDao(){
        System.out.println("factory setup....");
        return new OrderDaoImpl();
    }
}

AppForInstanceOrder类:

package com.hewen;

import com.hewen.dao.OrderDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForInstanceOrder {
    public static void main(String[] args) {
        //通过静态工厂创建对象
//        OrderDao orderDao = OrderDaoFactory.getOrderDao();
//        orderDao.save();


        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");

        orderDao.save();

    }
}

xml配置:
在这里插入图片描述

2.运行结果:

在这里插入图片描述

3.实例化说明:

工厂模式可以实现解耦,用于生成实例对象,所有的方法必须是static。class必须是工厂类,factory-method后接工厂类中的创建对象的方法。


三、使用实例工厂实例化bean(了解)

1.代码:

UserDaoFactory类:

package com.hewen.factory;

import com.hewen.dao.UserDao;
import com.hewen.dao.impl.UserDaoImpl;

/**
 * @author heWen
 */ //实例工厂创建对象
public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

AppForInstanceUser类:

package com.hewen;

import com.hewen.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForInstanceUser {
    public static void main(String[] args) {
//        //创建实例工厂对象
//        UserDaoFactory userDaoFactory = new UserDaoFactory();
//        //通过实例工厂对象创建对象
          //因为是非静态的,用工厂对象.方法  用工厂的对象调方法
//        UserDao userDao = userDaoFactory.getUserDao();
//        userDao.save();


        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        OrderDao orderDao = (UserDao) ctx.getBean("userDao");

        userDao.save();

    }
}

xml配置:
在这里插入图片描述

在这里插入图片描述

2.运行结果:

在这里插入图片描述

3.实例化说明:

比较与上一个,在UserDaoFactory类中使用了实例化的方法,先要把工厂的实例化对象造出来,再使用工厂类中的方法。


四、使用FactoryBean实例化bean(三改)(常用)

1.代码:

UserDaoFactoryBean类:

package com.hewen.factory;

import com.hewen.dao.UserDao;
import com.hewen.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;
//FactoryBean创建对象
/**FactoryBean<>,泛型中你想让它造什么对象,就填什么*/
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    /**代替原始实例工厂中创建对象的方法(UserDaoFactory中的方法)*/
    @Override
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    /**这个对象是什么类型的?就是UserDao类型,就直接放入UserDao的字节码即可*/
    @Override
    public Class<?> getObjectType() {
        return UserDao.class;
    }

}

AppForInstanceUser类:

package com.hewen;

import com.hewen.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForInstanceUser {
    public static void main(String[] args) {
//        //创建实例工厂对象
//        UserDaoFactory userDaoFactory = new UserDaoFactory();
//        //通过实例工厂对象创建对象
          //因为是非静态的,用工厂对象.方法  用工厂的对象调方法
//        UserDao userDao = userDaoFactory.getUserDao();
//        userDao.save();


        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        OrderDao orderDao = (UserDao) ctx.getBean("userDao");

        userDao.save();

    }
}

xml配置:
在这里插入图片描述

2.运行结果:

在这里插入图片描述

3.实例化说明:

在这里插入图片描述
在方法三中配置时出现了以上的问题,于是使用方法四实现FactoryBean<>接口。同时既然造出了对象,通过以下方法查看是否单例?
在这里插入图片描述
在这里插入图片描述
由结果可得是单例。在UserDaoFactoryBean类中重写isSingleton()方法可改为非单例。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

开心比较堵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值