当前位置: 首页 > news >正文

简约 网站 设计专业做网站 优帮云

简约 网站 设计,专业做网站 优帮云,响应式 购物网站模板,上海专业网站制作开发概述 模拟大致的底层原理,为学习Spring源码做铺垫。 实现的功能:扫描路径、依赖注入、aware回调、初始化前、初始化、初始化后、切面 未实现的功能:构造器推断、循环依赖 重点:BeanDefinition、BeanPostProcessor 学习Spring…

概述

模拟大致的底层原理,为学习Spring源码做铺垫。

实现的功能:扫描路径、依赖注入、aware回调、初始化前、初始化、初始化后、切面

未实现的功能:构造器推断、循环依赖

重点:BeanDefinition、BeanPostProcessor

学习Spring源码的重点:设计模式、编码规范、设计思想、扩展点

启动类:

public class Yeah
{public static void main(String[] args){GaxApplicationContext gaxApplicationContext = new GaxApplicationContext(AppConfig.class);UserInterface userService = (UserInterface) gaxApplicationContext.getBean("userService");userService.test();}
}

关键方法:

public class GaxApplicationContext
{private Class configClass;private static final String SINGLETON = "singleton";private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();private Map<String, Object> singletonObjects = new HashMap<>();// Spring源码用的是LinkedListprivate List<BeanPostProcessor> beanPostProcessorList = new ArrayList<>();public GaxApplicationContext(Class configClass){this.configClass = configClass;// 扫描指定路径,找到所有@Component注解的类,封装成beanDefinition保存再Map中scan(configClass);// 思考个问题:beanDefinitionMap.keySet()和beanDefinitionMap.entrySet()两种遍历的区别?选用哪个好?for (Map.Entry<String, BeanDefinition> entry : beanDefinitionMap.entrySet()){String beanName = entry.getKey();BeanDefinition beanDefinition = entry.getValue();if (SINGLETON.equals(beanDefinition.getScope())){Object bean = createBean(beanName, beanDefinition);singletonObjects.put(beanName, bean);}}}private Object createBean(String beanName, BeanDefinition beanDefinition){Class clazz = beanDefinition.getType();Object instance = null;try{// 直接使用默认的无参构造器,多个构造器的场景未实现instance = clazz.getConstructor().newInstance();// 属性填充,依赖注入for (Field field : clazz.getDeclaredFields()){if (field.isAnnotationPresent(Autowired.class)){field.setAccessible(true);field.set(instance, getBean(field.getName()));}}// aware回调if (instance instanceof BeanNameAware){((BeanNameAware)instance).setBeanName(beanName);}// 初始化前for (BeanPostProcessor beanPostProcessor : beanPostProcessorList){instance = beanPostProcessor.postProcessBeforeInitialization(instance, beanName);}// 初始化if (instance instanceof InitializingBean){((InitializingBean)instance).afterPropertiesSet();}// 初始化后for (BeanPostProcessor beanPostProcessor : beanPostProcessorList){instance = beanPostProcessor.postProcessAfterInitialization(instance, beanName);}}catch (InstantiationException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e){e.printStackTrace();}return instance;}public Object getBean(String beanName){if (!beanDefinitionMap.containsKey(beanName)){throw new NullPointerException();}BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);if (SINGLETON.equals(beanDefinition.getScope())){Object singletonBean = singletonObjects.get(beanName);if (null == singletonBean){singletonBean = createBean(beanName, beanDefinition);singletonObjects.put(beanName, singletonBean);}return singletonBean;}else{// 原型BeanObject prototypeBean = createBean(beanName, beanDefinition);return prototypeBean;}}private void scan(Class configClass){if (configClass.isAnnotationPresent(ComponentScan.class)){ComponentScan componentScanAnnotation = (ComponentScan)configClass.getAnnotation(ComponentScan.class);String path = componentScanAnnotation.value();// path = com/gax/servicepath = path.replace(".", "/");ClassLoader classLoader = GaxApplicationContext.class.getClassLoader();URL resource = classLoader.getResource(path);assert resource != null;File file = new File(resource.getFile());if (file.isDirectory()){for (File f : Objects.requireNonNull(file.listFiles())){String absolutePath = f.getAbsolutePath();absolutePath = absolutePath.substring(absolutePath.indexOf("com"), absolutePath.indexOf(".class"));// 类加载器入参需要的格式:com.gax.service.XXXabsolutePath = absolutePath.replace("\\", ".");try{Class<?> clazz = classLoader.loadClass(absolutePath);if (clazz.isAnnotationPresent(Component.class)){if (BeanPostProcessor.class.isAssignableFrom(clazz)){BeanPostProcessor instance = (BeanPostProcessor)clazz.getConstructor().newInstance();beanPostProcessorList.add(instance);}Component componentAnnotation = clazz.getAnnotation(Component.class);String beanName = componentAnnotation.value();if ("".equals(beanName)){// 默认beanNamebeanName = Introspector.decapitalize(clazz.getSimpleName());}BeanDefinition beanDefinition = new BeanDefinition();beanDefinition.setType(clazz);if (clazz.isAnnotationPresent(Scope.class)){Scope scopeAnnotation = clazz.getAnnotation(Scope.class);String value = scopeAnnotation.value();beanDefinition.setScope(value);}else{// 默认单例BeanbeanDefinition.setScope(SINGLETON);}beanDefinitionMap.put(beanName, beanDefinition);}}catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException| InstantiationException | IllegalAccessException e){e.printStackTrace();}}}}}
}

gitee地址:

git clone https://gitee.com/seek6174/spring-seek.git

http://www.yayakq.cn/news/818436/

相关文章:

  • dtu网站开发移动网站建设报价表
  • 企业怎样选择域名做网站无锡网站维护
  • 百度网站建设教程香河家具城网站建设目标
  • 网站开发人员考核信息技术网站开发
  • 安徽道遂建设工程有限公司网站菏泽企业做网站
  • 做美缝在哪个网站接单北京网站制作建设公司哪家好
  • 电商网站建设模型图如何申请建设个人网站
  • 审计局网站建设管理怎么查网站是用什么语言做的
  • 朔州公司做网站广州建设工程交易中心增城电话
  • 做网站还是微信小程序长沙旅游攻略最佳路线
  • 网站空间后台登录学子网站建设
  • 用微软雅黑做网站可以吗企业网站建设的困难和问题
  • 网站开发软件标书范本南宁专业网站营销
  • 做it题的网站网站如何进行品牌建设
  • 网站建设分金手指专业二七wordpress 修改上传文件大小
  • 摄影网站源码 国外百度网盘网址
  • 建设银行积分网站好的做网站架构的书
  • 深圳网站建设公司哪好wordpress使用jquery
  • 网站制作公司 知道万维科技大学网页制作与网站建设
  • 网站设计网站建设公司长沙建个网站要多少钱
  • 广州建设交易中心网站首页中小微企业查询网站
  • 购买了网站如何使用吗怎么更改wordpress文件上传大小
  • 做网站备案重庆做网站多少钱
  • 长沙seo网站管理wordpress图床
  • 网站的ppt方案怎么做买域名的钱最后给了谁
  • 网站内容过滤网站主机多大
  • 网站建立价格uc浏览器网页版
  • 济宁做网站哪家比较好建个网站花钱做百度推广
  • jsp 网站连接数据库如何建设网站服务器
  • 网站的运营成本dedecms导入网站模板下载