- Annotation
- AnnotationConfigApplicationContext
- @Configuration, @Bean이 선언이 되어있는 부분 읽어서 빈을 생성해준다.
- @bean 설정에서 객체를 new 객체() 로 넘겼을때 알아야 할 내용
- class가 그대로 쓰이는게 아니고 reflection proxy , cgLIB 에 의해 컨트롤 된다.
- 아래와 소스를보고 mydisc == disc 의 객체가 일치하는지 예측해보자.
package soundsystem;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringExam02 {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(CDPlayerConfig2.class);
CompactDisc mydisc = context.getBean("myDisc", CompactDisc.class);
CDPlayer cdPlayer = context.getBean(CDPlayer.class);
CompactDisc disc = cdPlayer.getCompactDisc();
if(mydisc == disc){
System.out.println("myDisc == disc");
}else{
System.out.println("myDisc =! disc");
}
}
}
package soundsystem;
public class CDPlayer implements MediaPlayer {
private CompactDisc cd;
public CDPlayer(CompactDisc cd) {
System.out.println("CDPlayer(CompactDisc) 호출");
this.cd = cd;
}
public CompactDisc getCompactDisc() {
return cd;
}
public void play() {
cd.play();
}
}
package soundsystem;
public interface MediaPlayer {
void play();
}
package soundsystem;
public interface CompactDisc {
void play();
}
package soundsystem;
public class MyDisc implements CompactDisc{
public MyDisc(){
System.out.println("MyDisc 호출!!!");
}
@Override
public void play() {
System.out.println("MyDisc!!!");
}
}
package soundsystem;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//java config 클래스에는 @Configuration 이 클래스위에 있어야 한다.
@Configuration
public class CDPlayerConfig2 {
// Bean을 생성하는 메소드는 예를 들어 myDisc()는 2번째 호출될 경우에는 이미 생성된 MyDisc()를 리턴한다.
@Bean
public CDPlayer cdPlayer() {
System.out.println("cdPlayer() 호출");
return new CDPlayer(myDisc());
}
//메소드 이름이 id가 된다. 메소드 이름이 중복되면 id가 중복된다는 의미기때문에 안된다.
//
// Bean 생성을 하는 메소드는 @Bean이 붙어야 한다.
@Bean
public CompactDisc compactDisc() {
System.out.println("compactDisc() 호출");
return new SgtPeppers();
}
@Bean
public CompactDisc myDisc(){
System.out.println("-----------------------");
System.out.println(getClass().getName());
System.out.println("myDisc() 호출");
System.out.println("-----------------------");
return new MyDisc();
}
}
- @Qualifier(메소드명)
- 메소드가 2개 이상일 경우 어노테이션이 우선순위를 가진다.
- @Scope("prototype")
- get Bean할때마다 새로운 객체가 호출된다.
- @ContextConfiguration(classes=클래스명.class)
- classes에 선언된 클래스의 bean들을 등록한다.
- 레이어드 아키텍처(Layered architecture)
- 중복된 화면 및 소스를 활용하기 위해서 3단계로 나눠서 구현한다.
- @Controller -> @Service -> @Repository
- @Component
- 프리젠테이션 레이어 - 비지니스 레이어(메소드:트랜잭션단위) - 데이터 레이어
(Controlller / Service / Repository, DAO)
- presentation layer - business layer - persistence layer - Database layer
- 어디에도 속하지 않는 레이어는 Component라고 부른다.(persistence layer)
- @ComponentScan
- 패키지 설정이 안되어있으면 현재 선언된 파일있는 패키지 기준 이하에서 @Controller, @Service , @Repository @Component 가 설정된 부분을 다 찾아서 메모리에 올린다.
- @Autowried
- 해당 타입의 객체를 찾아서 자동으로 대입해준다.
- 기본생성자가 없을 경우 스프링은 최대한 파라미터에 값을 넣어서 인스턴스 생성을 하려고 노력한다. Spring 4.1부터는 생성자에 @Autowried를 안붙여도, 자동으로 주입을 한다.
- @Autowried @Qualifier("이름") 는 @Resource(name = "이름") 와 똑같이 작동한다.
- @Resource은 스프링이 제공해주는것이 아니다.(컨테이너들의 스펙 표준에 의해 만들어짐)
0 개의 댓글:
댓글 쓰기