123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- package cn.nosum.framework.beans.support;
- import cn.nosum.framework.beans.BeanDefinition;
- import java.io.File;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Properties;
- public class BeanDefinitionReader {
- private List<String> registryBeanClasses=new ArrayList<String>();
- private Properties config=new Properties();
- public BeanDefinitionReader(String... locations){
- InputStream is=this.getClass().getClassLoader().getResourceAsStream(locations[0].replace("classpath:",""));
- try {
- config.load(is);
- } catch (IOException e) {
- e.printStackTrace();
- }finally {
- if (null!=is){
- try { is.close(); } catch (IOException e) { e.printStackTrace(); }
- }
- }
- doScanner(config.getProperty("scanPackage"));
- }
- /**
- * 扫描
- */
- private void doScanner(String scanPackage){
- URL url=this.getClass().getClassLoader().getResource("/"+scanPackage.replaceAll("\\.","/"));
- if (url == null){ return; }
- File classPath=new File(url.getFile());
- File[] files = classPath.listFiles();
- if (files == null){return;}
- for (File file : files) {
- if (file.isDirectory()){
- doScanner(scanPackage+"."+file.getName());
- }else{
- if (file.getName().endsWith(".class")){
- String className=scanPackage+"."+file.getName().replace(".class","");
- registryBeanClasses.add(className);
- }
- }
- }
- }
- /**
- * 将扫描到的所有配置信息转换为 BeanDefinition 对象,以便于 IOC 操作
- */
- public List<BeanDefinition> loadBeanDefinitions(){
- List<BeanDefinition> result=new ArrayList<BeanDefinition>();
- try {
- for (String className : registryBeanClasses) {
- Class<?> beanClass=Class.forName(className);
- // 如果是一个接口,则使用实现类
- if (beanClass.isInterface()){continue;}
- result.add(doCreateBeanDefinition(toLowerFirstCase(beanClass.getSimpleName()),beanClass.getName()));
- // 如果实现了多个接口,那么当前的实例就是这些接口的实现,直接注入即可
- Class<?>[] interfaces=beanClass.getInterfaces();
- for (Class<?> i : interfaces) {
- // 这里的 name 是接口的包.类
- result.add(doCreateBeanDefinition(i.getName(),beanClass.getName()));
- }
- }
- }catch (Exception e){e.printStackTrace();}
- return result;
- }
- public BeanDefinition doCreateBeanDefinition(String factoryBeanName,String beanClassName){
- BeanDefinition beanDefinition=new BeanDefinition();
- beanDefinition.setBeanClassName(beanClassName);
- beanDefinition.setFactoryBeanName(factoryBeanName);
- return beanDefinition;
- }
- public String toLowerFirstCase(String simpleName){
- char[] chars=simpleName.toCharArray();
- chars[0]+=32;
- return String.valueOf(chars);
- }
- public List<String> getRegistryBeanClasses() {
- return registryBeanClasses;
- }
- public void setRegistryBeanClasses(List<String> registryBeanClasses) {
- this.registryBeanClasses = registryBeanClasses;
- }
- public Properties getConfig() {
- return config;
- }
- public void setConfig(Properties config) {
- this.config = config;
- }
- }
|