• AnnotationConfigApplicationContext
    • @Configuration
    • @ComponentScan
    • @Component
    • @Autowired

     xml 설정을 대체할 수 있는 Java Config

    Java Config란 말그대로 자바 클래스 파일을 설정 파일로 사용을 하겠다는 것이다.

    xml설정과 비교해서 Java Config를 사용하는 이유는, 클래스의 경우 이클립스나 인텔리J와 같은 IDE에서 오타 등을 발견하기 쉽고, 자동완성등을 지원하기 때문에 편리하기 때문이다.

     

    스프링에서는 Java Config로 사용하는 클래스에는 @Configuration이라는 어노테이션을 붙여서 표시를 한다.

     

    어노테이션이란 본래 주석이란 으로, 인터페이스를 기반으로 한 문법이다. 주석과는 그 역할이 다르지만 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입할 수 있다. 또 해석되는 시점을 정할 수도 있다.

     

    @Bean 은 직접 생성해서 클래스를 관리

    @ComponentScan 어노테이션 (각각의 빈에 붙이는 실제 객체가 하는 일이 뭔지에따라 다르게 붙여줌) 해당 객체들을 읽어내서 메모리에 올리고 Di를 주입

     

    @Configuration

    • 스프링 설정 클래스를 선언하는 어노테이션

    @Bean

    • bean을 정의하는 어노테이션

    @ComponentScan

    • @Controller, @Service, @Repository, @Component 어노테이션이 붙은 클래스를 찾아 컨테이너에 등록

    @Component

    • 컴포넌트 스캔의 대상이 되는 애노테이션 중 하나로써 주로 유틸, 기타 지원 클래스에 붙이는 어노테이션

    @Autowired

    • 주입 대상이되는 bean을 컨테이너에 찾아 주입하는 어노테이션

    Java Config를 이용해 설정하기

    ApplicationConfig.java

    package kr.or.connect.diexam01;
    import org.springframework.context.annotation.*;
    
    @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();
    	}
    }

    @Configuration 은 스프링 설정 클래스라는 의미를 가진다.

    JavaConfig로 설정을 할 클래스 위에는 @Configuration가 붙어 있어야 한다.

    ApplicationContext중에서 AnnotationConfigApplicationContext는 JavaConfig클래스를 읽어들여 IoC와 DI를 적용하게 됩니다.

    이때 설정파일 중에 @Bean이 붙어 있는 메소드들을 AnnotationConfigApplicationContext는 자동으로 실행하여 그 결과로 리턴하는 객체들을 기본적으로 싱글턴으로 관리를 하게 됩니다.

     

    ApplicationContextExam03.java

    package kr.or.connect.diexam01;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class ApplicationContextExam03 {
    
    	public static void main(String[] args) {
    		ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
    		   
    		Car car = (Car)ac.getBean("car");
    		car.run();
    		
    	}
    }

    파라미터로 요청하는 class 타입으로 지정 가능하다.

    Car car = ac.getBean(Car.class);

    -----------------------------------------------------------------------------------------------------------------------------------

    @ComponentScan어노테이션 사용하기

    ApplicationConfig2.java

    package kr.or.connect.diexam01;
    import org.springframework.context.annotation.*;
    
    @Configuration
    @ComponentScan("kr.or.connect.diexam01")
    public class ApplicationConfig2 {
    }

    기존 JavaConfig에서 빈을 생성하는 메소드를 모두 제거했다..

    단, @Configuration아래에 @ComponentScan이라는 어노테이션을 추가하였다.

    @ComponentScan어노테이션은 파라미터로 들어온 패키지 이하에서 @Controller, @Service, @Repository, @Component 어노테이션이 붙어 있는 클래스를 찾아 메모리에 몽땅 올려준다.

    기존의 Car클래스와 Engine클래스 위에 @Component를 붙이도록 하겠다.

     

    Engine.java

    package kr.or.connect.diexam01;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Engine {
    	public Engine() {
    		System.out.println("Engine 생성자");
    	}
    	
    	public void exec() {
    		System.out.println("엔진이 동작합니다.");
    	}
    }

    Car.java

    package kr.or.connect.diexam01;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Car {
    	@Autowired
    	private Engine v8;
    	
    	public Car() {
    		System.out.println("Car 생성자");
    	}
    	
    	public void run() {
    		System.out.println("엔진을 이용하여 달립니다.");
    		v8.exec();
    	}
    }

     

    수정된 JavaConfig를 읽어들이여 실행하는 클래스

    ApplicationContextExam04.java

    package kr.or.connect.diexam01;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class ApplicationContextExam04 {
    
    	public static void main(String[] args) {
    		ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig2.class);
    		   
    		Car car = ac.getBean(Car.class);
    		car.run();
    		
    	}
    }

    .Spring에서 사용하기에 알맞게 @Controller, @Service, @Repository, @Component 어노테이션이 붙어 있는 객체들은 ComponentScan을 이용해서 읽어들여 메모리에 올리고 DI를 주입하도록 하고, 이러한 어노테이션이 붙어 있지 않은 객체는 @Bean어노테이션을 이용하여 직접 생성해주는 방식으로 클래스들을 관리하면 편리하다.

    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기
    loading