实现功能

1.我们看到@ComponentScan注解一个开始定义就是需要支持,扫描多个包,将多个包的类名获取到。现在就实现这个功能。

实现思路

根据传入的字符串数组,获得多个包下的类全限制名。

实现步骤

--基于之前的代码--

1.在PackageUtils.增加一个扫描多个包的方法

  1. /**
  2. * 支持同时扫描多个包的路径下的类全限制名以及其子包的所有类的全限制名 包名直接使用逗号分割
  3. *
  4. * @param packageNames:传入多个包名
  5. * @param isRecursion:是否扫描包的子包
  6. * @return 返回所以扫描到类全限制名
  7. */
  8. public static Set<String> getClassNames(String[] packageNames, boolean isRecursion) {
  9. //1.创建一个Set集合将每个包下的类放在一起。
  10. Set<String> classNamesSet=new HashSet<String>();
  11. // 数值的长度
  12. int length = packageNames.length;
  13. for (int i = 0; i < length; i++) {
  14. Set<String> classNameSet = PackageUtils.getClassName(packageNames[i], isRecursion);
  15. //每次都将包放在总的Set集合中
  16. classNamesSet.addAll(classNameSet);
  17. }
  18. return classNamesSet;
  19. }

2.修改AbstractApplicationContext的构造函数,标红处

  1. public AbstractApplicationContext(Class<?> classType) {
  2. //判断配置类是否有Configuration注解
  3. Configuration annotation = classType.getAnnotation(Configuration.class);
  4. if(annotation!=null){
  5. //获得组件扫描注解
  6. ComponentScan componentScan = classType.getDeclaredAnnotation(ComponentScan.class);
  7. //获得包名
  8. this.basePackage = componentScan.basePackages();
  9. //根据包名获得类全限制名
  10. //Set<String> classNames = PackageUtils.getClassName(this.basePackage[0], true);
  11. 11 //将扫描一个包,修改为多个包
  12. 12 Set<String> classNames = PackageUtils.getClassNames(this.basePackage, true);
  13. //通过类名创建对象
  14. Iterator<String> iteratorClassName = classNames.iterator();
  15. while(iteratorClassName.hasNext()){
  16. String className = iteratorClassName.next();
  17. try {
  18. //通过类全名创建对象
  19. Object instance = Class.forName(className).newInstance();
  20. //将对象加到容器中,对象名就类全名
  21. this.getContext().addObject(instance.getClass().getSimpleName(),instance);
  22. } catch (InstantiationException e) {
  23. e.printStackTrace();
  24. } catch (IllegalAccessException e) {
  25. e.printStackTrace();
  26. } catch (ClassNotFoundException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }
  31. }

测试代码

1.Config类-,扫描ioc.core.test.config包和ioc.core.test.service包

  1. package ioc.core.test.config;
  2.  
  3. import ioc.core.annotation.ComponentScan;
  4. import ioc.core.annotation.Configuration;
  5.  
  6. //使用定义@Configuration定义该类是一个配置类
  7. @Configuration
  8. //使用ComponentScan设置扫描包的路径
  9. @ComponentScan(basePackages={"ioc.core.test.config","ioc.core.test.service"})
  10. public class Config {
  11.  
  12. }

2.测试类,输出容器中的对象

  1. package ioc.core.test;
  2.  
  3. import org.junit.Test;
  4.  
  5. import ioc.core.impl.AnntationApplicationContext;
  6. import ioc.core.test.config.Config;
  7. public class AnntationApplicationContextTest {
  8.  
  9. @Test
  10. public void login(){
  11. try {
  12. AnntationApplicationContext context=new AnntationApplicationContext(Config.class);
  13. System.out.println(context.getContext().getObjects());
  14.  
  15. } catch (Exception e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }
  19. }
  20.  
  21. }

3.测试结果,将两个包的类的对象都放在了容器里面。成功。

一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持多包扫描(六)的更多相关文章

  1. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持组件注解限制(七)

    实现功能 以上的代码我们发现.我们都是将@ComponentScan扫描的路径下的所有类都加载到容器中的. 而实际需求,我们并不希望所有的类都创建对象,而是加了组件注解@Controller,@Ser ...

  2. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan(四)

    功能说明 该步骤实现的功能包括: 1. 启动程序时,将@ComponentScan加载的类,创建对象并放在容器里面. 2. 通过ApplicatoinContext的getBean()方法获得容器里面 ...

  3. 一起写框架-Ioc内核容器的实现-基础功能-容器对象名默认首字母小写(八)

    实现功能 --前面实现的代码-- 默认的对象名就类名.不符合Java的命名规范.我们希望默认的对象名首字母小写. 实现思路 创建一个命名规则的帮助类.实现将对大写开头的对象名修改为小写开头. 实现步骤 ...

  4. 一起写框架-Ioc内核容器的实现-基础功能-getBean(五)

    实现的功能 1. 启动程序时,将@ComponentScan加载的类,创建对象并放在容器里面.(查看上一篇文) 2. 通过ApplicatoinContext的getBean()方法获得容器里面的对象 ...

  5. 一起写框架-Ioc内核容器的实现-基础API的定义(三)

    Ioc内核要解决的问题 1.被调用方,在程序启动时就要创建好对象,放在一个容器里面. 2.调用方使用一个接口或类的引用(不用使用new),就可以创建获得对象. 解决这个两个问题的思路 1.定义一个对象 ...

  6. Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?

    阅前提醒 全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解.由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位 ...

  7. 自己动手写框架——IoC的实现

    先看看 IoC百度百科 优化过程 namespace Test { class Program { static void Main(string[] args) { //场景 某公司客服要回访一些客 ...

  8. 用C写一个web服务器(一) 基础功能

    .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...

  9. spring框架--IOC容器,依赖注入

    思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action  多个   [维护成员变量] service 一个   [不需要维护公共变量] dao     一个   [不需要维护 ...

随机推荐

  1. Jmeter脚本录制方法(一)——分别使用Badboy录制和Jmeter自带的代理服务器录制

    Jmeter录制方式分三种,分别是:使用Badboy录制.Jmeter自带的代理服务器录制和手工录制,今天先介绍前两种录制方法. Badboy录制 Badboy是用C++开发的动态应用测试工具, 其拥 ...

  2. dets

    模块说明 提供基于文件的项式存储,项式以元组表示,其中某个位置为键,默认第1位置 Dets为Mniesia所用,后者增加了事务.查询.和分布式支持. Dets文件不能超过2GB. Dets只有set ...

  3. Oracle 之——子查询 DDL DML 集合 及其他数据对象

    Oracle 学习笔记(二) 知识概要: 1.子查询 2.集合操作 3.DML语句操作 4.其他数据库对象 1.子查询 查询工资比SCOTT高的员工信息 1  select * 2  from emp ...

  4. Jquery.Uploadify实现批量上传显示进度条 取消 上传后缩略图显示 可删除

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="UpLoad.aspx.cs&q ...

  5. JavaScript面向对象基础与this指向问题

      前  言           我们的程序语言经历了从"面向机器".到"面向过程".再到"面向对象"的一个过程.而JavaScript是一 ...

  6. (10.16)java小作业!

    相信大家刚刚学习java多多少少都会写一些java的基础编程来练练手感,我也不例外!今天想和大家分享一下我最近所接触到的比较有趣的java小编程! 已知a已被赋值,b已被赋值,请编写java程序实现a ...

  7. win10 uwp 毛玻璃

    毛玻璃在UWP很简单,不会和WPF那样伤性能. 本文告诉大家,如何在 UWP 使用 win2d 做毛玻璃. 毛玻璃可以使用 win2D 方法,也可以使用 Compositor . 使用 win2d 得 ...

  8. UVa12325, Zombie's Treasure Chest

    反正书上讲的把我搞得晕头转向的,本来就困,越敲越晕...... 转网上一个大神写的吧,他分析的很好(个人感觉比书上的清楚多了) 转:http://blog.csdn.net/u010536683/ar ...

  9. Spring批量更新batchUpdate提交和Hibernate批量更新executeUpdate

    1:先看hibernate的批量更新处理. 版本背景:hibernate 5.0.8 applicationContext.xml 配置清单: <?xml version="1.0&q ...

  10. 阿里云负载均衡SLB的文件上传下载问题解决

    Nfs同步文件夹配置 问题描述 : javaweb应用部署到云服务器上时,当服务器配置了SLB负载均衡的时候,多台服务器就会造成文件上传下载获取不到文件的错误, 解决办法有:1.hdfs  2.搭建f ...