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.