728x90
Annotation : 코드파일에 설정을 심을때 사용되는 설정 정보

 

xml하단 메뉴탭 Namespaces클릭 후 context 체크

 

OK

 

다시 Source로가서 추가된 열 확인 후 <context:annotation-config>태그 추가

 <context:annotation-config> : 객체를 만들면서 그 안에 어노테이션(annotation)이 있는지 확인

 


@Autowired : 자동으로 객체 연결 

id와 관계 없이 인터페이스명(아래 예제에서 Exam)으로 참조할 수 있는 객체를 자동으로 찾아서 바인딩 

@Autowired
@Override
public void setExam(Exam exam) {
	this.exam = exam;
}
  • spring.di.ui.InlineExamConsole.java파일 setExam메소드 위에 @Autowired 추가 (import)
    @Autowired : 자동으로 객체 연결 (xml파일의 <property name="exam" ref="exam"/>과 같음)
<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" />
<bean id="console" class="spring.di.ui.InlineExamConsole" >
	<!-- <property name="exam" ref="exam"/> -->
</bean>
  • xml파일 <property name="exam" ref="exam"/> 삭제

@Qualifier : 다수의 사용할 수 있는 객체가 있는 경우 id를 지정하여 연결

@Autowired
@Qualifier("exam1")
@Override
public void setExam(Exam exam) {
	this.exam = exam;
}
  • @Autowired 아래에 @Qualifier 추가 (import)
    exam1과 바인딩
<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" />
<bean id="exam2" class="spring.di.entity.NewlecExam" p:kor="20" p:eng="20" />
<bean id="console" class="spring.di.ui.InlineExamConsole" >
</bean>

[실행결과]

total is 20, avg is 5.000000

 


@Autowired의 위치

@Autowired는 setter위 뿐만 아닌 오버로드생성자 위, 필드 위에서도 사용 가능하다

1.기본생성자에서 객체를 바인딩

public class InlineExamConsole implements ExamConsole {

	@Autowired
 	@Qualifier("exam2")   
	private Exam exam;
    
	public InlineExamConsole() {
	}    
	
	public InlineExamConsole(Exam exam) {
		this.exam = exam;
	}

//	@Autowired
//	@Qualifier("exam2")
	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}

※ 기본 생성자가 없고 오버로드 생성자만 있는 경우 인젝션이 되지 않지만,

    기본 생성자도 없고 오버로드 생성자도 없는 경우 컴파일러가 기본 생성자를 자동으로 만들어 주기 때문에 가능하다.

 

ex)

public class InlineExamConsole implements ExamConsole {

	@Autowired
 	@Qualifier("exam2")   
	private Exam exam;
    
//	public InlineExamConsole() {
//	}    
	
	public InlineExamConsole(Exam exam) {
		this.exam = exam;
	}

	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}
  • error
public class InlineExamConsole implements ExamConsole {

	@Autowired
 	@Qualifier("exam2")   
	private Exam exam;
    
//	public InlineExamConsole() {
//	}    
	
//	public InlineExamConsole(Exam exam) {
//		this.exam = exam;
//	}

	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}
  • 기본생성자를 컴파일러가 자동으로 생성

2. overload에서 객체를 바인딩

public class InlineExamConsole implements ExamConsole {

	private Exam exam;
    
	public InlineExamConsole() {
	}    
	
	@Autowired
	@Qualifier("exam2")    
	public InlineExamConsole(Exam exam) {
		this.exam = exam;
	}

//	@Autowired
//	@Qualifier("exam2")
	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}

※overload생성자에서는 다수의 Exam이 들어갈 수 있기 때문에

   @Qualifier를 각자 지정할 수 있게끔 파라미터에 설정해준다.

 

ex)

public class InlineExamConsole implements ExamConsole {

	private Exam exam;
    
	public InlineExamConsole() {
	}    
	
	@Autowired
//	@Qualifier("exam2")      
	public InlineExamConsole(@Qualifier("exam2")Exam exam) {
		this.exam = exam;
	}

	@Override
	public void setExam(Exam exam) {
		this.exam = exam;
	}
}

 


@Autowired(required = false) : xml에 객체가 없더라도 실행

<!-- <bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" /> -->
<!-- <bean id="exam2" class="spring.di.entity.NewlecExam" p:kor="20" p:eng="20" /> -->
<bean id="console" class="spring.di.ui.InlineExamConsole" >
</bean>
@Autowired(required = false)
@Qualifier("exam2")
private Exam exam;
    
@Override
public void print() {
	if(exam == null)
		System.out.printf("total is %d, avg is %f\n", 0, 0.0);
	else
		System.out.printf("total is %d, avg is %f\n", exam.total(), exam.avg());
}
  • xml파일의 exam1, exam2객체를 지운 후InlineExamConsole.java파일의 @Autowired에 (required = false)옵션 추가

[실행결과]

total is 0, avg is 0.000000

 


@Component : IoC 컨테이너에 스프링 빈으로 등록 

  •  xml에 <context:component-scan base-package="패키지명"/> 추가 필요
    (쉼표(,)를 사용해 다수의 패키지명 추가 가능)
    : 해당 패키지명 안에 있는 클래스를 스캔해서 컴퍼넌트가 있다면 객체화 시켜준다
    ※ <context:annotation-config /> 태그는 필요가 없어진다
  • 용도에 따라 주로 @Controller, @Service, @Repository로 사용한다

 

@Component("console")
  • xml 파일 <bean id="console"> 태그의 id와 같이 이름을 "console"로 지정

@Value : 기본 값 설정

@Component
public class NewlecExam implements Exam {

	@Value("20")
	private int kor;
	@Value("30")
	private int eng;
	private int math;
	private int com;

xml파일의 내용을 어노테이션을 통해 자바에 설정하기

<beans xmlns="http://www.springframework.org/schema/beans" ...>
	<context:component-scan base-package="spring.di.ui, spring.di.entity" />
	<bean id="exam" class="spring.di.entity.NewlecExam" />
@ComponentScan("spring.di.ui")
@Configuration
public class NewlecDIConfig {
	
	@Bean
	public Exam exam() {	//id="exam"
		return new NewlecExam();
	}
}
  • @ComponentScan : 해당 패키지명 안에 있는 클래스를 스캔해서 컴퍼넌트가 있다면 객체화 시켜준다
    @Configuration : 스프링 컨테이너를 만드는 데에 사용
    @Bean : 컨테이너에 담는 데에 사용
ApplicationContext context = 
	new AnnotationConfigApplicationContext(NewlecDIConfig.class);
//	new ClassPathXmlApplicationContext("spring/di/setting.xml");
  • Program.java파일 내 ApplicationContext 수정
    : AnotationConfigApplicationContext을 통해 클래스를 대입

+ Recent posts