--前面實現的代碼--測試
默認的對象名就類名。不符合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