实现功能

--前面实现的代码--

默认的对象名就类名。不符合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类的构造方法修改标红处

  1. /**
  2. * 将容器操作加载创建对象的代码写抽象类里面,这样可以方便以后扩展多种实现。
  3. * @param classType
  4. */
  5. public AbstractApplicationContext(Class<?> classType) {
  6. //判断配置类是否有Configuration注解
  7. Configuration annotation = classType.getDeclaredAnnotation(Configuration.class);
  8. if(annotation!=null){
  9. //获得组件扫描注解
  10. ComponentScan componentScan = classType.getDeclaredAnnotation(ComponentScan.class);
  11. //获得包名
  12. this.basePackage = componentScan.basePackages();
  13. //根据包名获得类全限制名
  14. //Set<String> classNames = PackageUtils.getClassName(this.basePackage[0], true);
  15. //将扫描一个包,修改为多个包
  16. Set<String> classNames = PackageUtils.getClassNames(this.basePackage, true);
  17. //通过类名创建对象
  18. Iterator<String> iteratorClassName = classNames.iterator();
  19. while(iteratorClassName.hasNext()){
  20.  
  21. String className = iteratorClassName.next();
  22. //System.out.println(className);
  23. try {
  24. //通过类全名创建对象
  25. Class<?> objectClassType = Class.forName(className);
  26. /*
  27. * 判断如果类权限名对应的不是接口,并且包含有@Component|@Controller|@Service|@Repository
  28. * 才可以创建对象
  29. */
  30. if(this.isComponent(objectClassType)){
  31. Object instance = objectClassType.newInstance();
  32. //将对象加到容器中,对象名就类全名
  33. //this.getContext().addObject(instance.getClass().getSimpleName(),instance);
  34.         //修改为,默认对象支持首字符小写
  35.           String objectName = NamingUtils.firstCharToLower(instance.getClass().getSimpleName());
  36. this.getContext().addObject(objectName,instance);
  37. }
  38. } catch (InstantiationException e) {
  39. e.printStackTrace();
  40. } catch (IllegalAccessException e) {
  41. e.printStackTrace();
  42. } catch (ClassNotFoundException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }
  47. }

测试代码

  1. package ioc.core.test;
  2.  
  3. import org.junit.Test;
  4.  
  5. import ioc.core.impl.AnntationApplicationContext;
  6. import ioc.core.test.config.Config;
  7. import ioc.core.test.service.UserService;
  8.  
  9. public class AnntationApplicationContextTest {
  10.  
  11. @Test
  12. public void login(){
  13. try {
  14. AnntationApplicationContext context=new AnntationApplicationContext(Config.class);
  15. //使用小写的对象名
  16. UserService userService = context.getBean("userService", UserService.class);
  17. userService.login();
  18.  
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

--测试结果

一起写框架-Ioc内核容器的实现-基础功能-容器对象名默认首字母小写(八)的更多相关文章

  1. 一起写框架-Ioc内核容器的实现-基础API的定义(三)

    Ioc内核要解决的问题 1.被调用方,在程序启动时就要创建好对象,放在一个容器里面. 2.调用方使用一个接口或类的引用(不用使用new),就可以创建获得对象. 解决这个两个问题的思路 1.定义一个对象 ...

  2. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan(四)

    功能说明 该步骤实现的功能包括: 1. 启动程序时,将@ComponentScan加载的类,创建对象并放在容器里面. 2. 通过ApplicatoinContext的getBean()方法获得容器里面 ...

  3. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持组件注解限制(七)

    实现功能 以上的代码我们发现.我们都是将@ComponentScan扫描的路径下的所有类都加载到容器中的. 而实际需求,我们并不希望所有的类都创建对象,而是加了组件注解@Controller,@Ser ...

  4. 一起写框架-Ioc内核容器的实现-基础功能-getBean(五)

    实现的功能 1. 启动程序时,将@ComponentScan加载的类,创建对象并放在容器里面.(查看上一篇文) 2. 通过ApplicatoinContext的getBean()方法获得容器里面的对象 ...

  5. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持多包扫描(六)

    实现功能 1.我们看到@ComponentScan注解一个开始定义就是需要支持,扫描多个包,将多个包的类名获取到.现在就实现这个功能. 实现思路 根据传入的字符串数组,获得多个包下的类全限制名. 实现 ...

  6. 自己动手写框架——IoC的实现

    先看看 IoC百度百科 优化过程 namespace Test { class Program { static void Main(string[] args) { //场景 某公司客服要回访一些客 ...

  7. 用C写一个web服务器(一) 基础功能

    .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...

  8. 02-spring框架—— IoC 控制反转

    控制反转(IoC,Inversion of Control),是一个概念,是一种思想.指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理. 控制反转就是对对象控制权的转移 ...

  9. Spring框架IOC容器和AOP解析

    主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.S ...

随机推荐

  1. Treblecross 博弈SG值

    Treblecross is a two player game where the goal is to get three X in a row on a one-dimensional boar ...

  2. 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage (Online Mirror, ACM-ICPC Rules, Teams Preferred)

    题目链接:http://codeforces.com/problemset/problem/847/I I. Noise Level time limit per test 5 seconds mem ...

  3. PHP常用字符串处理函数

    (1)strlen(string) 返回字符串长度 (2)strpos(string,find,begin) 返回find字符串第一次出现的位置(从0开始) string:处理的字符串 find:想找 ...

  4. python爬取煎蛋图片

    py2版本: #-*- coding:utf-8 -*- #from __future__ import unicode_liter import urllib,urllib2,time import ...

  5. 从零开始配置TypeScript + React + React-Router + Redux + Webpack开发环境

    转载请注明出处! 说在前面的话: 1.为什么不使用现成的脚手架?脚手架配置的东西太多太重了,一股脑全塞给你,我只想先用一些我能懂的库和插件,然后慢慢的添加其他的.而且自己从零开始配置也能学到更多的东西 ...

  6. 扩展jquery.validate自定义验证,自定义提示,本地化

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...

  7. Asp.Net MVC4 系列--进阶篇之路由 (2)

    上一篇介绍了Asp.Net MVC 中,从Http Pipeline上接收到请求如何匹配,匹配限制,以及如何控制在指定命名空间查找,解析出controller和action,并传参. 这篇主要介绍如何 ...

  8. WPF加载程序集中字符串资源

    WPF资源 WPF资源使用其实的也是resources格式嵌入资源,默认的资源名称为"应用程序名.g.resources",不过WPF资源使用的pack URI来访问资源. 添加图 ...

  9. [ZJOI2005]九数码游戏

    [ZJOI2005]九数码游戏 题目描述 输入输出格式 输入格式: 输入文件中包含三行三列九个数,同行的相邻两数用空格隔开,表示初始状态每个方格上的数字.初始状态不会是目标状态. 输出格式: 如果目标 ...

  10. PHP知识大全

    --------------------------------------------------------- PHP知识大全 ---------------------------------- ...