2018년 4월 3일 화요일

패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 9일차(SPRING)

  • 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은 스프링이 제공해주는것이 아니다.(컨테이너들의 스펙 표준에 의해 만들어짐)
  • 컨테이너의 스펙 표준
    • JSR-250
  • @Configuration
    • 설정파일임을 명시 해주는 것이다.
  • DI 부분 소스보고 알수있도록 공부
Share:

0 개의 댓글:

댓글 쓰기