Java config를 이용한 설정을 위한 어노테이션
- @Configuration : 스프링 설정 클래스를 선언하는 어노테이션
- @Bean : bean을 정의하는 어노테이션
- @ComponentScan : @Controller, @Service, @Repository, @Component 어노테이션이 붙은 클래스를 찾아 컨테이너에 등록
- @Component : 컴포넌트 스캔의 대상이 되는 어노테이션 중 하나로써 주로 유틸, 기타 지원 클래스에 붙이는 어노테이션
- @Autowired : 주입 대상이 되는 bean을 컨테이너에 찾아 주입하는 어노테이션
Java Config를 이용해 설정하기(1)
ApplicationConfig.java
@Configuration
public class ApplicationConfig {
@Bean
public Car car(Engine e) {
Car c = new Car();
c.setEngine(e);
return c;
}
@Bean
public Engine engine() {
return new Engine();
}
}
- aplicationContext는 파라미터를 받아들이지 않는 빈 생성 메서드를 먼저 실행해서 반환받은 객체를 관리한다.
- 그 후 파라미터에 생성된 객체들과 같은 타입이 있는 객체가 있을 경우에 파라미터로 전달해서 객체를 생성한다.
- 어노테이션을 더 활용하면 이런 설정을 더 간단하게 할 수 있다.
@Configuration
- jdk 5부터 지원한다. 사전적인 의미는 주석이지만 자바 어노테이션은 특수한 의미를 부여하는 역할 수행한다.
- 이런 특수한 의미는 컴파일 시 혹은 런타임 시 해석된다.
- configuration어노테이션은 spring 설정 클래스라는 의미를 가진다.
- ApplicationContext중에서 AnnotationConfigApplicationContext는 JavaConfig클래스를 읽어들여 IoC와 DI를 적용한다.
- @Bean이 붙어있는 메소드들을 AnnotationConfigApplicationContext는 자동으로 실행해서 그 결과로 리턴하는 객체들을 기본적으로 싱글톤으로 관리하게 해준다.
ApplicationContextExam03.java
public class ApplicationContextExam03 {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Car car = (Car) ac.getBean(Car.class);
car.run();
}
}
Java Config를 이용해 설정하기(2)
ApplicationConfig2.java
@Configuration
@ComponentScan("kr.or.connect.diexam01")
public class ApplicationConfig2 {
}
- 기존 JavaConfig에서 빈을 생성하는 메소드를 모두 제거했다.
- ComponentScan을 달고 기존의 Car 클래스와 Engine 클래스 위에 @Component를 붙여주면 같은 기능을 한다.
@ComponentScan
- 알아서 너가 여기에 있는거 읽어들여서 지정하라는 말이다. 광범위하기 때문에 반드시 스캔을 할 정확한 패키지명을 기입해야한다.
- 스캔은 기본적으로 클래스 이름의 첫글자를 소문자로 바꾼 이름을 기본으로 한다.
Car.java
@Component
public class Car {
@Autowired
private Engine v8;
public Car() {
System.out.println("Car 생성자");
}
public void run() {
System.out.println("엔진을 이용하여 달립니다.");
v8.exec();
}
}
- @AutoWired는 엔진 타입의 객체가 생성된 것이 있으면 여기에 주입해주기 때문에 setter 메소드가 필요없다.
- Engine.java에도 @Component를 붙여준다.
ApplicationContextExam04.java
public class ApplicationContextExam04 {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig2.class);
Car car = (Car) ac.getBean(Car.class);
car.run();
}
}
- exam3과 같은 코드이다.
- spring에서 사용하기 알맞게 @Controller, @Service, @Repository, @Component 어노테이션이 붙어 있는 객체들은 ComponentScan을 이용해서 읽어들여 메모리에 올리고 DI를 주입하도록 한다.
- 이런 어노테이션이 붙어있지 않은 객체는 @Bean어노테이션을 이용하여 직접 생성해주는 방식으로 클래스들을 관리하면 편하다.
componentScan을 사용하면 편한데, bean을 등록하는 방법을 배운 이유
- componentScan은 약속된 어노테이션이 붙어있는 것만 가져온다. 나중에 spring JDBC를 쓴다던가 다른 라이브러리가 가지고 있는 객체를 사용하는 등의 상황에는 우리가 그 라이브러리를 열어서 어노테이션을 붙일 수 없다.
- 그럴 때 bean을 등록하는 방법을 이용해서 해당 bean을 등록하면 편리하게 쓸 수 있다.
Cannot load configuration class 관련 오류