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

--测试结果

时间: 2024-11-01 22:37:14

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

一起写框架-Ioc内核容器的实现-基础功能-组件注解支持自定义的对象名(九)

实现功能 如果扫描组件注解(@Controller,@Service,@Repository,@Component)默认对象名,已经实现了默认使用首字母小写类名的作为对象名. 但,现实需求中.我们有时候希望可以自己定义对象的名. 实现思路 1.获得扫描组件注解的name属性的值. 2.将这个值作为对象名 实现步骤 1.在AbstractApplicationContext增加一个方法getComponentOfName,用于判断组件注解是否设置了name属性.如果设置了就获得该值 1 /** 2

一起写框架-Ioc内核容器的实现-对象的调用[email&#160;protected]注解注入容器的对象(十二)

实现功能 现实需求中,有一些类似无法加入扫描组件注解的.如jdk里面的类. 那么框架必须要支持将没有组件注解标识的类也可以有一个方式注入到容器里面. 那么,我们通过类似Spring的@Bean的方案,来实现这个需求. 通过在配置类的方法的上面,使用@Bean注解,将返回的对象加到容器中. 实现思路 获得有@Configuration注解标识的类.检索它的方法,如果有@Bean,执行这个方法并将返回的对象放在容器中. 实现步骤 1.定义一个Bean注解 1 package ioc.core.ann

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

实现功能 以上的代码我们发现.我们都是将@ComponentScan扫描的路径下的所有类都加载到容器中的. 而实际需求,我们并不希望所有的类都创建对象,而是加了组件注解@Controller,@Service,@Repository,@Component的类才创建对象 而不加这些标识的类不需要创建对象. 所谓本章就是实现通过组件注解限制哪些类是可以创建对象的,哪些是不可以的. 实现思路 根据获得的类全限制名,获得它的Class对象.通过Class对象判断类的声明上是否有组件注解.有就创建对象,没

一起写框架-Ioc内核容器的实现-对象的调用-属性注入容器的对象(十)

实现功能 需求:在类的成员属性使用@Autowirde注解注入容器中的对象. 实现思路 要实现这个功能.我们首先要思考一个问题:类与类的关系是在调用的建立的,还是说在创建对象的时候就就将建立了? ---我实现的方案是,在在程序启动后,所有对象创建后直接就将对象的属性和属性之间的关系创建了.接下来我就用这个思路来实现,将根据@Autowirde建立对象与对象之间的关系. 为什么一定要对象全部创建后再实现对象与对象直接的关系呢? 这个是逻辑问题,如果对象没有创建完就建立对象与对象之间的关系,人家都还

一起写框架-Ioc内核容器的实现-对象的调用-方法注入容器的对象(十一)

实现功能 就是在方法的上面加入@Autowired注解,容器中的对象会注入到对应类型的参数. 注意:暂时实现注入一个对象.所有方法的参数列表的参数只能有一个. 实现思路 其实实现的思路和给字段注入的逻辑是一样的.遍历类所有的方法有没有@Autowired,有的就给它赋予容器中对应的对象. 实现步骤 1. 在AbstractApplicationContext类增加两个方法区分属性注入(autowiredField)和方法注入(autowiredMethod) 1 /** 2 * 属性注入 3 *

Spring框架—— IOC容器和Bean的配置

 1 IOC和DI ①IOC(Inversion of Control):反转控制. 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率. 反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向--改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效

《自己动手写框架1》:缘起

前言 自己动手写框架?第一次接触这本书的读者可能会有一些惊讶.是的,这就是写本书的缘由. 1.1  缘由 从毕业以来,我一直从事软件开发及软件管理,做过大量的项目与产品,但是还是喜欢平台软件及软件管理方面的工作.多年的业务开发及平台构建的过程中,踩了许许多多的坑,也积累了许许多多的经验. 和很多的朋友一样,在没有开发框架之前,可能我们只有一些落在纸面上的编码规范,或者说是开发约定.但不管怎么说,这些规范和约定对于我们软件开发过程还是有相当的指导与规范作用的.再后来,随着时间的推移,我们的软件代码

Spring框架IOC容器和AOP解析

主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.Spring开源框架的简介  Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开

c#中创建IOC框架的步骤(无参,Ninject容器)

创建无参的IOC框架 步骤: 1. 一个接口 2. 通过创建一个实体类显示接口 3. 再创建一个类制造构造函数(并将接口作为参数传递),再此类中创建一个无返回值的方法,调用接口里的方法 4. 在Main里面写代码: 1) 用接口new出创建接口实体的类. 2) 把创建构造函数的类名new出来,将1)的对象写入括号中. 3) 调用2)的无返回值方法. 第一步,定义一个接口: namespace NInjectEmail { interface ISendMsg { void SendEmail()