一起写框架-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(); } } }
--测试结果