【Spring】07 后续的学习补充 vol1
控制反转Inverse Of Control的演变:
在之前的原生Javaweb项目的问题:
我们三层架构每一层之间的联系是这样的:
由GradeDao接口指向GradeDaoImpl

再由GradeService指向GradeServiceImpl

但是我们发现,如果这样写死在每一层的硬编码中的话,那么接口的存在就失去了意义
对象的创建是由这个上层的内部所决定
我们是希望每一层的联系最小化,但是又不能完全隔绝关系,组件就像组装的好的零件
相互之间的依赖降低到最小,比如这个daoImpl我需要替换,就根据实现的dao接口就可以有
MySQL实现,Oracle实现,PostgreSQL实现等等
对象的创建可以移交到外部,我们在内部设置setter注入即可,或者使用带参构造器

通过setter或者带参构造器,我们可以从本层的内部创建对象这个控制权力,移交到了外面
虽然这还是硬编码中
接下来我们就创建一个工厂类,由工厂实现对象的创建,而这个行为,非常像生产产品
一个个对象即我们的业务的产品

对象的注入交由工厂生产给予

但是我们是不是发现,工厂的产品还是固定的?然后再像Jdbc一样,
通过读取配置文件的形式解除耦合
首先是配置文件:bean.properties
例如这里我就配置另外一种实现
AaaDao = ioc.dao.AaaDaoImpl2
AaaService = ioc.service.AaaServiceImpl2
这里只是键值对简单的字符串
然后改造我们的BeanFactory
通过加载的时候读取配置文件直接生成对象放进这个map容器中
这个容器不就是bean的容器了吗,键对应的实现类名,值即对象

put放进去的key应该换value进去。。。我有点分不清
但这不是重点,我们下面获取对象的方法就是从容器里面获取
这就需要key作为参数:
再加上泛型,这样我们就不需要进行强转了

但是有个问题就是dao也是接口啊,接口指向了之后没办法在setter了,但是可以不设置接口处理
className应该换成叫beanName

