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을 통해 클래스를 대입
'spring' 카테고리의 다른 글
Collection 생성 (0) | 2021.08.30 |
---|---|
DI 지시서 작성하기 (property, constructor-arg) (0) | 2021.08.29 |
Maven Repository 라이브러리 가져오기 (0) | 2021.08.29 |
ApplicationContext의 종류 (0) | 2021.08.29 |
스프링 플러그인 설치하기, 파일추가하기 (0) | 2021.08.26 |