一塊兒寫框架-Ioc內核容器的實現-基礎功能-容器對象名默認首字母小寫(八)

實現功能

--前面實現的代碼--測試

默認的對象名就類名。不符合Java的命名規範。咱們但願默認的對象名首字母小寫。ui

 

實現思路

建立一個命名規則的幫助類。實現將對大寫開頭的對象名修改成小寫開頭。this

 

實現步驟

1.建立一個命名規則幫助類spa

 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類的構造方法修改標紅處3d

 

     /**
      * 將容器操做加載建立對象的代碼寫抽象類裏面,這樣能夠方便之後擴展多種實現。
      * @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();
        }
    }
}

 

--測試結果code

相關文章
相關標籤/搜索