现在我们通过配置文件的方式来获取对象,整个过程完全看不到一个new字。
总结:写的好烂,过程改了好几回
瞎扯的代码:
Bean工厂
package ioc; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties; /**
* @author DaiZhiZhou
* @file OA-Project
* @create 2020-07-24 22:57
*/
public class BeanFactory { private static Map<String,Object> beanContainer = new HashMap<>(); static {
try {
// InputStream inputStream = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
// 因为找不到配置文件就检查下路径的读取
String file = BeanFactory.class.getClassLoader().getResource("bean.properties").getFile();
System.out.println(file);
InputStream inputStream = new FileInputStream(new File(file)); Properties properties = new Properties();
properties.load(inputStream); Enumeration<Object> keys = properties.keys(); while (keys.hasMoreElements()) {
String key = (String)keys.nextElement();
String value = properties.getProperty(key); Class<?> classByValue = Class.forName(value);
Object valueInstance = classByValue.newInstance();
beanContainer.put(key, valueInstance);
} } catch (Exception e) {
e.printStackTrace();
}
} public static <Bean>Bean getBean(String className, Class<Bean> beanClass) {
Object o = beanContainer.get(className);
return (Bean)o;
} }
properties:
AaaDao = ioc.dao.AaaDaoImpl2
AaaService = ioc.service.AaaServiceImpl2
测试类:假装是视图的Servlet
package ioc.servlet; import ioc.BeanFactory;
import ioc.dao.AaaDao;
import ioc.dao.AaaDaoImpl;
import ioc.service.AaaService;
import ioc.service.AaaServiceImpl;
import ioc.service.AaaServiceImpl2;
import org.junit.Test; /**
* @author DaiZhiZhou
* @file OA-Project
* @create 2020-07-24 22:48
*/
public class AaaServletFake { private AaaService aaaService; public void setAaaService(AaaService aaaService) {
this.aaaService = aaaService;
} @Test
public void toAaaListPage() {
setAaaService(new AaaServiceImpl(new AaaDaoImpl()));
aaaService.getAaaList();
} @Test
public void toAaaListPageByFactoryProduct() {
//this.setAaaService(BeanFactory.getAaaService());
aaaService.getAaaList();
} @Test
public void toAaaListPageByFactoryProductPropertyFileInject() {
AaaDao aaaDao = BeanFactory.getBean("AaaDao", AaaDao.class);
AaaServiceImpl2 aaaServiceImpl2 = BeanFactory.getBean("AaaService", AaaServiceImpl2.class);
aaaServiceImpl2.setAaaDao(aaaDao);
this.setAaaService(aaaServiceImpl2);
this.aaaService.getAaaList();
} }
关于注入问题的再补充:
因为存在这种工厂方式的注入,所以Spring就也提供了对应的这种方式:
静态工厂获取 和 工厂实例方法获取:
详细见:
http://123.57.58.29/blog/1591625710261
静态工厂
<!-- 此种方式是:
使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器
id 属性:指定 bean 的 id,用于从容器中获取
class 属性:指定静态工厂的全限定类名
factory-method 属性:指定生产对象的静态方法
--> <bean id="accountService" class="com.tc51.factory.StaticFactory" factory-method="createAccountService"></bean>
实例工厂
<!--创建工厂对象-->
<!--先通过实例工厂创建对象-->
<bean id="bean3Factory" class="com.tc51.factory.Bean3Factory"></bean>
<bean id="accountService" factory-bean="bean3Factory" factory-method="createAccountService"></bean>
【Spring】07 后续的学习补充 vol1的更多相关文章
- 写给大忙人的spring cloud 1.x学习指南
这几天抽空搞了下spring cloud 1.x(2.0目前应该来说还不成熟),因为之前项目中使用dubbo以及自研的rpc框架,所以总体下来还是比较顺利,加上spring boot,不算笔记整理,三 ...
- Spring Cloud微服务学习笔记
Spring Cloud微服务学习笔记 SOA->Dubbo 微服务架构->Spring Cloud提供了一个一站式的微服务解决方案 第一部分 微服务架构 1 互联网应用架构发展 那些迫使 ...
- 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)
强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...
- Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6869133.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(三)——MyBatis全局配置文件解析
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6874672.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6878529.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(三)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6908763.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(四)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(六)——MyBatis关联查询
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6923464.html 前面有将到:Spring+SpringMVC+MyBatis深入学习及搭建(五)--动 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6953005.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(六)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6956206.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(七)——My ...
随机推荐
- 记录工作中常用的 JS 数组相关操作
工作中难免会遇到各种各样的数据结构,较为全面的了解数组操作,对于复杂数据结构的处理会非常有用且节省时间 所以想在这里总结一下工作中常用的数组操作,都是一些非常基础的知识,大家看个乐就好~ 目录 工作中 ...
- EF CORE 遇到“无法打开登录所请求的数据库 "win7bc"。登录失败。”
报错内容:ex:An exception has been raised that is likely due to a transient failure. Consider enabling tr ...
- 快速监控 Oracle 数据库
Oracle 数据库在行业内应用广泛,通常存放的非常重要的数据,监控是必不可少的,本文使用 Cprobe 采集 Oracle 监控数据,极致简单,分享给大家. 安装配置 Oracle 简单起见,我使用 ...
- 前台往后台传id
js页面var stuid;$(function () { var request = { QueryString : function(val) { var uri = window.locatio ...
- 一个常见的 JavaScript 解构陷阱
在日常的 JavaScript 编码中,我们经常使用解构语法来提取对象中的属性.假设我们有一个名为 fetchResult 的对象,代表从接口返回的数据,其中包含一个字段名为 data. const ...
- Excel poi 设置单元格格式 发现不可读内容 已修复的记录: /xl/worksheets/sheet1.xml 部分的问题(巨坑)
Excel poi 设置单元格格式 发现不可读内容 已修复的记录: /xl/worksheets/sheet1.xml 部分的问题(巨坑) 1.先设置值,后设置样式. 正确的是:先设置样式,后设置值. ...
- Filter过滤器进行统一参数处理demo
Filter过滤器进行统一参数处理demo import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet. ...
- DHorse的配置文件
首先看一下DHorse的配置文件,如下: #============================================================================== ...
- 用pm2命令管理你的node项目
文章目录 前言 安装 运行项目 pm2的命令 前言 我在服务器上运行node项目,使用命令nohup npm start &,结果关闭终端之后,进程就会停止,看来nohup也不是万能的后台运行 ...
- LLM技术全景图:技术人必备的技术指南,一张图带你掌握从基础设施到AI应用的全面梳理
LLM技术全景图:技术人必备的技术指南,一张图带你掌握从基础设施到AI应用的全面梳理 LLM 技术图谱(LLM Tech Map)是将 LLM 相关技术进行系统化和图形化的呈现,此图谱主要特点是&qu ...