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

教做家常菜的视频网站wordpress 搭建个人博客

教做家常菜的视频网站,wordpress 搭建个人博客,网站弹出窗口js,wordpress换邮箱文章目录 什么是依赖注入传统方式 vs 依赖注入传统方式(紧耦合)依赖注入方式(松耦合) 依赖注入的三种主要方式1. 构造函数注入(Constructor Injection)2. Setter注入(Setter Injection&#xff…

文章目录

    • 什么是依赖注入
    • 传统方式 vs 依赖注入
      • 传统方式(紧耦合)
      • 依赖注入方式(松耦合)
    • 依赖注入的三种主要方式
      • 1. 构造函数注入(Constructor Injection)
      • 2. Setter注入(Setter Injection)
      • 3. 字段注入(Field Injection)
    • Spring框架中的依赖注入示例
      • 使用@Autowired注解
      • 使用配置类
    • 依赖注入的优势
      • 1. **松耦合**
      • 2. **可测试性**
      • 3. **配置集中化**
      • 4. **重用性**
    • 实际应用场景
      • 多数据源切换
      • 条件注入
    • 最佳实践

Java Bean的依赖注入(Dependency Injection,DI)是一种设计模式,它是控制反转(IoC,Inversion of Control)原则的具体实现。

什么是依赖注入

依赖注入是指不在对象内部创建依赖对象,而是通过外部容器将依赖对象注入到需要它的对象中的技术。

传统方式 vs 依赖注入

传统方式(紧耦合)

public class UserService {private UserDao userDao;public UserService() {// 在构造函数中直接创建依赖对象this.userDao = new UserDaoImpl();}
}

依赖注入方式(松耦合)

public class UserService {private UserDao userDao;// 通过构造函数注入public UserService(UserDao userDao) {this.userDao = userDao;}// 或者通过setter方法注入public void setUserDao(UserDao userDao) {this.userDao = userDao;}
}

依赖注入的三种主要方式

1. 构造函数注入(Constructor Injection)

@Component
public class OrderService {private final PaymentService paymentService;private final InventoryService inventoryService;// Spring会自动注入这些依赖public OrderService(PaymentService paymentService, InventoryService inventoryService) {this.paymentService = paymentService;this.inventoryService = inventoryService;}
}

2. Setter注入(Setter Injection)

@Component
public class EmailService {private NotificationService notificationService;@Autowiredpublic void setNotificationService(NotificationService notificationService) {this.notificationService = notificationService;}
}

3. 字段注入(Field Injection)

@Component
public class ProductService {@Autowiredprivate ProductRepository productRepository;@Autowiredprivate CategoryService categoryService;
}

Spring框架中的依赖注入示例

使用@Autowired注解

@Service
public class BookService {@Autowiredprivate BookRepository bookRepository;@Autowiredprivate AuthorService authorService;public List<Book> findBooksByAuthor(String authorName) {Author author = authorService.findByName(authorName);return bookRepository.findByAuthor(author);}
}@Repository
public class BookRepository {@Autowiredprivate JdbcTemplate jdbcTemplate;public List<Book> findByAuthor(Author author) {// 数据库查询逻辑return jdbcTemplate.query("SELECT * FROM books WHERE author_id = ?",new Object[]{author.getId()},new BookRowMapper());}
}

使用配置类

@Configuration
public class AppConfig {@Beanpublic UserService userService(UserRepository userRepository) {return new UserService(userRepository);}@Beanpublic UserRepository userRepository() {return new JpaUserRepository();}
}

依赖注入的优势

1. 松耦合

  • 对象不需要知道依赖对象的具体实现
  • 便于替换不同的实现

2. 可测试性

// 单元测试中可以轻松mock依赖
@Test
public void testUserService() {UserRepository mockRepository = Mockito.mock(UserRepository.class);UserService userService = new UserService(mockRepository);// 测试逻辑
}

3. 配置集中化

  • 所有依赖关系在配置文件或注解中统一管理
  • 便于维护和修改

4. 重用性

  • 同一个类可以在不同场景下使用不同的依赖实现

实际应用场景

多数据源切换

@Service
public class DataService {private final DataRepository repository;public DataService(@Qualifier("primaryDataRepository") DataRepository repository) {this.repository = repository;}
}@Configuration
public class DataConfig {@Bean@Primarypublic DataRepository primaryDataRepository() {return new MySQLDataRepository();}@Beanpublic DataRepository secondaryDataRepository() {return new PostgreSQLDataRepository();}
}

条件注入

@Service
@ConditionalOnProperty(name = "payment.provider", havingValue = "stripe")
public class StripePaymentService implements PaymentService {// Stripe支付实现
}@Service
@ConditionalOnProperty(name = "payment.provider", havingValue = "paypal")
public class PayPalPaymentService implements PaymentService {// PayPal支付实现
}

最佳实践

  1. 优先使用构造函数注入,因为它保证了依赖的不可变性
  2. 避免循环依赖
  3. 使用接口而不是具体类作为依赖类型
  4. 合理使用@Qualifier注解来解决多个同类型Bean的冲突

依赖注入是现代Java开发中的核心概念,特别是在Spring框架中,它大大简化了对象管理和提高了代码的可维护性。

http://www.dtcms.com/a/532590.html

相关文章:

  • 【Go】C++ 转 Go 第(五)天:Goroutine 与 Channel | Go 并发编程基础
  • 算法:283. 移动零
  • 设计微信公众号的网站吗举例说明seo
  • 欧米伽男士手表官方网站wordpress下载类型主题
  • Chrome离线版下载版,Chrome离线版安装文件,Chrome离线包
  • 上饶网站建设多少钱分销网站有哪些
  • 阿里云 Qwen 模型的 OpenAI SDK 调用
  • 什么是提示词(Prompt),提示词类型、结构解析
  • MES系列-制造流程数字化的实现
  • 我想在网站上卖食品怎么做百度知道网址
  • 对于使用队列实现栈以及用栈实现队列的题目的解析
  • Spring Boot3零基础教程,事件驱动开发,设计登录成功后增加积分记录信息功能,笔记61
  • 网站开发进度表网络电话免费版
  • 两种Redis序列化对比
  • 精确优化长尾关键词以提升SEO效果的战略分析
  • 分析对手网站wordpress制作功能型网站
  • Spring AOP注解配置实战:从概念到代码实现的深度解析(含核心关键词)
  • 【图像算法 - 31】基于深度学习的太阳能板缺陷检测系统:YOLOv12 + UI界面 + 数据集实现
  • 火山方舟 Responses API 实战指南:从概念到「公司尽调 Dossier 生成器」
  • 【推荐系统3】向量召回:i2i召回、u2i召回
  • 网站建设及系统开发wordpress仿微信菜单栏
  • 网站死链接怎么处理网页版浏览器怎么设置
  • 【仿RabbitMQ的发布订阅式消息队列】--- 介绍
  • Frobenius范数:矩阵分析的万能度量尺
  • 做网站 php asp.net jsp学院网站建设实例
  • [论文阅读] 从 5MB 到 1.6GB 数据:Java/Scala/Python 在 Spark 中的性能表现全解析
  • 算法--滑动窗口(一)
  • 新房网站建设公司永和建设集团有限公司网站
  • 【Rust编程:从新手到大师】Rust 环境搭建(详细版)
  • SQL188 每月及截止当月的答题情况