造一个方形轮子文章目录:造一个方形的轮子
01、先把车正过来
在上一篇《造一个方形的轮子2–添加配置》的最后又翻车了,现在先把发现的这个问题解决,将square项目的包引用其它项目无法启动的主要原因是没有正确的指定tomcat运行的关键目录,以及读取资源的目录。
也就是说把设置的目录结构调整一下就可以了。
添加一个配置目录的util类,ClassesPathUtil.java:
1 | /** |
如果classes目录下没有public 目录的话就创建一个,设置tomcat.addWebapp(context_path, publicPath)
时会用到
修改启动类(这块改动有点大,放一个全量代码吧),SquareApplication.java:
1 | /** |
重新在square项目根目录下执行mvn clean install
然后到car项目里去启动项目就可以了。
02、添加注解
实现控制反转的思路,
1、要有自己定义的注解,标识类需要初始化到容器中
2、程序启动时调用初始化方法(默认从启动类目录向下扫描所有包里的类文件)
3、根据接口名称、类名称及添加注解时定义的bean名称初始化到容器中
4、处理Bean互相之间的依赖关系(属于依赖注入)
这里我先只实现一个@Service
和@Component
两个注解,对外提供服务的@Controller
后边实现对外Rest接口的时候再实现。
Service.java
1 | package com.jisuye.annotations; |
Component.java
1 | package com.jisuye.annotations; |
这两个注解都只有一个value的参数可配置,接收设置的Bean名称。
03、定义BeanObject对象
定义BeanObject对象作为Bean反射初始化的封装,除了反射生成的bean对象外还保存一些类的其它信息,方便后边做依赖的时候使用,BeanObject.java:
1 | /** |
04、Bean初始化工具类
初始化的Bean对象会放在一个HashMap的容器里,方便其它地方使用。
程序启动时初始化Bean的工具类 BeansInitUtil.java(返回这个容器Map):
1 | /** |
05、启动测试
上边的BeansInitUtil 工具类只实现了基本的,反射生成bean,没有考虑依赖的问题,先启动测试一下,添加一个com.jisuye.service.Abc 以及com.jisuye.service.impl.AbcImpl 模拟一个service bean的初始化,AbcImpl.java:
1 | package com.jisuye.service.impl; |
在启动方法 SquareApplication.run()方法里添加如下片段:
1 | //.... |
运行T.main()后查看项目输出:
1 | ...... |
说明新添加的AbcImpl类已经初始化成功。并放到了Bean容器里。
ps: Abc和AbcImpl这两个类我会暂时先提到git上,从本文开始我后边的代码将以单独的分支提交,就不打tag了。
06、翻车时间
上边把初始化Bean的基本功能实现了一下,但按照目前的实现有一个问题,如果接口有两个实现类的话,那么初始化第二个实现类的时候会覆盖掉第一个Bean在map里设置的值(key
是相同的接口名),要怎么处理呢?
本篇代码地址: https://github.com/iuv/square/tree/square3
本文链接: http://blog.jisuye.com/2019/06/26/square3/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!