zoukankan      html  css  js  c++  java
  • 一起写框架-Ioc内核容器的实现-基础功能-容器对象名默认首字母小写(八)

    实现功能

    --前面实现的代码--

    默认的对象名就类名。不符合Java的命名规范。我们希望默认的对象名首字母小写。

    实现思路

    创建一个命名规则的帮助类。实现将对大写开头的对象名修改为小写开头。

    实现步骤

    1.创建一个命名规则帮助类

     1 package ioc.core.utils;
     2 
     3 /**
     4  * 创建命名规则帮助类
     5  * 
     6  * @author ranger
     7  *
     8  */
     9 public class NamingUtils {
    10     /**
    11      * 将类名修改为对象名,首字母小写
    12      * 
    13      * @param className
    14      */
    15     public static String firstCharToLower(String className) {
    16         StringBuilder sb = new StringBuilder(className);
    17         //修改首字符为小写
    18         sb.setCharAt(0, Character.toLowerCase(sb.charAt(0)));
    19         return sb.toString();
    20 
    21     }
    22 
    23 }

    2.在创建对象是调用该方法,AbstractApplicationContext类的构造方法修改标红处

         /**
          * 将容器操作加载创建对象的代码写抽象类里面,这样可以方便以后扩展多种实现。
          * @param classType
          */
        public AbstractApplicationContext(Class<?> classType) {
             //判断配置类是否有Configuration注解
             Configuration annotation = classType.getDeclaredAnnotation(Configuration.class);
             if(annotation!=null){
                 //获得组件扫描注解
                 ComponentScan componentScan = classType.getDeclaredAnnotation(ComponentScan.class);
                 //获得包名
                 this.basePackage = componentScan.basePackages();
                 //根据包名获得类全限制名
                 //Set<String> classNames = PackageUtils.getClassName(this.basePackage[0], true);
                 //将扫描一个包,修改为多个包
                 Set<String> classNames = PackageUtils.getClassNames(this.basePackage, true);
                 //通过类名创建对象
                 Iterator<String> iteratorClassName = classNames.iterator();
                 while(iteratorClassName.hasNext()){
                     
                     String className = iteratorClassName.next();
                     //System.out.println(className);
                     try {
                         //通过类全名创建对象
                         Class<?> objectClassType = Class.forName(className);
                         /*
                          * 判断如果类权限名对应的不是接口,并且包含有@Component|@Controller|@Service|@Repository
                          * 才可以创建对象
                          */
                         if(this.isComponent(objectClassType)){
                            Object instance = objectClassType.newInstance();
                            //将对象加到容器中,对象名就类全名
                          //this.getContext().addObject(instance.getClass().getSimpleName(),instance);
                    //修改为,默认对象支持首字符小写
                      String objectName = NamingUtils.firstCharToLower(instance.getClass().getSimpleName());
                            this.getContext().addObject(objectName,instance);
                         }
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
                 }
             }
        }

    测试代码

    package ioc.core.test;
    
    import org.junit.Test;
    
    import ioc.core.impl.AnntationApplicationContext;
    import ioc.core.test.config.Config;
    import ioc.core.test.service.UserService;
    
    public class AnntationApplicationContextTest {
        
        @Test
        public void login(){
            try {
                AnntationApplicationContext context=new AnntationApplicationContext(Config.class);
                     //使用小写的对象名
                UserService userService = context.getBean("userService", UserService.class);
                userService.login();
            
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    --测试结果

  • 相关阅读:
    android 多渠道打包
    第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
    Android:支持不同分辨率的屏幕设计 .
    动画效果编程基础--AnimationAndroid
    Android使用尺寸资源 dimens .
    android手机分辨率整理
    线程和进程
    js和html的结合方式
    成员变量和局部变量
    MySQL基础知识
  • 原文地址:https://www.cnblogs.com/zhuyuejiu/p/7819386.html
Copyright © 2011-2022 走看看