본문 바로가기

웹 프로그래밍/Spring

[Spring] DI 실습(6) : Annotation을 이용한 JAVA 주입

xml을 사용하지 않고도 가능하다.

 

 

di.java 패키지 관련

==> 김혜주 동기님 필기 참조하여 복습 필수.

 

Car.java

package di.java;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

// @Component("car") ==> getBean("car")
@Component // 디폴트가 클래스의 소문자이다. 즉. 이렇게만 해도 getBean("car") 으로 접근할 수 있다.
public class Car {

	
	@Autowired
	@Qualifier("kumho") 
	private Tier tier; // 의존관계 발생

	public Car() {
		System.out.println("Car() 호출...");
	}

	public Car(Tier tier) {
		this.tier = tier;
		System.out.println("Car(Tier) 호출...");
	}

	public void setTier(Tier tier) {
		this.tier = tier;
		System.out.println("setTier(Tier) 호출...");
	}

	public void prnTierBrand() {
		System.out.println("장착된 타이어 : " + tier.getBrand());
	}
}

 

 

Config.java

package di.java;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/*
 
	xml 안쓰고도 빈(bean) 객체를 생성하고자 했다.
	그래서 나온 것이 다음 두 어노테이션 활용하는 방법@Configuration, @Bean 
	이것도 귀찮다 해서 나온 것이 @ComponentScan(basePackages = {"di.java"}) ==> 해당 패키지에 있는 모든 클래스의 인스턴스를 자동으로 만들어준다. 
	
 */

@ComponentScan(basePackages = {"di.java"}) // 아래 패키지에 있는 모든 클래스의 인스턴스르 생성해라
@Configuration // xml 기능을 대체하는 어노테이션. 
public class Config {

	/*
	//@Bean(name="car")
	@Bean
	public Car car() {
		return new Car();
	}

	
	@Bean // => <bean class = "di.java.HankookTier" id = "hankookTier"/> 와 같은 의미다.
	@Qualifier("hankook")
	public Tier hankookTier() {
	//public String aaa() {  메소드명은 상관 없다.
		return new HankookTier();
	}
	
	@Bean(name = "kumho")
	public Tier kumhoTier() {
		return new KumhoTier();
	}
	
	//	@Bean(name = "kumho")
	// 위와 아래 똑같은 기능이다.
	// @Bean 
	// @Qualifier("kumho")
	*/
}

 

DriverMain.java

package di.java;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.stereotype.Component;

public class DriverMain {

	public static void main(String[] args) {
		
		ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); // 어노테이션으로 구성된 config 파일을 읽어서 컨테이너에 담겠다. 인자로는 해당 클래스.class를 넣으면 됨.
		
		Car car = context.getBean("car", Car.class); 
		// xml에서 클래스의 id를 지정했었다. 그런데, 
		// @ComponentScan(basePackages = {"di.java"}) 으로 자동으로 객체를 생성했다면, id는 클래스의 첫글자를 소문자로 바꾼 문자가 된다.
		// 그런데, 각 클래스에서 @Component("hankook") 이런식으로 id를 지정할 수도 있다.
		
		car.prnTierBrand();
		
	}
}

HankookTier.java

package di.java;

import org.springframework.stereotype.Component;

// @Component 이렇게만 해도 사실 밑과 똑같은 기능을 한다. getBean("hankook")
@Component("hankook")
public class HankookTier implements Tier {

	public HankookTier() {
		System.out.println("한국타이어 생성자 호출...");
	}

	public String getBrand() {
		return "한국타이어";
	}
}

KumhoTier.java

package di.java;

import org.springframework.stereotype.Component;

@Component("kumho")
public class KumhoTier implements Tier {

	public KumhoTier() {
		System.out.println("금호타이어 생성자 호출...");
	}
	
	public String getBrand() {
		return "금호타이어";
	}

}

 

Tier.java

package di.java;

public interface Tier {

	public String getBrand();
		
}