学到好东西要记录,我决心养成这个好习惯
什么是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 }