@Autowiredの使い方と引数を徹底解説!【初心者向け】

こんにちは!今回は、Spring Frameworkで非常によく使われる依存性注入アノテーション、@Autowiredについて詳しく解説します。@Autowiredは、Springアプリケーションの中でオブジェクトの依存関係を自動的に注入するために使われます。

この記事では、@Autowiredの基本的な使い方から応用例までを徹底解説しますので、初心者の方でも安心してお読みください!

@Autowiredとは?

@Autowiredは、
「依存性注入(DI: Dependency Injection)」を実現するためのアノテーションです。

依存性注入とは、クラスが必要とするオブジェクト(依存オブジェクト)を自動的に注入する仕組みのことを指します。

たとえば、あるクラスが別のクラスを使用して処理を行う場合、その別のクラスのインスタンスを手動で生成する代わりに、Springが自動的にそのインスタンスを注入してくれます。

もう少し詳しいDI(依存性注入)について知りたい方はこちら↓↓

基本的な使い方

まずは、@Autowiredを使った基本的な例を見てみましょう。以下のコードでは、UserServiceクラスがUserRepositoryクラスに依存しており、@Autowiredを使ってその依存関係を注入しています。

UserServiceクラス

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void printUserName() {
        System.out.println(userRepository.getUserName());
    }
}

UserRepositoryクラス

@Repository
public class UserRepository {
    public String getUserName() {
        return "John Doe";
    }
}

上記の例は、”John Doe”という文字が出力されるコードです。
@Autowiredを使ってUserRepositoryのインスタンスを自動的に注入しています。
これにより、UserServiceUserRepositoryを明示的に生成する必要がなくなり、依存関係がSpringの管理下に置かれます。

必要なことは、
・DIされる側(依存される側のクラス)とDIする側(依存する側のクラス)がどちらもBeanとしてSpringに登録されていること。
DIする側のクラス内のフィールドに@Autowiredが使われていること。
の2点です!

コンストラクタ注入

@Autowiredはフィールドだけでなく、コンストラクタにも適用できます。コンストラクタ注入は、Spring 4.3以降では最も推奨される注入方法です。以下の例では、コンストラクタを使った依存性注入の方法を示しています。

@Service
public class UserService {

    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

コンストラクタ注入のメリット

  • 不変性: コンストラクタで依存関係を注入するため、UserRepositoryのフィールドがfinalであることが保証されます。これにより、依存関係が途中で変更されることがなく、不変性が保たれます。
  • テストのしやすさ: コンストラクタを通じて依存関係を注入することで、テスト時にモックオブジェクトを簡単に挿入できます。

セッター注入

@Autowiredはセッターメソッドにも使用できます。これはフィールドがprivateであっても、依存関係を動的に変更したい場合に有効です。

@Service
public class UserService {

    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

セッター注入は、後から依存関係を変更したい場合や、オプションで依存関係を注入する場合に有効です。しかし、フィールドの変更ができてしまうため、できるだけコンストラクタ注入を優先することが推奨されます。

@Autowiredの引数

@Autowiredにはいくつかの引数がありますが、特に注目すべきはrequired属性です。

  • required: デフォルト値はtrueで、依存オブジェクトが必ず注入されなければならないことを意味します。falseに設定すると、該当するBeanが存在しない場合でもエラーが発生しません。たとえば、オプションの依存性として設定したい場合に使用します。
@Autowired(required = false)
private Optional<UserRepository> userRepository;

この例では、UserRepositoryのBeanが見つからなかった場合でもエラーは発生しません。

複数のBeanがある場合

@Autowiredを使う際、インターフェースやクラスが複数の実装を持っている場合、Springはどの実装を注入すべきかを自動的に判断できないことがあります。このような場合は、@Qualifierアノテーションを併用して、注入する具体的なBeanを指定することができます。

@Service
public class UserService {

    private final UserRepository userRepository;

    @Autowired
    public UserService(@Qualifier("specificUserRepository") UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

自作Beanの注入

@Autowiredは、Springの管理外にあるカスタムオブジェクトを注入することもできます。たとえば、以下のように@Beanを使って自作のBeanを定義し、@Autowiredで注入します。

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
@Service
public class UserService {

    @Autowired
    private MyService myService;

    public void performService() {
        myService.execute();
    }
}

おわりに

@Autowiredを使うことで、依存性注入が簡単に実装できます。特にコンストラクタ注入は推奨される方法であり、コードの可読性やテストのしやすさが向上します。また、required属性や@Qualifierを適切に使用することで、複雑な依存関係も柔軟に管理できます。

Springを使っている場合、@Autowiredは非常に重要なアノテーションですので、ぜひ覚えておきましょう!

もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。

他の記事が見たい方はこちら!↓↓↓

タイトルとURLをコピーしました