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

thinkcmf做网站快不快织梦网站模板源码

thinkcmf做网站快不快,织梦网站模板源码,网站后台批量上传图片,网站建设系统分析前言 在Spring Boot开发中,静态访问配置信息是一个常见需求,尤其是在工具类、常量类或非Bean类中直接获取配置值。 问题背景 假设我们的应用需要从application.yml中读取配置项app.logotype,并在工具类、静态方法或非Bean类中直接访问该值。…

前言

在Spring Boot开发中,静态访问配置信息是一个常见需求,尤其是在工具类、常量类或非Bean类中直接获取配置值。


问题背景

假设我们的应用需要从application.yml中读取配置项app.logotype,并在工具类、静态方法或非Bean类中直接访问该值。传统依赖注入方式(如@Autowired)存在以下局限:

  1. 非Bean类无法直接注入:如工具类、静态方法无法通过@Autowired获取配置类。
  2. 频繁获取Bean的性能开销:每次通过ApplicationContext.getBean()获取Bean可能影响性能。
  3. 代码耦合性:配置类与业务逻辑的强依赖可能降低代码可维护性。

因此,我们需要一种无需依赖注入、可静态访问配置的解决方案。


解决方案

方案一:通过Setter方法绑定静态变量

核心思想:利用Spring的@ConfigurationProperties自动绑定机制,将配置值通过setter方法直接赋值给静态变量。

