- 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 적용 메소드는 여러번 호출해도 객체가 각각 생기는게 아니라 하나만 생성되고
같은게 공유되면서 사용되는거야
★ 설정 방식의 장단점 강의자료 읽기
'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 |