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 withfinal
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.