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

上海外贸网站推广网站图片链接是怎么做的

上海外贸网站推广,网站图片链接是怎么做的,wordpress默认主题怎么用,销售网站设计介绍 在我们使用log4j2或者logback打印日志时#xff0c;输出的内容中通常是一定要加上服务名的。以log4j2为例#xff1a; !--输出控制台的配置-- Console nameConsole targetSYSTEM_OUT!-- 输出日志的格式 --Patter…介绍 在我们使用log4j2或者logback打印日志时输出的内容中通常是一定要加上服务名的。以log4j2为例 !--输出控制台的配置-- Console nameConsole targetSYSTEM_OUT!-- 输出日志的格式 --PatternLayout patternserver-case %d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n/ /Console服务名为server-case输出的内容为 server-case 2023-09-15 17:44:38 INFO ServerCaseApplication:648 - No active profile set, falling back to default profiles: default server-case 2023-09-15 17:44:39 INFO TomcatWebServer:108 - Tomcat initialized with port(s): 7081 (http) server-case 2023-09-15 17:44:39 INFO Http11NioProtocol:173 - Initializing ProtocolHandler [http-nio-7081] server-case 2023-09-15 17:44:39 INFO StandardService:173 - Starting service [Tomcat] ...但是有种情况有的项目要部署在甲方内网或者连接甲方的资源。项目是同一套代码但要服务于不同的甲方所以一个项目会有不同的服务名的情况。 这样的话服务名就不能写死要根据不同的服务名来输出。 问题 有的人可能会想到直接设置一个对象实现EnvironmentAware接口中的setEnvironment(Environment environment)来获取environment来获取spring.application.name 但这样有问题设置的这个对象是要在spring上下文中进行加载后才能获得environment所以在这个对象加载之前的日志输出还是拿不到environment的 Component public class Test implements EnvironmentAware {private Environment environment;Overridepublic void setEnvironment(final Environment environment) {this.environment environment;System.setProperty(applicationName, Objects.requireNonNull(environment.getProperty(spring.application.name)));} }!--输出控制台的配置-- Console nameConsole targetSYSTEM_OUT!-- 输出日志的格式 --PatternLayout pattern${sys:applicationName} %d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n/ /Console${sys:applicationName} 2023-09-18 10:18:34 INFO ServerCaseApplication:55 - Starting ServerCaseApplication on lukuan with PID 21472 (D:\idea_work_my\gitee\cook-frame\server\server-case\target\classes started by lukuan in D:\idea_work_my\gitee\cook-frame) ${sys:applicationName} 2023-09-18 10:18:34 INFO ServerCaseApplication:648 - No active profile set, falling back to default profiles: default ${sys:applicationName} 2023-09-18 10:18:34 INFO TomcatWebServer:108 - Tomcat initialized with port(s): 7081 (http) ${sys:applicationName} 2023-09-18 10:18:34 INFO Http11NioProtocol:173 - Initializing ProtocolHandler [http-nio-7081] ${sys:applicationName} 2023-09-18 10:18:34 INFO StandardService:173 - Starting service [Tomcat] ${sys:applicationName} 2023-09-18 10:18:34 INFO StandardEngine:173 - Starting Servlet engine: [Apache Tomcat/9.0.46] ${sys:applicationName} 2023-09-18 10:18:34 INFO [/]:173 - Initializing Spring embedded WebApplicationContext ${sys:applicationName} 2023-09-18 10:18:34 INFO ServletWebServerApplicationContext:285 - Root WebApplicationContext: initialization completed in 795 ms_ _ |_ _ _|_. ___ _ | _ | | |\/|_)(_| | |_\ |_)||_|_\ / | 3.5.1 service-case 2023-09-18 10:18:35 INFO ThreadPoolTaskExecutor:181 - Initializing ExecutorService applicationTaskExecutor service-case 2023-09-18 10:18:35 INFO PropertySourcedRequestMappingHandlerMapping:69 - Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2Controller#getDocumentation(String, HttpServletRequest)] service-case 2023-09-18 10:18:35 INFO Http11NioProtocol:173 - Starting ProtocolHandler [http-nio-7081] service-case 2023-09-18 10:18:35 INFO TomcatWebServer:220 - Tomcat started on port(s): 7081 (http) with context path 可以看到比较靠前的日志输出中的applicationName变量是没有被替换成真正的服务名的。 那怎么办呢 分析 所以我们要从SpringBoot的启动过程入手 SpringApplication#run(String… args) public ConfigurableApplicationContext run(String... args) {StopWatch stopWatch new StopWatch();stopWatch.start();ConfigurableApplicationContext context null;configureHeadlessProperty();SpringApplicationRunListeners listeners getRunListeners(args);listeners.starting();try {ApplicationArguments applicationArguments new DefaultApplicationArguments(args);ConfigurableEnvironment environment prepareEnvironment(listeners, applicationArguments);configureIgnoreBeanInfo(environment);Banner printedBanner printBanner(environment);context createApplicationContext();prepareContext(context, environment, listeners, applicationArguments, printedBanner);refreshContext(context);afterRefresh(context, applicationArguments);stopWatch.stop();if (this.logStartupInfo) {new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);}listeners.started(context);callRunners(context, applicationArguments);}catch (Throwable ex) {handleRunFailure(context, ex, listeners);throw new IllegalStateException(ex);}try {listeners.running(context);}catch (Throwable ex) {handleRunFailure(context, ex, null);throw new IllegalStateException(ex);}return context; }突破点在environment的创建这步骤所以分析prepareEnvironment(listeners, applicationArguments)看能不能实现我们想要的需求 SpringApplication#prepareEnvironment private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments) {// Create and configure the environmentConfigurableEnvironment environment getOrCreateEnvironment();configureEnvironment(environment, applicationArguments.getSourceArgs());ConfigurationPropertySources.attach(environment);//经过debug发现当这步方法执行完后environment.getProperty(spring.application.name)是可以获取值listeners.environmentPrepared(environment);bindToSpringApplication(environment);if (!this.isCustomEnvironment) {environment new EnvironmentConverter(getClassLoader()).convertEnvironmentIfNecessary(environment,deduceEnvironmentClass());}ConfigurationPropertySources.attach(environment);return environment; }listeners.environmentPrepared(environment);为关键点environment.getProperty(spring.application.name)就是在此进行完成的所以我们要进入分析。 SpringApplicationRunListeners#environmentPrepared void environmentPrepared(ConfigurableEnvironment environment) {for (SpringApplicationRunListener listener : this.listeners) {listener.environmentPrepared(environment);} }listeners有一个实现类EventPublishingRunListener public void environmentPrepared(ConfigurableEnvironment environment) {this.initialMulticaster.multicastEvent(new ApplicationEnvironmentPreparedEvent(this.application, this.args, environment)); }这里是发布了一个ApplicationEnvironmentPreparedEvent事件。 既然有发布就有监听。我们接下来分析下监听事件的逻辑 ConfigFileApplicationListener#onApplicationEvent public void onApplicationEvent(ApplicationEvent event) {if (event instanceof ApplicationEnvironmentPreparedEvent) {onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event);}if (event instanceof ApplicationPreparedEvent) {onApplicationPreparedEvent(event);} }private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) {ListEnvironmentPostProcessor postProcessors loadPostProcessors();postProcessors.add(this);AnnotationAwareOrderComparator.sort(postProcessors);for (EnvironmentPostProcessor postProcessor : postProcessors) {postProcessor.postProcessEnvironment(event.getEnvironment(), event.getSpringApplication());} }postProcessors有多个其中ConfigFileApplicationListener就是设置spring.applicaton.name的值。至于怎么设置的就不进去分析了有兴趣的同学可以自行去仔细研究。 通常上述分析我们知道了Environment设置spring.applicaton.name值的步骤那么我们可不可以紧接着这个设置步骤之后就进行自定义设值然后让log4j2来取呢 答案是当然可以 让我们回到SpringApplicationRunListeners#environmentPrepared SpringApplicationRunListeners#environmentPrepared void environmentPrepared(ConfigurableEnvironment environment) {for (SpringApplicationRunListener listener : this.listeners) {listener.environmentPrepared(environment);} }默认listeners为一个那我们只要自己实现一个让listeners为2个第一个默认执行完后不就能紧接着执行我们的了吗那我们分析下listeners是怎么来的 SpringApplication#getRunListeners private SpringApplicationRunListeners getRunListeners(String[] args) {Class?[] types new Class?[] { SpringApplication.class, String[].class };return new SpringApplicationRunListeners(logger,getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args)); }private T CollectionT getSpringFactoriesInstances(ClassT type, Class?[] parameterTypes, Object... args) {ClassLoader classLoader getClassLoader();// Use names and ensure unique to protect against duplicatesSetString names new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoader));ListT instances createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);AnnotationAwareOrderComparator.sort(instances);return instances; }SpringFactoriesLoader.loadFactoryNames(type, classLoader)和自动装配的方法很像啊那去看一眼 org.springframework.boot.SpringApplicationRunListener\ org.springframework.boot.context.event.EventPublishingRunListener果然在文件中指定了org.springframework.boot.context.event.EventPublishingRunListener也就是默认的SpringApplicationRunListener实现类。 然后在分析createSpringFactoriesInstances看看是如何加载的 private T ListT createSpringFactoriesInstances(ClassT type, Class?[] parameterTypes,ClassLoader classLoader, Object[] args, SetString names) {ListT instances new ArrayList(names.size());for (String name : names) {try {Class? instanceClass ClassUtils.forName(name, classLoader);Assert.isAssignable(type, instanceClass);Constructor? constructor instanceClass.getDeclaredConstructor(parameterTypes);T instance (T) BeanUtils.instantiateClass(constructor, args);instances.add(instance);}catch (Throwable ex) {throw new IllegalArgumentException(Cannot instantiate type : name, ex);}}return instances; }这里就是创建对象的过程了用的是有参构造方法需要两个参数constructor, args所以我们参考EventPublishingRunListener的结构来实现即可 实现 自定义SpringApplicationRunListener的实现类CustomEventPublishingRunListener CustomEventPublishingRunListener public class CustomEventPublishingRunListener implements SpringApplicationRunListener, Ordered {private static final String SPRING_APPLICATION_NAME spring.application.name;private final SpringApplication application;private final String[] args;public CustomEventPublishingRunListener(SpringApplication application, String[] args){this.application application;this.args args;}Overridepublic int getOrder() {return 1;}Overridepublic void environmentPrepared(ConfigurableEnvironment environment) {String applicationName environment.getProperty(SPRING_APPLICATION_NAME);if (StringUtil.isNotEmpty(applicationName)) {System.setProperty(applicationName, applicationName);}} }有参构造方法中的SpringApplication application, String[] args参数为固定的getOrder返回的值要为1因为EventPublishingRunListener中的getOrder返回值为0 在自动装配文件spring.factories指定位置 org.springframework.boot.SpringApplicationRunListener\com.example.runlistener.CustomEventPublishingRunListener在log4j2的xml文件中进行取值 !--输出控制台的配置-- Console nameConsole targetSYSTEM_OUT!-- 输出日志的格式 --PatternLayout pattern${sys:applicationName} %d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n/ /Console输出结果 service-case 2023-09-18 14:57:25 INFO ServerCaseApplication:55 - Starting ServerCaseApplication on lukuan with PID 20004 (D:\idea_work_my\gitee\cook-frame\server\server-case\target\classes started by lukuan in D:\idea_work_my\gitee\cook-frame) service-case 2023-09-18 14:57:25 INFO ServerCaseApplication:648 - No active profile set, falling back to default profiles: default service-case 2023-09-18 14:57:25 INFO TomcatWebServer:108 - Tomcat initialized with port(s): 7081 (http) service-case 2023-09-18 14:57:25 INFO Http11NioProtocol:173 - Initializing ProtocolHandler [http-nio-7081] service-case 2023-09-18 14:57:25 INFO StandardService:173 - Starting service [Tomcat] service-case 2023-09-18 14:57:25 INFO StandardEngine:173 - Starting Servlet engine: [Apache Tomcat/9.0.46] service-case 2023-09-18 14:57:25 INFO [/]:173 - Initializing Spring embedded WebApplicationContext service-case 2023-09-18 14:57:25 INFO ServletWebServerApplicationContext:285 - Root WebApplicationContext: initialization completed in 716 ms_ _ |_ _ _|_. ___ _ | _ | | |\/|_)(_| | |_\ |_)||_|_\ / | 3.5.1 service-case 2023-09-18 14:57:26 INFO ThreadPoolTaskExecutor:181 - Initializing ExecutorService applicationTaskExecutor service-case 2023-09-18 14:57:26 INFO PropertySourcedRequestMappingHandlerMapping:69 - Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2Controller#getDocumentation(String, HttpServletRequest)] service-case 2023-09-18 14:57:26 INFO Http11NioProtocol:173 - Starting ProtocolHandler [http-nio-7081] service-case 2023-09-18 14:57:26 INFO TomcatWebServer:220 - Tomcat started on port(s): 7081 (http) with context path ....可以看到实现了我们想要的功能
http://www.zqtcl.cn/news/842624/