实现步骤
  1. 定义配置类

    @Component
    @ConfigurationProperties(prefix = "app")
    public class AppConfig {// 静态变量public static String logotype;// 静态方法public static String getLogotype() {return logotype;}// Spring通过setter注入配置值public void setLogotype(String logotype) {AppConfig.logotype = logotype; // 直接赋值静态变量}
    }
    
  2. 配置文件

    app:logotype: "MyLogo"
    
  3. 使用方式

    public class Util {public static void printLogo() {System.out.println(AppConfig.getLogotype()); // 直接调用静态方法}
    }
    
原理分析
  • Spring的属性绑定机制

    • @ConfigurationProperties的作用:该注解会扫描配置类的属性(字段或setter方法),并根据配置前缀(如app)将application.yml中的键值对映射到Bean的属性上。
    • setter方法调用:Spring通过反射调用setLogotype方法,并将配置值(如"MyLogo")作为参数传入。此时,setter方法直接将值赋给静态变量logotype,而非实例变量。
    • 静态变量的共享性:由于logotype是类级别的静态变量,所有调用AppConfig.getLogotype()的代码都能访问到同一份值。
  • 为何可行

    • Spring的依赖注入机制仅关注方法签名(如setLogotype),而不关心方法内部如何处理参数。因此,即使setter方法直接操作静态变量,Spring仍会正常调用该方法完成赋值。
优缺点
  • 优点
    • 简单直接:无需额外工具类或缓存,代码量最少。
    • 自动绑定:Spring自动处理配置文件的解析和赋值,无需手动操作。
  • 缺点
    • 破坏封装性:静态变量可能被其他代码随意修改,存在潜在风险。
    • 线程安全问题:若静态变量可变,需确保线程安全。
    • 初始化顺序依赖:需确保Spring容器初始化完成后访问静态变量。
适用场景
  • 配置项较少且需快速实现。
  • 项目规模较小,对代码封装性要求不高。

方案二:通过Environment工具类

核心思想:利用Spring的Environment对象直接获取配置值,并通过工具类静态方法封装访问。

实现步骤
  1. 创建工具类

    @Component
    public class ConfigUtil {private static Environment env;// 通过@Autowired注入Environment@Autowiredpublic void setEnvironment(Environment environment) {env = environment;}// 静态方法获取配置值public static String getLogotype() {return env.getProperty("app.logotype");}
    }
    
  2. 使用方式

    public class Util {public static void printLogo() {System.out.println(ConfigUtil.getLogotype());}
    }
    
原理分析
  • Environment的作用
    • Environment是Spring的核心接口,提供获取所有配置信息的能力(包括application.yml、系统属性、JVM参数等)。
    • getProperty方法:通过键名(如app.logotype)直接查询配置值。
  • 静态缓存机制
    • 工具类通过@Autowired注入Environment,并缓存为静态变量。后续调用静态方法时,直接通过env.getProperty()获取值,无需重复注入。
优缺点
  • 优点
    • 灵活扩展:可直接通过键名获取任意配置项,无需修改配置类。
    • 类型安全:支持getProperty("key", Class<T> requiredType)等泛型方法。
  • 缺点
    • 键名硬编码:需手动维护配置项的完整键名(如app.logotype),可能引入拼写错误。
    • 线程安全依赖Environment本身是线程安全的,但需确保容器初始化完成。
适用场景
  • 需频繁访问不同配置项(如app.logotypeapp.timeout等)。
  • 希望通过键名直接获取值,避免配置类的过度设计。

方案三:通过ApplicationContext获取Bean

核心思想:利用Spring的ApplicationContext静态引用直接获取配置Bean,并通过静态方法封装访问。

实现步骤
  1. 保存ApplicationContext

    @SpringBootApplication
    public class Application {public static ConfigurableApplicationContext context;public static void main(String[] args) {context = SpringApplication.run(Application.class, args);}
    }
    
  2. 配置类添加静态方法

    @Component
    @ConfigurationProperties(prefix = "app")
    public class AppConfig {private String logotype;public String getLogotype() {return logotype;}// 静态方法获取配置值public static String getLogotypeStatic() {return Application.context.getBean(AppConfig.class).getLogotype();}
    }
    
  3. 使用方式

    public class Util {public static void printLogo() {System.out.println(AppConfig.getLogotypeStatic());}
    }
    
原理分析
  • ApplicationContext的作用
    • ApplicationContext是Spring容器的核心接口,管理所有Bean的生命周期和依赖关系。
    • 静态引用Application.context:在应用启动时,将ApplicationContext保存为静态变量,后续可通过getBean()直接获取Bean。
  • 静态方法封装
    • 配置类提供静态方法,通过getBean()获取自身实例(单例Bean),并调用实例方法获取配置值。
优缺点
  • 优点
    • 灵活访问:可直接访问配置类的所有属性,无需为每个字段编写静态方法。
    • 兼容Spring生态:配置类仍通过@ConfigurationProperties自动绑定,无需手动处理。
  • 缺点
    • 性能开销:每次调用静态方法都会从容器中获取Bean(但Spring的Bean是单例的,实际影响极小)。
    • 依赖关系:需确保应用已启动,ApplicationContext已初始化。
适用场景
  • 配置项较多且需复用配置类。
  • 希望保持配置类的封装性,避免直接暴露静态变量。

方案对比与选择建议

方案优点缺点适用场景
方案一(Setter绑定静态变量)- 简单直接,无需额外代码。
- 利用Spring的自动绑定机制。
- 可能破坏封装性。
- 静态变量需手动维护。
配置项少且需快速实现时。
方案二(Environment工具类)- 灵活获取任意配置项。
- 支持类型安全。
- 需硬编码配置键名。需频繁访问不同配置项时。
方案三(ApplicationContext引用)- 灵活访问所有配置属性。
- 兼容Spring生态。
- 每次调用需获取Bean。配置项多且需复用配置类时。

深度思考与注意事项

1. 静态变量的线程安全

  • 只读场景:若静态变量仅在初始化时赋值(如方案一),则无需额外处理。
  • 可变场景:若需动态修改配置,需加锁或使用volatile关键字:
    public class AppConfig {private static volatile String logotype; // 使用volatile保证可见性// ...
    }
    

2. 初始化顺序问题

  • 确保容器初始化完成:在静态方法调用前,必须保证Spring应用已启动。
  • 使用@PostConstruct:在配置类中添加初始化方法,确保静态变量已赋值:
    @PostConstruct
    public void init() {System.out.println("Config initialized: " + logotype);
    }
    

3. 配置刷新

  • 动态刷新:若需热更新配置,可结合@RefreshScope或Spring Cloud Config:
    @Component
    @RefreshScope
    public class AppConfig {// 配置类实现动态刷新
    }
    
  • 静态变量的同步:配置刷新时需重新赋值静态变量。

最佳实践建议

  1. 优先选择方案三

    • 通过ApplicationContext获取Bean,既灵活又兼容Spring的配置管理。
    • 示例代码:
      public static String getLogotypeStatic() {return Application.context.getBean(AppConfig.class).getLogotype();
      }
      
  2. 方案二的适用场景

    • 需要频繁访问不同配置项时,通过Environment工具类可减少重复代码。
  3. 慎用方案一

    • 仅在配置项极少且对代码简洁性要求较高时使用,避免破坏封装性。

总结

静态访问配置的解决方案本质是在Spring的依赖注入机制与静态变量的共享性之间找到平衡

  • 方案一:快速实现,但需注意静态变量的维护。
  • 方案二:灵活但需硬编码键名。
  • 方案三:灵活且兼容Spring生态,推荐作为首选。

文章转载自:

http://Cvx8V5DP.wdhhz.cn
http://tWSHC3h6.wdhhz.cn
http://6mfUKy34.wdhhz.cn
http://w12Ay3tI.wdhhz.cn
http://NS61Yn95.wdhhz.cn
http://t60bt0JC.wdhhz.cn
http://j4o5WFFI.wdhhz.cn
http://JN5jke9X.wdhhz.cn
http://9p7VAw1n.wdhhz.cn
http://egIJSyZE.wdhhz.cn
http://YTbiPijX.wdhhz.cn
http://ESgAjY5L.wdhhz.cn
http://GZX9RQa6.wdhhz.cn
http://NXYyhkl9.wdhhz.cn
http://w5wgzFHx.wdhhz.cn
http://tselBrPf.wdhhz.cn
http://W1NKum2I.wdhhz.cn
http://KkmZWw5F.wdhhz.cn
http://w6cts58H.wdhhz.cn
http://8I0XcXuj.wdhhz.cn
http://tKJkTptP.wdhhz.cn
http://SqdVQcUY.wdhhz.cn
http://sNrjJXrS.wdhhz.cn
http://vILO7T2R.wdhhz.cn
http://SKRNwvM4.wdhhz.cn
http://tTzRT8cZ.wdhhz.cn
http://voond6p9.wdhhz.cn
http://J7rjShxT.wdhhz.cn
http://vq3Ct77x.wdhhz.cn
http://yTPBiz7O.wdhhz.cn
http://www.dtcms.com/wzjs/609712.html

相关文章:

  • 网站程序 制作个人做网站要注意什么条件
  • jsp网站开发的环境配置高德地图开发平台
  • 做网站能挣钱不360建筑网个人信息怎么改
  • 做个网站要钱吗wordpress模板网站模板
  • 各大网站搜索引擎入口WordPress自己写主题
  • 中国建设银行 英文网站广告设计与制作工资一般多少
  • 旅游投资公司网站建设ppt模板百度做免费推广的步骤
  • 成都开发网站建设广告创意设计竞赛
  • 做论坛网站要多少配置的服务器网站建设群发广告词
  • 大连凯杰建设有限公司网站在网站上做教学直播平台多少钱
  • 网站开发与网页制作难不难网站主题和风格
  • 北京市网站公司wordpress首页文章轮播
  • 南京做网站的公司排名安装wordpress教程
  • 用小程序做视频网站微信小程序需要服务器吗
  • 新手做网页做那个网站简单网页微信版网址
  • 住房和城乡建设部网站进不去网站怎么做图片转链
  • 在家做网站或ps挣钱接活中国企业网
  • 省市网站建设考核标准要求东莞模板建站平台
  • 企业网站建设应遵守的原则页面设置怎么设置
  • 建网站要备案公司如何建设一个网站
  • 网站开发要点做视频网站要多大的主机
  • 石家庄做外贸网站建设手机端企业网站源码
  • 苏州网络公司建网站头条广告入口
  • 励志网站源码手机网站按那个尺寸做
  • 商品推广软文范例300字产品的seo是什么意思
  • 站长之家0seo站群系统
  • 国外做化工产品的网站凡科建站做的网站有什么短板
  • 免费源码资源源码站诺德中心做网站
  • 建设公司的网站首页宝安区城市建设局网站
  • wordpress制作小说网站模板下载wordpress获得留言