• IOC容器的深度剖析


    学到好东西要记录,我决心养成这个好习惯

    什么是IOC(控制反转)?

     ioc是一种程序设计的思想,是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度。其中最常见的方式是依赖注入(DI)

    核心代码

     我们模拟一个扫描包的类AnnotationConfigApplicationContext,这个类可以扫描包中带有相应注解的类,并把它们加入到spring容器中

    这是这个类的核心代码

    这里说一下这个方法的关键,主要是扫描包下面的所有文件,识别出文件和文件夹,截取类名路径,根据反射拿到这个类

    就可以得到各种关于类的信息了

    看代码,不bb了。。

     1 public void scanPackage(final String packageName){
     2         //获取当前包名的路径
     3         URL url = this.getClass().getClassLoader()
     4                 .getResource(packageName.replaceAll("\.", "/"));
     5         File file = new File(url.getFile());
     6         file.listFiles(new FileFilter() {
     7             public boolean accept(File childFile) {
     8                 if(childFile.isDirectory()){
     9                     scanPackage(packageName+"."+childFile.getName());
    10                 }else{
    11                     String filename = childFile.getName();
    12                     if(filename.endsWith(".class")){
    13                         String classpath = packageName + "." + filename.replaceAll("\.class","");
    14                         try {
    15                             Class<?> aClass = this.getClass().getClassLoader().loadClass(classpath);
    16                             if(aClass.isAnnotationPresent(MyRepository.class)){
    17                                 Object value = aClass.newInstance();
    18                                 //获取类名
    19                                 String clsName = aClass.getSimpleName();
    20                                 String key = clsName.toLowerCase().charAt(0)+clsName.substring(1);
    21                                 containers.put(key,value);
    22 
    23                                 containers_cls.put(aClass,value);
    24                                 Class<?>[] fooClasses = aClass.getInterfaces();
    25                                 for(Class cls:fooClasses){
    26                                     containers_cls.put(cls,value);
    27                                 }
    28                             }
    29                         } catch (Exception e) {
    30                             e.printStackTrace();
    31                         }
    32                     }
    33                 }
    34                 return false;
    35             }
    36         });
    37     }
    View Code
  • 相关阅读:
    玩游戏(dfs)
    Find them, Catch them(并查集)
    Shredding Company(dfs)
    Sudoku(dfs)
    Network Saboteur(dfs)
    棋盘问题(dfs)
    Curling 2.0(dfs)
    A Knight's Journey(dfs)
    15. 3Sum
    12. Integer to Roman
  • 原文地址:https://www.cnblogs.com/lwhblog/p/10602042.html
Copyright © 2020-2023  润新知