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

猜你喜欢

转载自www.cnblogs.com/lwhblog/p/10602042.html