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

多品牌网站建设大型商城网站建设方案

多品牌网站建设,大型商城网站建设方案,2022app分类排行,怎么看网站是服务器还是虚拟主机概述 模拟大致的底层原理#xff0c;为学习Spring源码做铺垫。 实现的功能#xff1a;扫描路径、依赖注入、aware回调、初始化前、初始化、初始化后、切面 未实现的功能#xff1a;构造器推断、循环依赖 重点#xff1a;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 MapString, BeanDefinition beanDefinitionMap new HashMap();private MapString, Object singletonObjects new HashMap();// Spring源码用的是LinkedListprivate ListBeanPostProcessor beanPostProcessorList new ArrayList();public GaxApplicationContext(Class configClass){this.configClass configClass;// 扫描指定路径找到所有Component注解的类封装成beanDefinition保存再Map中scan(configClass);// 思考个问题beanDefinitionMap.keySet()和beanDefinitionMap.entrySet()两种遍历的区别选用哪个好for (Map.EntryString, 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.dnsts.com.cn/news/226175.html

相关文章:

  • 做管理信息的网站中英文企业网站源码
  • 网站开发文档是什么概念唐山网站推广优化
  • 重庆建网站cqiezscom中国工商黄页
  • 纪检网站建设计划书济南搜到网络推广公司
  • 网站建设实力wordpress回复查看
  • 用腾讯云做淘宝客网站视频流程宁波网站推广在哪里
  • 株洲专业网站建设品牌网站建设 深圳信科公司
  • 资讯网站 整体ui怎样在凡科免费做网站
  • 外国人 做的中国字网站莱芜信息网莱芜在线
  • 简单企业网站模板免费发布企业信息平台
  • 做分析图网站微信开放平台创建移动应用
  • 网站排名优化外包做外贸一般上哪些网站
  • 课程网站建设方案建网站的费用是多少
  • 临淄网站建设价格济南能源建设网站
  • 建设h5网站适合个人做的外贸平台
  • 上传网站源码平面设计都需要什么软件
  • 湖北省住房和城乡建设厅网站无锡哪个网站好
  • 企业网站前端模板我为群众办实事实践活动
  • 重庆当地网站怎么开一个微信公众号
  • 与众不同的网站黑客软件资源网站
  • 建设企业网站需注意什么企业全屏网站
  • 平湖建设局网站深圳网站建设外贸
  • 网站建设的技术支持论文个人网页末班
  • 网站建设考核标准产品外观设计流程
  • 上海市城乡建设网站福州模板建站代理
  • org域名怎么注册深圳seo优化seo关键词
  • 专业公司网站建设相亲网站上做投资的女生
  • 成都做网站设网站建设及优化的策划书
  • 做网站编程时容易遇到的问题网站新闻模板
  • 网站建设的技术体会广告公司简介免费