Autowired란?
빈에서 다른 빈의 의존성을 주입하는것이다.
즉, A bean이 B bean을 사용하려면 @Autowired해준다.
Autowired된 bean을 먼저 생성한다. 생각해보면 먼저 생성되어있어야 사용할 수 있다.
@Component
public class BookServiceRunner implements ApplicationRunner {
//BookService를 사용한다.
@Autowired
BookService bookService;
public void run(ApplicationArguments args) throws Exception{
bookService.printBookRepository();
}
}
기본적으로는 Autowired를 사용하면 의존성이 있어야하므로 bean으로 등록되어있어야한다.
필드,setter에선 (required = false) 으로 의존성을 강제하지 않을 수 있다.
필드에 사용하는것과 생성자에 사용하는건 약간다르다.
//BookService를 사용한다.
//의존성 강제 설정해체
@Autowired (required = false)
BookService bookService;
또 repository가 여러개일 경우 충돌이 난다.
이럴땐 @Primary나 @Qualifier("huBookRepository")로 강제해주어야한다.
Primary형식
//Primary형식
@Repository @Primary
public class MyBookRepository implements BookRepository {
@Override
@PostConstruct
public void setUp() {
System.out.println("MyBookRepository");
}
}
Qualifier형식
//Qualifier형식
@Autowired @Qualifier("myBookRepository")
BookRepository bookRepository;
아니면 모두 사용하고 싶을 경우 LIst형식으로 받을 수 있다.
@Autowired
List<BookRepository> bookRepository;
LOG를 찍어보게되면 BookRepository를 implements한 클래스가 모두 나온다
@Service
public class BookService {
@Autowired
List<BookRepository> bookRepository;
public void printBookRepository(){
this.bookRepository.forEach(System.out::println);
System.out.println(bookRepository.getClass());
}
}
인스턴스 생성될때 동작하기
@Repository
public class MyBookRepository extends TestExtends implements BookRepository {
@Override
@PostConstruct
public void setUp() {
System.out.println("MyBookRepository");
}
}
@Component와 컴포넌트 스캔
Component는 스프링 3.1부터 적용되었다.
@Component를 사용할 경우 IOC컨테이너에 bean으로 등록한다.
@Service,@Repository,@Controller등 여러가지 애노테이션엔
@Component가 포함되어있다.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component //Service에 등록되어있는 Component
public @interface Service {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
ComponentScan
여러가지 bean들을 검색하고 IOC컨테이너에 적재한다.
스프링부트에선 @SpringBootApplication가 시작지점이 된다.
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
SpringBootApplication 내부 모습
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@SpringBootApplication 이하의 모든 클래스가 @ComponentScan
(basePackages,basePackageClasses)에 의해 컴포넌트 스캔이된다.
만약 개발할때 bean주입이 안되면 컴포넌트 스캔위치를 살펴봐야한다.
모든걸 bean으로 등록하는것이 아니라 필터로 걸러낼 수 있다.
또, 빈을 다등록하는게 부담된다면 펑션으로 특정빈만 등록할 수 있다.
'개발 소발 > 개발 Spring' 카테고리의 다른 글
Spring Environment 기초 사용방법 (0) | 2020.07.13 |
---|---|
Spring Scope란? (0) | 2020.07.13 |
AOP란? AOP 기초개념 (0) | 2020.07.09 |
Spring IoC(Inversion of Control),Bean,의존성주입이란? (0) | 2020.07.08 |
프레임워크 개념 (0) | 2018.01.26 |