Spring 4 IOC 相关内容 4.2 bean 实例化 2 静态工厂实例化

2022-10-30 10:29:37

Spring

【黑马程序员2022新版SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术】

4 IOC 相关内容

4.2 bean 实例化

4.2.4 静态工厂实例化

【使用工厂创建对象的方式】

准备一个OrderDao和OrderDaoImpl类

packagecom.dingjiaxiong.dao;/**
 * ClassName: OrderDao
 * date: 2022/9/16 13:40
 *
 * @author DingJiaxiong
 */publicinterfaceOrderDao{publicvoidsave();}
packagecom.dingjiaxiong.dao.impl;importcom.dingjiaxiong.dao.OrderDao;/**
 * ClassName: orderDaoImpl
 * date: 2022/9/16 13:40
 *
 * @author DingJiaxiong
 */publicclass orderDaoImplimplementsOrderDao{@Overridepublicvoidsave(){System.out.println("order dao save ...");}}

创建一个工厂类 OrderDaoFactory 并提供一个静态方法

packagecom.dingjiaxiong.factory;importcom.dingjiaxiong.dao.OrderDao;importcom.dingjiaxiong.dao.impl.orderDaoImpl;/**
 * ClassName: OrderDaoFactory
 * date: 2022/9/16 13:42
 *
 * @author DingJiaxiong
 */publicclassOrderDaoFactory{publicstaticOrderDaogetOrderDao(){returnneworderDaoImpl();}}

编写AppForInstanceOrder运行类,在类中通过工厂获取对象

packagecom.dingjiaxiong;importcom.dingjiaxiong.dao.OrderDao;importcom.dingjiaxiong.factory.OrderDaoFactory;/**
 * ClassName: AppForInstanceOrder
 * date: 2022/9/16 13:43
 *
 * @author DingJiaxiong
 */publicclassAppForInstanceOrder{publicstaticvoidmain(String[] args){//通过静态工厂创建对象OrderDao orderDao=OrderDaoFactory.getOrderDao();
        orderDao.save();}}

测试运行

在这里插入图片描述

OK,可以看到正常运行的结果,【这种方式可以进行一定程度的解耦】

问题:如果代码中的对象是通过这种工厂方式创建的,如何将其交给Spring 进行管理?

【Spring 静态工厂实例化】

实现步骤

① 在spring的配置文件applicationContext.xml中添加

<bean id="orderDao" class="com.dingjiaxiong.factory.OrderDaoFactory" factory-method="getOrderDao"/>

在这里插入图片描述

  • class:工厂类的类全名
  • factory-mehod:具体工厂类中创建对象的方法名

对应关系

在这里插入图片描述

在AppForInstanceOrder运行类,使用从IOC容器中获取bean的方法进行运行测试

packagecom.dingjiaxiong;importcom.dingjiaxiong.dao.OrderDao;importcom.dingjiaxiong.factory.OrderDaoFactory;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;/**
 * ClassName: AppForInstanceOrder
 * date: 2022/9/16 13:43
 *
 * @author DingJiaxiong
 */publicclassAppForInstanceOrder{publicstaticvoidmain(String[] args){//        //通过静态工厂创建对象//        OrderDao orderDao = OrderDaoFactory.getOrderDao();//        orderDao.save();ApplicationContext context=newClassPathXmlApplicationContext("applicationContext.xml");OrderDao orderDao=(OrderDao) context.getBean("orderDao");
        orderDao.save();}}

在这里插入图片描述

第二种方式就是这样,

在这里插入图片描述

问题来了,这种方式在工厂类中不也是直接new对象的,和咱们自己直接new没什么太大的区别,而且静态工厂的方式反而更复杂,这种方式的意义是什么?

主要的原因是:

在工厂的静态方法中,开发者除了new对象还可以做其他的一些业务操作,这些操作必不可少

在这里插入图片描述

直接new 就无法添加其他的业务内容

静态工厂实例化这种方式一般是用来兼容早期的一些老系统,所以了解为主。

  • 作者:Ding Jiaxiong
  • 原文链接:https://dingjiaxiong.blog.csdn.net/article/details/127220343
    更新时间:2022-10-30 10:29:37