Spring
【黑马程序员2022新版SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术】
4 IOC 相关内容
文章目录
- Spring
- 4 IOC 相关内容
- 4.2 bean 实例化
- 4.2.5 实例工厂与FactoryBean
- 4.2.6 bean 实例化小结
4.2 bean 实例化
4.2.5 实例工厂与FactoryBean
【第三种bean 的创建方式 → 实例工厂实例化】
【环境准备】
准备一个UserDao和UserDaoImpl类
package com.dingjiaxiong.dao;/*** ClassName: UserDao* date: 2022/9/16 14:04** @author DingJiaxiong*/public interface UserDao {public void save();
}
package com.dingjiaxiong.dao.impl;import com.dingjiaxiong.dao.UserDao;/*** ClassName: UserDaoImpl* date: 2022/9/16 14:05** @author DingJiaxiong*/public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("user dao save ...");}
}
创建一个工厂类OrderDaoFactory并提供一个普通方法,注意此处和静态工厂的工厂类不一样的地方是方法不是静态方法
package com.dingjiaxiong.factory;import com.dingjiaxiong.dao.UserDao;
import com.dingjiaxiong.dao.impl.UserDaoImpl;/*** ClassName: UserDaoFactory* date: 2022/9/16 14:06** @author DingJiaxiong*/public class UserDaoFactory {public UserDao getUserDao(){return new UserDaoImpl();}
}
编写AppForInstanceUser运行类,在类中通过工厂获取对象
package com.dingjiaxiong;import com.dingjiaxiong.dao.UserDao;
import com.dingjiaxiong.factory.UserDaoFactory;/*** ClassName: AppForInstanceUser* date: 2022/9/16 14:08** @author DingJiaxiong*/public class AppForInstanceUser {public static void main(String[] args) {//创建实例工厂对象UserDaoFactory userDaoFactory = new UserDaoFactory();//通过实例工厂对象创建对象UserDao userDao = userDaoFactory.getUserDao();userDao.save();}
}
运行查看结果
问题来了,这种方式如何交给Spring 进行管理 → 实例工厂实例化
具体实现步骤为:
① 在spring的配置文件中添加以下内容:
<!-- 第三种方式:使用实例工厂 -->
<!-- 先造工厂的bean -->
<bean id="userFactory" class="com.dingjiaxiong.factory.UserDaoFactory"/>
<!-- 再造Dao的bean -->
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
实例化工厂运行的顺序是:
- 创建实例化工厂对象,对应的是第一行配置
- 调用对象中的方法来创建bean,对应的是第二行配置
- factory-bean:工厂的实例对象
- factory-method:工厂对象中的具体创建对象的方法名
对应关系
factory-mehod:具体工厂类中创建对象的方法名
在AppForInstanceUser运行类,使用从IOC容器中获取bean的方法进行运行测试
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) context.getBean("userDao");
userDao.save();
这就是第三种实例化方式,
配置的过程还是比较复杂,所以Spring为了简化这种配置方式就提供了一种叫FactoryBean的方式来简化开发。
【FactoryBean 的使用】【实用】
具体的使用步骤为:
① 创建一个UserDaoFactoryBean的类,实现FactoryBean接口,重写接口的方法
package com.dingjiaxiong.factory;import com.dingjiaxiong.dao.UserDao;
import com.dingjiaxiong.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;/*** ClassName: UserDaoFactoryBean* date: 2022/9/16 14:23** @author DingJiaxiong*/public class UserDaoFactoryBean implements FactoryBean<UserDao> {//代替原始实例工厂中创建对象的方法@Overridepublic UserDao getObject() throws Exception {return new UserDaoImpl();}//返回所创建类的Class对象@Overridepublic Class<?> getObjectType() {return UserDao.class;}
}
这样看起来好像并不简单,但是配置就可以简单了
② 在Spring的配置文件中进行配置
<!-- 改进的工厂 -->
<bean id="userDao" class="com.dingjiaxiong.factory.UserDaoFactoryBean"/>
就行了
③ 直接运行
这种方式在Spring去整合其他框架的时候会被用到【务必掌握】
刚刚咱们实现接口时,其实有三个方法
分别是
T getObject() throws Exception;Class<?> getObjectType();default boolean isSingleton() {return true;
}
- 方法一:getObject(),被重写后,在方法中进行对象的创建并返回
- 方法二:getObjectType(),被重写后,主要返回的是被创建类的Class对象
- 方法三:没有被重写,因为它已经给了默认值,从方法名中可以看出其作用是设置对象是否为单例
验证一下是不是单例
可以看到默认确实是单例的。
改成非单例
从结果中可以看出现在已经是非单例了,但是一般情况下咱们都会采用单例,也就是采用默认即可。所以isSingleton()方法一般不需要进行重写。
这就是“第四种”实例化bean 的方式
4.2.6 bean 实例化小结
【bean是如何创建的呢?】
构造方法
【Spring的IOC实例化对象的三种方式分别是】
- 构造方法(常用)
- 静态工厂(了解)
- 实例工厂(了解)
- FactoryBean(实用)
需要注意的一点是,构造方法在类中默认会提供,但是如果重写了构造方法,默认的就会消失,在使用的过程中需要注意,如果需要重写构造方法,最好把默认的构造方法也重写下。