如何在Java中使用构造器注入和setter注入初始化对象

构造器注入通过构造函数传入依赖,确保对象创建时依赖完整,适合必需依赖;Setter注入通过setter方法设置依赖,灵活支持可选或可变依赖。示例中UserService通过构造器或setter注入UserRepository,分别实现不可变和可变依赖管理。实际开发推荐优先使用构造器注入保证对象完整性,Setter注入用于可选场景,Spring等框架均支持,合理选择可提升代码可维护性与可测试性。

在Java中,依赖注入(Dependency Injection, DI)是一种常用的设计模式,用于实现控制反转(IoC),提升代码的可测试性和可维护性。最常见的两种注入方式是构造器注入Setter注入。下面介绍如何使用这两种方式初始化对象。

构造器注入(Constructor Injection)

构造器注入通过类的构造函数传入依赖对象,确保对象创建时所需依赖必须提供,有助于构建不可变且完整的对象。

特点: 依赖不可变、强制依赖明确、适合必需依赖。

示例:

假设有一个UserService类,它依赖于UserRepository

class UserRepository {
    public void save(String user) {
        System.out.println("保存用户: " + user);
    }
}

class UserService {
    private final UserRepository userRepository;

    // 构造器注入
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void addUser(String name) {
        userRepository.save(name);
    }
}

使用时直接通过构造器传入依赖:

```java UserRepository repo = new UserRepository(); UserService service = new UserService(repo); // 注入依赖 service.addUser("Alice"); ```

Setter注入(Set

ter Injection)

Setter注入通过setter方法设置依赖,对象创建后可以动态更改依赖关系。

特点: 灵活、支持可选依赖、适合后期修改依赖的场景。

示例:

同样是上面的类,改为使用setter方式注入:

class UserService {
    private UserRepository userRepository;

    // Setter注入
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void addUser(String name) {
        if (userRepository == null) {
            throw new IllegalStateException("UserRepository 未初始化");
        }
        userRepository.save(name);
    }
}

使用时先创建对象,再通过setter设置依赖:

```java UserService service = new UserService(); service.setUserRepository(new UserRepository()); // 注入依赖 service.addUser("Bob"); ```

如何选择?

实际开发中,应根据需求选择合适的注入方式:

  • 优先使用构造器注入处理必需依赖,保证对象状态完整。
  • 使用Setter注入处理可选依赖或允许运行时更换依赖的场景。
  • 在Spring等框架中,两者都支持,但现代推荐以构造器注入为主。

基本上就这些。合理使用构造器和setter注入,能让代码更清晰、更易管理。