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

站长论坛wordpress界面404

站长论坛,wordpress界面404,广州网站定做教程,手机网站app在 Java 中实现依赖注入(Dependency Injection, DI)的核心思想是将对象的依赖关系从代码内部转移到外部容器或框架管理。以下是常见的实现方式及示例: 一、手动实现依赖注入(不依赖框架) 1. 构造器注入 通过类的构造…

在这里插入图片描述

在 Java 中实现依赖注入(Dependency Injection, DI)的核心思想是将对象的依赖关系从代码内部转移到外部容器或框架管理。以下是常见的实现方式及示例:


一、手动实现依赖注入(不依赖框架)

1. 构造器注入

通过类的构造函数传递依赖对象:

// 接口定义
public interface Logger {void log(String message);
}// 具体实现
public class ConsoleLogger implements Logger {@Overridepublic void log(String message) {System.out.println("Console: " + message);}
}public class FileLogger implements Logger {@Overridepublic void log(String message) {System.out.println("File: " + message);}
}// 使用依赖注入的类
public class UserService {private final Logger logger;// 构造器注入依赖public UserService(Logger logger) {this.logger = logger;}public void createUser(String name) {logger.log("Creating user: " + name);}
}// 手动创建对象并注入依赖
public class Main {public static void main(String[] args) {// 选择具体实现Logger logger = new ConsoleLogger();UserService userService = new UserService(logger);userService.createUser("Alice");}
}
2. Setter 注入

通过 setter 方法设置依赖对象:

public class UserService {private Logger logger;public void setLogger(Logger logger) {this.logger = logger;}public void createUser(String name) {if (logger == null) {throw new IllegalStateException("Logger not initialized");}logger.log("Creating user: " + name);}
}public class Main {public static void main(String[] args) {UserService userService = new UserService();userService.setLogger(new FileLogger());userService.createUser("Bob");}
}

在这里插入图片描述

3. 工厂模式

通过工厂类动态创建对象并注入依赖:

public class LoggerFactory {public static Logger getLogger(String type) {switch (type) {case "console":return new ConsoleLogger();case "file":return new FileLogger();default:throw new IllegalArgumentException("Invalid logger type");}}
}public class Main {public static void main(String[] args) {Logger logger = LoggerFactory.getLogger("console");UserService userService = new UserService(logger);userService.createUser("Charlie");}
}

在这里插入图片描述

二、使用框架实现依赖注入(推荐)

1. Spring 框架
(1) 构造器注入

步骤

  1. 定义接口和实现类。
  2. 使用 @Component 标记组件。
  3. 在目标类中使用 @Autowired 注解注入依赖。

示例

// 定义接口
public interface DatabaseService {String query(String sql);
}// 实现类
@Component
public class MySQLService implements DatabaseService {@Overridepublic String query(String sql) {return "MySQL Result: " + sql;}
}// 目标类
@Component
public class UserService {private final DatabaseService databaseService;// 构造器注入@Autowiredpublic UserService(DatabaseService databaseService) {this.databaseService = databaseService;}public String getUserData() {return databaseService.query("SELECT * FROM users");}
}// 启动类
@SpringBootApplication
public class App {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(App.class, args);UserService userService = context.getBean(UserService.class);System.out.println(userService.getUserData());}
}
(2) Setter 注入
@Component
public class UserService {private DatabaseService databaseService;@Autowiredpublic void setDatabaseService(DatabaseService databaseService) {this.databaseService = databaseService;}
}
(3) 字段注入(不推荐)
@Component
public class UserService {@Autowiredprivate DatabaseService databaseService;
}
2. Google Guice 框架
(1) 绑定依赖

通过模块(Module)绑定接口到实现类:

public class AppModule extends AbstractModule {@Overrideprotected void configure() {bind(DatabaseService.class).to(MySQLService.class);}
}
(2) 注入依赖
public class UserService {private final DatabaseService databaseService;@Injectpublic UserService(DatabaseService databaseService) {this.databaseService = databaseService;}
}// 使用 Guice 创建对象
public class Main {public static void main(String[] args) {Injector injector = Guice.createInjector(new AppModule());UserService userService = injector.getInstance(UserService.class);System.out.println(userService.getUserData());}
}

三、测试环境中的依赖注入

使用 Mockito 注入模拟对象进行单元测试:

