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

品牌网站制作哪家好企业网站推广可以选择哪些方法

品牌网站制作哪家好,企业网站推广可以选择哪些方法,wordpress在lnmp部署,phpcms网站模版摘要: SpringBoot通过精巧的模块化架构设计#xff0c;将传统Spring应用的复杂性封装在约定优于配置的哲学之下。本文将从自动装配机制、Starter设计模式、事务管理内核等架构层面切入#xff0c;揭示其如何通过条件化配置、环境隔离、组件扫描等核心机制实现快速应用开发将传统Spring应用的复杂性封装在约定优于配置的哲学之下。本文将从自动装配机制、Starter设计模式、事务管理内核等架构层面切入揭示其如何通过条件化配置、环境隔离、组件扫描等核心机制实现快速应用开发并给出生产级最佳实践方案。 一、核心机制解析 1.1、自动配置原理 ‌实现机制图解‌ 实现流程说明 步骤 关键动作 参与组件 说明 1. 启动触发 扫描SpringBootApplication SpringApplication 组合注解包含EnableAutoConfiguration 2. 加载配置 读取AutoConfiguration.imports SpringFactoriesLoader 加载所有预定义的自动配置类 3. 条件过滤 评估Conditional系列注解 ConditionEvaluator 根据类路径、Bean存在性等条件筛选 4. Bean注册 创建有效的配置类实例 ConfigurationClassPostProcessor 最终生效的配置类生成Bean定义 1.2、启动流程详解 启动流程图解 阶段 步骤 核心动作 重要组件/注解 输出结果 初始化阶段‌ 1. 实例化SpringApplication - 推断Web应用类型 - 加载ApplicationContextInitializer - 加载ApplicationListener SpringApplication构造函数 初始化完成的应用实例 2. 运行SpringApplication - 启动计时器 - 准备环境配置 ConfigurableEnvironment 环境变量就绪 上下文阶段‌ 3. 创建应用上下文 - 根据类型实例化上下文 - 准备Bean定义读取器 AnnotationConfigServletWebServerApplicationContext 空上下文容器 4. 准备上下文 - 关联环境配置 - 执行Initializer - 发布ContextPrepared事件 ApplicationContextInitializer 预处理完成的上下文 ‌刷新阶段‌ 5. 刷新上下文 - 解析配置类 - 初始化Bean工厂 - 执行BeanFactoryPostProcessor AbstractApplicationContext.refresh() 可用的Bean工厂 ‌自动配置阶段‌ 6. 处理自动配置 - 加载候选配置类 - 执行条件过滤 - 注册Bean定义 AutoConfigurationImportSelector 生效的自动配置Bean ‌收尾阶段‌ 7. 完成启动 - 发布ContextRefreshed事件 - 调用CommandLineRunner - 启动WebServer SpringApplicationRunListener 运行中的应用 二、关键特性实现 2.1、Starter设计精髓         通过 Starter 设计‌将技术整合的复杂度从业务代码转移到基础设施层‌开发者只需关注核心逻辑。 2.1.1、Starter 的核心作用‌ ‌依赖聚合‌将某个技术栈的所有依赖打包成一个 Starter避免手动管理多个关联依赖如 MyBatis 需要 mybatis-core、mybatis-spring、连接池等。‌自动配置‌根据类路径是否存在关键类如RedisTemplate自动创建并配置 Bean。‌默认优化‌提供生产级默认配置如连接池大小、线程池参数减少冗余配置。‌快速集成‌通过 EnableXXX 注解或直接引入 Starter实现“开箱即用”。 2.1.2、设计思路‌ 设计原则 实现方式 ‌约定优于配置‌ 默认配置内置在 Starter 中除非用户显式覆盖 ‌条件化装配‌ 通过 Conditional 系列注解动态判断是否装配 Bean ‌模块化隔离‌ 每个 Starter 只负责单一技术栈的整合如 spring-boot-starter-data-redis ‌统一配置入口‌ 通过 application.properties 的标准化前缀如 spring.datasource.* 2.1.3、对比传统方式‌ // 传统方式手动配置 Redis Configuration public class RedisConfig {Beanpublic RedisConnectionFactory redisConnectionFactory() {JedisConnectionFactory factory new JedisConnectionFactory();factory.setHost(localhost);factory.setPort(6379);return factory;} }// Starter 方式只需配置 application.yml spring:redis:host: localhostport: 63792.2、配置体系详解 ‌2.2.1、自动配置决策流程图解 关键注解说明‌ ConditionalOnClass类路径存在指定类时生效ConditionalOnProperty配置属性满足条件时生效ConditionalOnMissingBean容器中不存在指定Bean时生效 2.2.2、配置加载优先级 优先级 配置源类型 典型示例 覆盖关系 1 (最高) 命令行参数 --server.port8081 覆盖所有其他配置 2 环境变量 export SPRING_DATASOURCE_URL... 覆盖配置文件 3 应用外部配置文件 config/application.yml 覆盖jar包内配置 4 应用内部配置文件 resources/application.yml 基础默认配置 5 默认配置 SpringBoot预置配置 最低优先级 三、事务管理全攻略 3.1、实现原理 // 事务拦截器核心逻辑简化版 public Object invoke(MethodInvocation invocation) {// 1. 获取事务属性TransactionAttribute txAttr getTransactionAttributeSource().getTransactionAttribute(method, targetClass);// 2. 获取事务管理器PlatformTransactionManager tm determineTransactionManager(txAttr);// 3. 根据传播行为处理事务TransactionStatus status tm.getTransaction(txAttr);try {// 4. 执行目标方法Object retVal invocation.proceed();// 5. 提交事务tm.commit(status);return retVal;} catch (Exception ex) {// 6. 异常回滚completeTransactionAfterThrowing(txAttr, status, ex);throw ex;} } 3.2、事务管理器 核心作用:         核心职责是‌为当前事务操作确定具体的事务管理器实例‌。这是Spring事务管理的关键环节决定了 使用哪个具体的事务管理器实现如JDBC、JPA、Hibernate等在多数据源环境下选择正确的数据源关联的事务管理器是否使用自定义指定的事务管理器 事务管理器解析策略 场景 处理方式 未指定事务管理器 使用容器中唯一的或名为transactionManager的bean 通过Transactional(transactionManagername)指定 从容器中获取指定名称的bean 多数据源未明确指定 抛出异常要求明确指定 与Transactional注解的配合 // 显式指定事务管理器 Transactional(transactionManager accountTxManager) public void transferMoney() {// 业务逻辑 } 3.3、传播行为 传播行为的作用         定义了‌多个事务方法相互调用时事务应该如何传播‌的规则。它解决了以下核心问题 ‌事务上下文传递‌当方法A调用方法B时B是否要加入A的事务还是开启新事务‌事务边界控制‌决定事务的起始点和结束点‌资源使用优化‌合理管理数据库连接等资源 7种传播行为详解 传播行为类型 作用描述 适用场景 ‌REQUIRED‌ (默认) 如果当前存在事务则加入该事务如果不存在则新建一个事务 大多数业务场景 ‌SUPPORTS‌ 如果当前存在事务则加入该事务如果不存在则以非事务方式执行 查询操作可适应事务环境 ‌MANDATORY‌ 必须在一个已有的事务中执行否则抛出异常 必须被事务上下文调用的方法 ‌REQUIRES_NEW‌ 总是新建事务如果当前存在事务则挂起当前事务 独立业务操作如日志记录 ‌NOT_SUPPORTED‌ 以非事务方式执行如果当前存在事务则挂起该事务 不涉及数据修改的操作 ‌NEVER‌ 以非事务方式执行如果当前存在事务则抛出异常 强制要求非事务环境 ‌NESTED‌ 如果当前存在事务则在嵌套事务内执行否则新建事务 需要部分回滚的复杂业务 应用案例日志记录场景REQUIRES_NEW Service public class OrderService {Transactionalpublic void placeOrder(Order order) {// 主业务逻辑orderDao.save(order);// 记录日志独立事务logService.auditLog(order);} }Service public class LogService {Transactional(propagation Propagation.REQUIRES_NEW)public void auditLog(Order order) {// 即使placeOrder()回滚日志仍然保留logDao.save(createLogEntry(order));} } 3.4、事务失效 场景 是否失效 原因 跨Service调用 ✅ 有效 符合AOP代理机制 自调用同一个Service内部调用 ❌ 失效 绕过代理 私有方法调用 ❌ 失效 无法被代理 静态方法调用 ❌ 失效 无法被代理 通过代理对象调用 ✅ 有效 走代理逻辑 ‌多线程调用‌ ❌ 失效 ‌ThreadLocal上下文丢失 应用案例自调用同一个Service类内部调用 Service public class OrderService {Transactionalpublic void placeOrder(Order order) {// 主业务逻辑orderDao.save(order);// 自调用事务失效this.auditLog(order); // 不走代理REQUIRES_NEW不生效}Transactional(propagation Propagation.REQUIRES_NEW)public void auditLog(Order order) {logDao.save(createLogEntry(order));} } 解决方案‌ 拆分为两个Service类推荐使用AopContext.currentProxy()通过构造函数注入自身代理 ‌ 四、核心注解大全 注解 应用场景 示例 DistributedLock 分布式锁 DistributedLock(key #orderId) Retryable 方法重试 Retryable(maxAttempts3) Cacheable 结果缓存 Cacheable(cacheNamesusers) Async 异步执行 Async(taskExecutor) Scheduled 定时任务 Scheduled(cron0 0 12 * * ?) ‌分布式锁实现示例‌ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface DistributedLock {String key();long expire() default 30000;int timeout() default 1000; }Aspect Component public class DistributedLockAspect {Around(annotation(lock))public Object around(ProceedingJoinPoint pjp, DistributedLock lock) throws Throwable {String lockKey SpELParser.parse(lock.key(), pjp);boolean acquired redisTemplate.opsForValue().setIfAbsent(lockKey, 1, lock.expire(), TimeUnit.MILLISECONDS);if (!acquired) throw new RuntimeException(获取锁失败);try {return pjp.proceed();} finally {redisTemplate.delete(lockKey);}} } 五、性能优化方案 5.1、启动加速三剑客 ‌方案对比‌ 优化手段 实施难度 副作用 限定组件扫描范围 ★★☆ 需维护扫描路径 懒加载初始化 ★★★ 可能延迟发现问题 排除自动配置 ★☆☆ 需确认排除项 ‌配置示例‌ SpringBootApplication(scanBasePackages com.business, // 限定扫描范围exclude {DataSourceAutoConfiguration.class} // 排除自动配置 ) 5.2、运行时优化 ‌连接池配置建议‌ spring:datasource:hikari:maximum-pool-size: 20 # 建议: (CPU核心数 * 2) 有效磁盘数minimum-idle: 5idle-timeout: 600000max-lifetime: 1800000connection-timeout: 30000 ‌ 六、扩展机制实战 6.1、自定义条件注解 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Conditional(OnRocketMQCondition.class) public interface ConditionalOnRocketMQ {String value() default ; }public class OnRocketMQCondition implements Condition {Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return context.getEnvironment().containsProperty(rocketmq.name-server);} } 6.2、内嵌容器替换 !-- 替换Tomcat为Jetty -- dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdexclusionsexclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactId/exclusion/exclusions /dependency dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jetty/artifactId /dependency 总结 SpringBoot的成功源于三个核心设计思想 ‌约定优于配置‌通过合理的默认值减少配置‌开箱即用‌Starter机制实现快速集成‌模块化设计‌每个功能都是可替换的插件
http://www.eeditor.cn/news/123328/

