![4d4c6d8e3a2ece1c7605b6f12858b9ca.png](https://i-blog.csdnimg.cn/blog_migrate/0b242f7ac2ef3c82209024db4dc9c0c0.jpeg)
本章和第14章内容上差不多,主要区别的是Service层的代码会有依赖注入,需要在解析扫描类的时候同时解析成员变量引入的类。
![ddead6efee5c31db7c584dd9854e6b30.png](https://i-blog.csdnimg.cn/blog_migrate/5e8af18ec433ab9031ecbeafde065bea.png)
首先在之前的MVC配置初始化方法里面加入Service层配置初始化方法,然后实现初始化方法里面的逻辑。
![cca775c20c51c519ce79c3815cc45dcc.png](https://i-blog.csdnimg.cn/blog_migrate/3ed5b015ba0698819f6f6b4508b5e5d9.jpeg)
和上一章一样,读取配置后加载包资源,扫描编译文件和jar包文件。
![59bb82b1f420a3981f79994feb73de86.png](https://i-blog.csdnimg.cn/blog_migrate/de1953aca106ae35b445d0adf60e3f1e.jpeg)
![e96bb22ef578af489575b03e7ab5fa85.png](https://i-blog.csdnimg.cn/blog_migrate/982c89bd57b6bc4e2c7b15db986c6e8d.jpeg)
扫描文件和扫描jar代码和之前dao层的操作一样。
![ce883ab6463b9ee179fb51200c81a52e.png](https://i-blog.csdnimg.cn/blog_migrate/44ad1e18f3527dc36ee4559cd5d0433c.jpeg)
这里的区别点是,在service层由于会有交叉引用,在解析Bean对象的时候,可能当前Bean对象已经被别的类先解析了,所以在当前类被扫描到时,解析前需要先判断一下是否之前被解析过了。如果没有被解析则在解析获取代理对象的同时还要处理类的成员变量中动态注入的Bean,这些Bean如果没有被解析也需要先解析掉才可以给当前类设置实例成员变量,所以最后就有一个设置自动注入类的方法。不过该方法本章先不实现,因为还缺少一个帮助类的注解扫描。
![a179a8c3de909caba41c5d6b0cdf45af.png](https://i-blog.csdnimg.cn/blog_migrate/1fd26ea055f0e90916a9d5ab4d28f076.png)
最后这个获取Bean对象的方法也和dao层也有区别,由于在设置自动注入方法里面需要用到改方法,改方法就必须保证能返回Bean对象,所以针对交叉引用情况需要判断类的实例是否已经被创建,如果没创建则需要先创建一个再返回。这样整个Service层的扫描就完成了网状链式的解析,保证了每个类都能正确解析自身又能解析到成员变量的Bean对象。
下一章把MyComponent注解的Bean扫描实现掉,然后把设置自动注入的方法也实现掉,这样最后就只剩Controller的扫描解析了。