SPRING

DI Java Code

nang. 2019. 3. 27. 22:34
반응형
SMALL

- xml 파일을 자바 클래스로 나타낸 것

- xml 방식의 문제점을 자바 코드 방식이 해결

 

★ @Configuration

- 클래스명 위에다가

- 이게 붙으면 이 클래스를 bean 설정 정보 파일로 사용할거야~

- 그니까 xml 같은거지~

- <context:component-scan base-package="~~" /> 이것도 필요 없음

 

  • 메인 에서

ApplicationContext context = 

new AnnotationConfigApplicationContext(SpringConfig.class);

SpringIdol springIdol = context.getBean("springIdol", SpringIdol.class);

SpringIdol.run();

===> @Configuration을 붙인 클래스가 설정 파일이니까 그 클래스를 파라미터에 넣어줌

===> 그러면 똑같이 getBean 메소드 사용 가능

 

 

  • 일부는 자바코드 일부는 xml에서 하고 싶을 때 xml 에서

1) @Configuration이 붙은 class를 직접 bean으로 등록한다.

<context:annotation-config /> 

<bean class="~~.SpringConfig" />

 

2) <context:component-scan base-package="~~" /> 써준다.

다 스캔하니까.

 

 

  • xml에 정의된 객체를 자바 클래스에 주입하고 싶을 때(@Configuration이 붙은 class에서 XML 설정 정보를 사용하고 싶을 때)

@ImportResource("classpath:/nang.xml") 사용

- 지정된 xml 파일을 참조함

- 클래스명 앞에 @Configuration 밑에 붙이기

- 필드에 @Autowired 붙여서 씀

- 즉, @Autowired + 멤버변수

- xml에 등록된 bean 타입에 따라 주입(@Autowired default가 byType이니까)

- 타입이 같으면 id가 달라도 자동으로 주입

 

 

  • 여러개의 @Configuration이 붙은 class 사용하고 싶을 때

1) @Autowired 이용 (@Configuration이 붙은 class를 찾음)

- @Autowired를 붙여서 같은 타입을 가진 클래스를 주입시킴

: 만약에 @Configuration이 붙은 A 클래스에 클래스 B 타입의 필드를 정의했는데 여기 위에다가 @Autowired를 붙이면

그 B 클래스를 주입하는거야

그래서 그 B 에 있는 메소드들을 A 클래스에서 호출해서 사용할 수 있어

원래는 이렇게하려면 A 클래스에서 B 클래스를 객체로 생성해야하잖아 new 써서

근데 안그래도 된다는거지

===> 이거는 같은 이름의 클래스를! 클래스를! 주입할 때

 

2) @Autowired 이용 (필요한 의존 객체를 찾음)

- @Autowired를 붙여서 같은 타입인 애를 주입시킴

: 같은 타입을 가진 메소드를 주입

타입이 같은 메소드를 주입하는거야

===> 이거는 같은 이름의 타입을 가진 메소드를! 메소드를! 주입할 때

 

 

 

 

★ @Bean

- 자바 코드 방식이면 꼭 쓰이는 것

- 왜냐면 코드로만 bean 등록을 하니까

- 그러게? @Component 쓰면 안되나..?

- 이 어노테이션 쓰려면 void 형식에는 못씀

- 그리고 이거 붙일 때는 return 되는 객체가 bean으로 등록되는거야

===> 메소드에 붙어있는 타입을 가진 객체가 생성되고 그게 return 돼서 bean 등록이 됨

- 메소드 이름이 id

- @Bean(name="nang") 속성 사용하면 그게 id

- 어딘가에서 @Bean이 붙어있는 메소드를 호출하잖아? 그럼 실행되겠지?

실행되면 return 되겠지? 그 return 되는 객체를 주입하는거야 부른 곳에. 호출한 곳에.

- 그니까 xml 파일에서 constructor-arg ref="nang" 이랬으면 nang이 주입되는거였잖아

- 그게 코드상에서 nang()을 호출하는거랑 같음

 

 

 

 

★ 코드 짤 때

  • 생성자 방식이면?

@Bean(name="kenny")

public Instrumentalist instrumentalist() {

     return new Instrumentalist("Jingle Bell", guitar());

}

이런 식으로 바로 return 가능해 객체 따로 안만들고 바로 return new 클래스명("파라미터", "파라미터");

 

 

  •  세터 방식이면?

@Bean

public Instrumentalist jain() {

     Instrumentalist instr = new Instrumentalist(); ----> default 생성자 이용해서 객체 먼저 만들어

     instr.setInstrumentalist(piano());

     return instr;

}

이런 식으로 일단 default 생성자 이용해서 객체를 만들어준다음에

.세터 해주고 파라미터로 주입할 객체를 호출해

그리고 return 객체 이름;

 

 

 

  • 리스트 방식이면? 

@Bean

public SpringIdol springIdol() {

     List<Performer> perfs = Arrays.asList(instrumentalist(), jain(), duke());

     return new SpringIdol(perfs);

}

이런 식으로 List 객체를 생성하는데 List<타입> 이름 = Arrays.asList(객체메소드(), 객체메소드());

객체 메소드들이 호출되서 그 객체가 주입되는거야 List로

그리고 return 현재클래스이름(객체 이름);

 

 

 

 

★ @Bean 적용 메소드는 여러번 호출해도 객체가 각각 생기는게 아니라 하나만 생성되고

같은게 공유되면서 사용되는거야

 

 

★ 설정 방식의 장단점 강의자료 읽기

반응형
LIST

'SPRING' 카테고리의 다른 글

외부 설정 Property  (0) 2019.03.28
Bean Scope (Bean 유효범위)  (0) 2019.03.28
DI Annotation  (0) 2019.03.25
Auto-wiring  (0) 2019.03.25
DI XML / SpEL (property 방식)  (0) 2019.03.19