相关文章:

  • 福州网站制作套餐高质量营销型网站定做价格
  • 企业建站 炫酷模板开个广告公司大概需要多少钱
  • 网站设计开发项目书电商公司运营策略
  • 天津自助建站软件昆山建设工程招聘信息网站
  • 网站ie兼容性差网站关键词排名优化系统
  • 如何建立一家公司网站北京品牌网站设计
  • 住房和城乡建设部注册中心网站自助构建网站
  • 贺州网站制作微信与与网站建设
  • 网站建设规划书万能互联网营销策划方案
  • 建站网站建设哪个好万网网站空间
  • 开源网站内容管理系统哈尔滨网站设计快速建站
  • 网站建设外文文献翻译网站统计开放平台
  • 电影网站模板html不用流量的地图导航软件
  • 做网站侵权培训网站建设方案模板
  • 淮北建网站费用基金网站模板
  • 南通网站建设心得徽章设计制作小程序
  • 山东网站开发网络公司国家工商网企业查询官网
  • 阿里巴巴网站广告怎么做wordpress插件卸载
  • 上海营销型网站标准app网站开发框架
  • 哈尔滨做网站哪家好广州番禺职业技术学院
  • 大型门户网站开发费用上海网页设计公司山东济南兴田德润简介
  • 网站菜单导航制作教程哈尔滨关键词优化效果
  • 昆明网站建设一条龙服务广州住房和建设局网站
  • 手机网站在后台怎么做编辑什么网站ghost做的好
  • 做网站赤峰怎么制作网站封面
  • 投资公司网站模板郑州关键词网站优化排名
  • 北京定制网站建设公司学校网站建设 效果
  • 网站设计合同网页版游戏排行榜枪
  • 做网站复杂吗wordpress页面半透明
  • 泰和县城乡建设局网站wordpress 多主题插件