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

厦门网站定制开发长沙竞价网站建设价格

厦门网站定制开发,长沙竞价网站建设价格,教育平台,上海十大室内设计公司排名1.什么是Dag#xff1f; 有向无环图(Directed Acyclic Graph)#xff0c;简称DAG#xff0c;是一种有向图#xff0c;其中没有从节点出发经过若干条边后再回到该节点的路径。换句话说#xff0c;DAG中不存在环路。这种数据结构常用于表示并解决具有依赖关系的问题。 DAG的…1.什么是Dag 有向无环图(Directed Acyclic Graph)简称DAG是一种有向图其中没有从节点出发经过若干条边后再回到该节点的路径。换句话说DAG中不存在环路。这种数据结构常用于表示并解决具有依赖关系的问题。 DAG的特性 首先DAG中的节点可以有入度和出度。节点的入度是指指向该节点的边的数量而节点的出度是指由该节点指向其他节点的边的数量。在DAG中节点的入度可以是0或正整数而出度可以是0或正整数但不能同时为负数。DAG的另一个重要性质是存在一个或多个拓扑排序。拓扑排序是DAG中节点的线性排列满足任意一条有向边的起点在排序中都位于终点之前。可以使用深度优先搜索(DFS)或宽度优先搜索(BFS)算法来生成拓扑排序。 DAG的应用 任务调度编译器优化数据流分析电路设计 2.如何加速Spring Bean初始化 在Spring框架中进行DAG有向无环图分析以实现并行初始化可以有效提升应用程序启动的性能。通常情况下Spring应用程序的Bean是按依赖顺序初始化的而通过DAG分析可以识别出哪些Bean之间没有依赖关系并行初始化这些Bean可以减少启动时间。以下是实现思路 1. 识别依赖关系构建DAG 首先需要识别Spring Bean之间的依赖关系。可以通过DependsOn注解、构造器注入或Autowired等方式获取Bean依赖。具体步骤 遍历Spring上下文中的所有Bean定义。根据Bean的依赖关系构建DAG节点代表Bean边表示依赖关系。 Spring的ApplicationContext提供了getBeanDefinitionNames()方法可以列出所有的Bean通过BeanDefinition可以分析出依赖。 2. 拓扑排序 通过拓扑排序Topological Sorting对DAG进行排序以确保Bean按依赖顺序初始化。拓扑排序可以确定哪些Bean可以并行初始化哪些Bean必须在某些Bean之后初始化。 使用算法如Kahn’s Algorithm或DFS找到所有没有依赖的Bean入度为0的节点这些节点可以并行初始化。 3. 并行初始化Bean 在完成拓扑排序后使用多线程来并行初始化可以同时启动的Bean。可以使用Java的ExecutorService或类似的线程池机制来管理并发的Bean初始化过程。 步骤 针对所有入度为0的节点启动一个线程来初始化它们。当某个Bean初始化完成后减少它所依赖的其他Bean的入度值。当某个Bean的入度为0时可以在另一个线程中启动它的初始化。 4. Spring Integration 可以通过BeanFactoryPostProcessor或ApplicationContextInitializer来挂钩到Spring的初始化流程中分析Bean之间的依赖关系并将并行化初始化逻辑集成到Spring容器的启动过程中。 具体方法 实现BeanFactoryPostProcessor在Bean初始化之前分析Bean的依赖并构建DAG。在Bean初始化阶段使用多线程并行处理独立的Bean。 3.代码工程 整体的依赖关系如下 实验目标 实现自定义Bean并行化加载 pom.xml ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.2.1/version/parentmodelVersion4.0.0/modelVersionartifactIddag/artifactIdpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.target/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-autoconfigure/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.jgrapht/groupIdartifactIdjgrapht-core/artifactIdversion1.5.1/version/dependency/dependenciesbuildpluginManagementpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.1/versionconfigurationforktrue/forkfailOnErrorfalse/failOnError/configuration/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-surefire-plugin/artifactIdversion2.22.2/versionconfigurationforkCount0/forkCountfailIfNoTestsfalse/failIfNoTests/configuration/plugin/plugins/pluginManagement/build /project Bean初始化 package com.et.config;import org.jgrapht.graph.DefaultEdge; import org.jgrapht.graph.DirectedAcyclicGraph; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.stereotype.Component;import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.Collectors;Component public class DAGBeanInitializer implements BeanFactoryPostProcessor {private final ExecutorService executorService Executors.newFixedThreadPool(10);Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {MapString, BeanDefinition beanDefinitionMap new HashMap();for (String beanName : beanFactory.getBeanDefinitionNames()) {BeanDefinition beanDefinition beanFactory.getBeanDefinition(beanName);beanDefinitionMap.put(beanName, beanDefinition);}// build DAGDirectedAcyclicGraphString, DefaultEdge dag buildDAG(beanDefinitionMap,beanFactory);// bean layersListSetString layers getBeansByLayer(dag);System.out.println(layers:layers);// init bean by layersinitializeBeansInLayers(layers, beanFactory);}// DAG Beanprivate DirectedAcyclicGraphString, DefaultEdge buildDAG(MapString, BeanDefinition beanDefinitionMap, ConfigurableListableBeanFactory beanFactory) {DependencyResolver resolver new DependencyResolver(beanFactory);DirectedAcyclicGraphString, DefaultEdge dag new DirectedAcyclicGraph(DefaultEdge.class);for (String beanName : beanDefinitionMap.keySet()) {if(shouldLoadBean(beanName)) {dag.addVertex(beanName);String[] dependencies beanDefinitionMap.get(beanName).getDependsOn();if (dependencies ! null) {for (String dependency : dependencies) {dag.addEdge(dependency, beanName); }}// get Autowired dependenciesSetString autowireDependencies resolver.getAllDependencies(beanName);for (String autowireDependency : autowireDependencies) {// convert beanNameString autowireBeanName convertToBeanName(autowireDependency);dag.addVertex(autowireBeanName);dag.addEdge(autowireBeanName, beanName);}}}return dag;}private String convertToBeanName(String className) {String simpleName className.substring(className.lastIndexOf(.) 1);return Character.toLowerCase(simpleName.charAt(0)) simpleName.substring(1);}private ListSetString getBeansByLayer(DirectedAcyclicGraphString,DefaultEdge dag) {ListSetString layers new ArrayList();MapString, Integer inDegree new HashMap();QueueString queue new LinkedList();// init all nodes degreefor (String vertex : dag) {int degree dag.inDegreeOf(vertex);inDegree.put(vertex, degree);if (degree 0) {queue.offer(vertex); //zero degree as the first layer}}// BFS process everyLayerswhile (!queue.isEmpty()) {SetString currentLayer new HashSet();int size queue.size();for (int i 0; i size; i) {String currentBean queue.poll();currentLayer.add(currentBean);// iterator layersfor (String successor : getSuccessors(dag,currentBean)) {inDegree.put(successor, inDegree.get(successor) - 1);if (inDegree.get(successor) 0) {queue.offer(successor); // add next layer when the degress is zero}}}layers.add(currentLayer);}return layers;}// get next nodeprivate SetString getSuccessors(DirectedAcyclicGraphString, DefaultEdge dag, String vertex) {// get outgoingEdgesSetDefaultEdge outgoingEdges dag.outgoingEdgesOf(vertex);// find the next nodereturn outgoingEdges.stream().map(edge - dag.getEdgeTarget(edge)).collect(Collectors.toSet());}// init beans by layerprivate void initializeBeansInLayers(ListSetString layers, ConfigurableListableBeanFactory beanFactory) {for (SetString layer : layers) {// Beans of the same layer can be initialized in parallelListCompletableFutureVoid futures new ArrayList();for (String beanName : layer) {// only load beans that wrote by yourselfif (shouldLoadBean(beanName)) {CompletableFutureVoid future CompletableFuture.runAsync(() - {try {beanFactory.getBean(beanName); // init Bean} catch (Exception e) {System.err.println(Failed to initialize bean: beanName);e.printStackTrace();}}, executorService);futures.add(future);}}//Wait for all beans in the current layer to be initialized before initializing the next layer.CompletableFutureVoid allOf CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));allOf.join(); // make sure to be done on current layer}}private boolean shouldLoadBean(String beanName) {return beanName.startsWith(helloWorldController)||beanName.startsWith(serviceOne)||beanName.startsWith(serviceTwo)||beanName.startsWith(serviceThree);} } 获取beanAutowired依赖 package com.et.config;import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set;Component public class DependencyResolver {private final ConfigurableListableBeanFactory beanFactory;Autowiredpublic DependencyResolver(ConfigurableListableBeanFactory beanFactory) {this.beanFactory beanFactory;}public SetString getAllDependencies(String beanName) {SetString dependencies new HashSet();// get Bean definiteBeanDefinition beanDefinition beanFactory.getBeanDefinition(beanName);// reflecttry {Class? beanClass Class.forName(beanDefinition.getBeanClassName());Field[] fields beanClass.getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(Autowired.class)) {dependencies.add(field.getType().getName()); }}} catch (ClassNotFoundException e) {e.printStackTrace();}return dependencies;} } controller package com.et.controller;import com.et.service.ServiceTwo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.et.service.*; import java.util.HashMap; import java.util.Map;RestController public class HelloWorldController {AutowiredServiceOne ServiceOne;AutowiredServiceTwo ServiceTwo;RequestMapping(/hello)public MapString, Object showHelloWorld(){MapString, Object map new HashMap();map.put(msg, HelloWorld);return map;} } service package com.et.service;import org.springframework.stereotype.Service;/*** author liuhaihua* version 1.0* ClassName ServiceOne* Description todo* date 2024/09/20/ 14:01*/ Service public class ServiceOne {private void sayhi(){System.out.println(this is service one sayhi);} } package com.et.service;import org.springframework.stereotype.Service;/*** author liuhaihua* version 1.0* ClassName ServiceOne* Description todo* date 2024/09/20/ 14:01*/ Service public class ServiceThree {private void sayhi(){System.out.println(this is service three sayhi);} } package com.et.service;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;/*** author liuhaihua* version 1.0* ClassName ServiceOne* Description todo* date 2024/09/20/ 14:01*/ Service public class ServiceTwo {AutowiredServiceThree serviceThree;private void sayhi(){System.out.println(this is service two sayhi);} } 只是一些关键代码所有代码请参见下面代码仓库 代码仓库 https://github.com/Harries/springboot-demo(dag) 4.测试 启动Spring Boot工程查看bean加载顺序如下 2024-09-20T15:51:27.08108:00 INFO 33188 --- [ main] com.et.DemoApplication : Starting DemoApplication using Java 17.0.9 with PID 33188 (D:\IdeaProjects\ETFramework\dag\target\classes started by Dell in D:\IdeaProjects\ETFramework) 2024-09-20T15:51:27.08508:00 INFO 33188 --- [ main] com.et.DemoApplication : No active profile set, falling back to 1 default profile: default layers:[[serviceOne, serviceThree], [serviceTwo], [helloWorldController]] 2024-09-20T15:51:28.28608:00 INFO 33188 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8088 (http) 2024-09-20T15:51:28.29708:00 INFO 33188 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2024-09-20T15:51:28.29708:00 INFO 33188 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.17] 2024-09-20T15:51:28.37308:00 INFO 33188 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2024-09-20T15:51:28.37408:00 INFO 33188 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1198 ms 2024-09-20T15:51:28.72508:00 INFO 33188 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8088 (http) with context path 2024-09-20T15:51:28.73208:00 INFO 33188 --- [ main] com.et.DemoApplication 5.引用 JGraphX User ManualSpring Boot利用dag加速Spring beans初始化 | Harries Blog™
http://www.zqtcl.cn/news/43935/

