spring bean实例化的三种方法

文章目录

  • 前言(代码结构)
  • 一、构造方法实例化bean(实用)
    • 1.代码:
    • 2.运行结果:
    • 3.实例化说明:
  • 二、使用静态工厂实例化bean(了解)
    • 1.代码
    • 2.运行结果:
    • 3.实例化说明:
  • 三、使用实例工厂实例化bean(了解)
    • 1.代码:
    • 2.运行结果:
    • 3.实例化说明:
  • 四、使用FactoryBean实例化bean(三改)(常用)
    • 1.代码:
    • 2.运行结果:
    • 3.实例化说明:


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


前言(代码结构)

spring bean实例化的三种方法_第1张图片


一、构造方法实例化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配置:
spring bean实例化的三种方法_第2张图片

2.运行结果:

spring bean实例化的三种方法_第3张图片

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.运行结果:

spring bean实例化的三种方法_第4张图片

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配置:
spring bean实例化的三种方法_第5张图片

spring bean实例化的三种方法_第6张图片

2.运行结果:

spring bean实例化的三种方法_第7张图片

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.运行结果:

spring bean实例化的三种方法_第8张图片

3.实例化说明:

spring bean实例化的三种方法_第9张图片
在方法三中配置时出现了以上的问题,于是使用方法四实现FactoryBean<>接口。同时既然造出了对象,通过以下方法查看是否单例?
spring bean实例化的三种方法_第10张图片
spring bean实例化的三种方法_第11张图片
由结果可得是单例。在UserDaoFactoryBean类中重写isSingleton()方法可改为非单例。
spring bean实例化的三种方法_第12张图片

你可能感兴趣的:(#,spring,spring,java,后端)