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 就无法添加其他的业务内容
静态工厂实例化这种方式一般是用来兼容早期的一些老系统,所以了解为主。