public class UserServiceTest {@Testvoid testGetUser() {// 创建模拟依赖DatabaseService mockDb = Mockito.mock(DatabaseService.class);when(mockDb.query(1)).thenReturn("Alice");// 构造目标类并注入依赖UserService userService = new UserService(mockDb);// 执行方法并验证结果assertEquals("Alice", userService.getUser(1).getName());}
}

四、依赖注入的核心模式

模式描述
控制反转(IoC)由容器(如 Spring/IoC 容器)控制对象的创建和管理,而非代码自身控制。
服务定位器通过统一接口(如 ServiceLocator)动态获取依赖对象,常见于手动实现。
依赖倒置高层模块不依赖低层模块,二者都依赖抽象接口(如 Logger 接口)。

在这里插入图片描述

五、最佳实践

  1. 优先构造器注入:确保对象在创建时依赖已满足,避免 NullPointerException
  2. 避免字段注入:破坏封装性,难以追踪依赖来源。
  3. 使用接口抽象:隔离具体实现,提高代码灵活性。
  4. 结合单元测试:通过模拟依赖快速验证功能。

通过以上方式,可以灵活实现依赖注入,降低代码耦合度,提升可维护性和可测试性。


文章转载自:

http://BHvjuaE4.mxxsq.cn
http://HMPhxPZj.mxxsq.cn
http://p5HCZboS.mxxsq.cn
http://uI69ozKv.mxxsq.cn
http://ZmxTpM1p.mxxsq.cn
http://LMNz1zT0.mxxsq.cn
http://yabqGAPh.mxxsq.cn
http://6bBF2H6k.mxxsq.cn
http://6TNkHjgL.mxxsq.cn
http://mMQ6Z4Lq.mxxsq.cn
http://9UvI4JAW.mxxsq.cn
http://i5qoYUrB.mxxsq.cn
http://96lEzPsd.mxxsq.cn
http://orkgRBNo.mxxsq.cn
http://HIMntI0T.mxxsq.cn
http://a7mewLs8.mxxsq.cn
http://teboxdZg.mxxsq.cn
http://f25EHqv5.mxxsq.cn
http://vAvxrkU7.mxxsq.cn
http://k8kWaWVC.mxxsq.cn
http://NeSi7jv4.mxxsq.cn
http://x5MsKsZZ.mxxsq.cn
http://PhRWV1CB.mxxsq.cn
http://bdwnZH5f.mxxsq.cn
http://jjwg8rZ6.mxxsq.cn
http://uju28ugH.mxxsq.cn
http://H92Qgcet.mxxsq.cn
http://Ugd5ypzz.mxxsq.cn
http://p2X4ES0S.mxxsq.cn
http://KIHbUjyb.mxxsq.cn
http://www.dtcms.com/wzjs/717470.html

相关文章:

  • 非交互式网站可以做商城吗icp备案管理系统官网
  • 网站被js植入广告企业服务平台登录
  • 做民宿上几家网站好搭建免费个人网站2022
  • 网站建设必须要服务器么c2c模式发展趋势
  • 我注册了哪些网站吗wordpress无法访问站点
  • 热点链接到另一个网站怎么做南昌营销网站公司哪家好
  • 做网站必须原创吗特种作业证查询
  • 外贸网站建设 惠州手机网站输入框
  • 网站建设中的英文utc+wordpress
  • 购物网站开发背景及意义山东省服务外包网
  • 2018年网站开发语言排行wordpress #
  • 做网站工作好么长春做网站推广
  • 网站建设功能介绍赣州信息港手机版
  • 深圳二次源网站建设seo挂机赚钱
  • 建设网站的企业哪家好大数据营销是做什么的
  • 网站商城建设基本流程北京企业网站推广
  • 湘潭新思维网站上海通信管理局网站
  • 郴州网站seo外包软件公司运营是做什么的
  • 网站建设自查情况报告京津冀协同发展纲要
  • 鞍山网站制作谁家好郑州哪家医院看妇科比较专业
  • 中山移动网站建设报价东城网站建设工作室
  • 网页制作与网站开发从入门到精通 豆瓣网站开发平均工资
  • 帮人做网站赚钱吗wordpress编辑器 下载地址
  • 长安网站建设详细教程太原注册公司在哪个网站申请
  • 石家庄万达网站制作一般门户网站
  • 网站免费正能量链接怎样开电商
  • 镇江网站优化哪家好wordpress弹窗登录
  • 山东网站制作应用app开发公司都有哪些部门
  • 精选网站建立 推广 优化阿里云做视频网站可以吗
  • 影视自助建站电脑制作图片的软件