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

仓山区城乡建设局网站威海企业网站建设

仓山区城乡建设局网站,威海企业网站建设,chrome官方下载,网站建设玖金手指排名11概述 模拟大致的底层原理#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.hkea.cn/news/14283220/

相关文章:

  • 网站前端静态模板下载做全房订制网站公司
  • 手机维修网站那个公司做的网站建设费要摊销
  • 做网站和做app哪个容易网站制作公司
  • 深圳龙岗区住房和建设局网站官网学计算机哪个培训机构好
  • 网站必须实名认证吗深圳建网站公司哪家好
  • 乐清网站只做用xp做网站是否先搭建iis
  • 站点搜索建设网站可选择的方案有
  • 佛山 网站建设 骏域wordpress页面源代码
  • 网页制作与网站建设宝典 第2版php网站开发实例编程
  • 网站建设存在风险戴尔公司网站设计特色
  • 网站名称注册保护成都广告公司排名
  • 网站图片切换效果韩国设计网站推荐
  • 简易网站开发时长学校风采网站建设需求
  • linux建设网站php打开提示404临清做网站推广
  • 用帝国cms系统怎么做网站如何做网站授权网址
  • 深圳高端集团网站建设公司怎么开自己的网店
  • 做选择网站wordpress zhai主题
  • 公司做网站会计凭证怎么做百度做商务网站多少钱
  • wordpress 贴代码站内优化
  • 福州省建设局网站wordpress图文安装教程
  • 深圳做网站服务公司wordpress mysql安装
  • 武夷山景区网站建设优点微信公众号功能
  • 做平面设计用哪个素材网站好100m光纤做网站
  • 建设北京公司网站家装效果图设计网站
  • 好看响应式网站模板下载佛山网站建设公司哪家最好
  • 网站开发公司源码wordpress本地头像
  • 滑县住房城乡建设厅门户网站邯郸专业做网站多少钱
  • 如何建设公司网站设计公司logo用什么软件
  • 网站免费正能量软件直播网站运营推广公司
  • 网站正常打开速度宁波网络推广方法