相关文章:

  • 网站搭建哪家好国外好的电商网站有哪些
  • joomla 企业网站模板中关村在线小程序
  • 企业建设网站维护平面设计网络接单
  • 网站的维护及建设网站建设怎么搞
  • 弹幕网站开发难么杭州百度推广
  • 在重庆_那里可以做诚信网站认证分销商城系统源码
  • 免费观看行情软件网站进入百度域名注册流程
  • 在郑州建设网站这么做模版网站利于优化
  • 打开一个网站慢中国十大服务外包企业
  • 住房和城乡建设部网站倪虹四川住房建设和城乡建设厅新网站
  • 专门做电商的招聘网站网站如何创建
  • 网站建设热门吗单页网站域名
  • 每天自动更新的网站wordpress会员充值管理系统
  • 响应式网站建设品牌全网天下下载 asp网站
  • 龙华区住房和建设局网站wordpress用什么图床好
  • 温州编程网站网站备案图片
  • 哪个公司网站做的最好dedecms网站布局的模版修改方法
  • 重庆品牌网站建设公司哪家好有没有帮忙做标书的网站
  • 印刷个性化网站建设的意义wordpress主题详情更改版权
  • 外贸石材网站网络推广网站公司推荐
  • 通过高新区网站建设淘宝网请人做淘宝客网站
  • 蚂蜂窝网站分析网站建设的解决方案
  • 网站备案换接入商加工网袋的设备多少钱
  • 提供网站建设的功能浙江省建设信息港三类人员证书查询
  • 网站被k申诉房屋装修在线设计网站
  • 网站群发软件做网站有高手没有
  • 优秀的门户网站房地产销售新手必学知识
  • 二道江网站建设桂林市电力建设公司网站
  • 网站中文章内图片做超链接教育在线网站怎样做直播
  • 单产品网站石家庄百度推广