实现功能
--前面实现的代码--
默认的对象名就类名。不符合Java的命名规范。我们希望默认的对象名首字母小写。
实现思路
创建一个命名规则的帮助类。实现将对大写开头的对象名修改为小写开头。
实现步骤
1.创建一个命名规则帮助类
package ioc.core.utils; /**
* 创建命名规则帮助类
*
* @author ranger
*
*/
public class NamingUtils {
/**
* 将类名修改为对象名,首字母小写
*
* @param className
*/
public static String firstCharToLower(String className) {
StringBuilder sb = new StringBuilder(className);
//修改首字符为小写
sb.setCharAt(0, Character.toLowerCase(sb.charAt(0)));
return sb.toString(); } }
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();
}
}
}
--测试结果