Post

4 ways to inject dependency and Lombok

βœ… 4 Ways to inject dependency

  • constructor
  • setter
  • field
  • method

πŸ’‘Constructor dependency injection

  • πŸ‘πŸ» recommended
  • Injected at the moment when object is created with constuctor
  • πŸ‘πŸ» only called once, never can be changed again
  • dependency cannot be changed at runtime
  • πŸ‘πŸ» used for final, immutable
  • dependency is required
  • @Autowired can be ommited if there is only one constuctor
1
2
3
4
5
6
7
8
9
10
@Component
public class OrderServiceImpl implements OrderService {
    private final MemberRepository repository; //final, immutable
    private final DiscountPolicy discountPolicy;

    @Autowired //constuctor dependency injection
    public OrderServiceImpl(MemberRepository repository, DiscountPolicy  discountPolicy) {
        this.repository = repository;
        this.discountPolicy = discountPolicy;
    }

πŸ’‘ Setter dependency injection

  • when injecting dependency should be changeable
  • used for mutable, more flexible
  • dependency is not necessarily required
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component
public class OrderServiceImpl implements OrderService {
    private  MemberRepository repository; //mutable
    private  DiscountPolicy discountPolicy;

    @Autowired
    public void setRepository(MemberRepository repository) {
        this.repository = repository;
    }

    @Autowired(required = false) //dependency is not necessarily required
    public void setDiscountPolicy(DiscountPolicy discountPolicy) {
        this.discountPolicy = discountPolicy;
    }

πŸ’‘ Field dependency injection

  • ⚠️ not recommended
  • dependency injected directed into class field
  • code looks very simple
  • πŸ‘ŽπŸ» however, field cannot be changed from outside this class
  • πŸ‘ŽπŸ» difficult to write test code
  • πŸ‘ŽπŸ» cannot use final
1
2
3
4
5
6
@Component
public class OrderServiceImpl implements OrderService {

    @Autowired private  MemberRepository repository;
    @Autowired private  DiscountPolicy discountPolicy;
}

πŸ’‘ Method dependency injection

  • ⚠️ not used frequently
  • dependency is passed as parameter
  • used when dependency is only needed temporarily

βœ… Lombok

  • annotation을 ν†΅ν•΄μ„œ μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ€€λ‹€.
  • constructor, getter, setter, toString λ“±λ₯Ό μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ€€λ‹€

  • πŸ‘ŽπŸ» DI with constructor before using Lombok
1
2
3
4
5
6
7
8
9
10
11
@Component
public class OrderServiceImpl implements OrderService {
    private final MemberRepository repository;
    private final DiscountPolicy discountPolicy;

    //needed to code constructor
    public OrderServiceImpl(MemberRepository repository, DiscountPolicy discountPolicy) {
        this.repository = repository;
        this.discountPolicy = discountPolicy;
    }
}
  • πŸ‘πŸ» DI with constructor with Lombok
  • @RequiredArgsConstructor: create constructor with final fields
1
2
3
4
5
6
@Component
@RequiredArgsConstructor //lombok creates constructor
public class OrderServiceImpl implements OrderService {
    private final MemberRepository repository;
    private final DiscountPolicy discountPolicy;
}

βœ…

βœ…

βœ…

βœ…

βœ…

βœ…

βœ…

βœ…

This post is licensed under CC BY 4.0 by the author.