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();
}
'웹 프로그래밍 > Spring' 카테고리의 다른 글
[Spring] Maven 프로젝트 groupId, artifactId, version 이란? (0) | 2020.08.21 |
---|---|
[Spring] Spring-MVC 설정 (0) | 2020.08.19 |
[Spring] DI 실습(5) : Annotation을 이용한 SPRING 자동 주입-2 (0) | 2020.08.14 |
[Spring] DI 실습(4) :Dependency 응용, 집합객체 설정 : list, map (0) | 2020.08.14 |
[Spring] DI 생성자 주입 <constructor-arg>, 속성 주입(세터 주입) <property> 분석 (0) | 2020.08.14 |