相关文章:

  • 长沙营销网站建设苏州风险区域最新
  • 个人网站百度推广收费wordpress发邮件慢
  • 三门峡网站设计wordpress 去掉功能
  • 网站小程序开发公司wordpress 用户授权
  • 做外贸的几个网站响应式网站wordpress摄影
  • 专业建设网站技术wordpress 虚拟资源
  • 广告网站设计哪家快网站建设外包包含内容
  • 网页游戏网站模板张家口住房和城乡建设部网站
  • 冀州建设局网站公司制作网站多少钱
  • 建设个招聘网站黄页88和58那个推广好
  • 如何设计一个漂亮的网站电商设计素材
  • 沈阳建设银行网站首页果冻影视传媒有限公司
  • 建设部网站有建筑施工分包网站规划设计方案
  • 网站wap怎么做郑州做网站华久科技
  • 哪里网站开发好姜堰网站定制
  • 广东网站开发需要多少钱百度问答官网
  • 建设电影网站的关键wordpress简码怎么用
  • 做网站的linux程序代码北京公司减资流程
  • 四川省住房建设厅网站进不去wordpress 无限下拉菜单
  • 培训网站图片网络编程基础知识
  • 外销网站怎么做的上海住房与城乡建设部网站
  • 平台网站建设教程网站建设谈业务要知道什么
  • php网站开发试题济南网站排名公司
  • 没有官方网站怎么做seo优化营销推广平台都干什么的
  • 网盘搜索网站怎么做中国建设银行网站股份结构变化
  • 有ip怎么用自己的主机做网站惠州网站制作维护
  • 优质的网站制作在线编辑器
  • 盘锦做网站电话网络营销做私活网站
  • 有关网站建设的毕业设计外卖网站的建设与推广
  • cms 做网站用模板网站做h5宣传页多少钱