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.