인터넷 강의를 듣고 공부한 내용을 포스팅합니다.
'윤재성의 스프링 프레임워크 개발자를 위한 실습을 통한 입문 과정' 이란 강의를 듣고 있습니다.
Annotation
Annotation에 대한 내용은 전에 맨 처음으로 포스팅 해놓은게 있으니 모르신다면 한번 봐주세요..
[Spring] Annotation? 어노테이션?이 뭘까
(계속해서 추가 할 예정입니다.) 안녕하세요. 스프링을 본격적으로 학습하기 시작하고나서 어노테이션으로 간단하게 객체를 생성하고 데이터들을 받는 것을 확인했습니다. 물론 아직 어노테이
dy-web-box.tistory.com
Bean등록
여태까지 xml에 객체 생성하고 java코드에 가져와서 사용을 했지만 전에 이야기 했든 java파일에도 작업할 수 있다. xml파일만 사용하는 경우도 있고, 자바만 사용하는 경우, 둘 섞어서 사용하는 경우가 있다고 하니 다 알아 둘 필요가 있을 것 같다. java파일의 장점은 java파일 그대로 프로그래밍을 할 수 있다는 데 있다.
우리가 작업할 java파일에
@Configuration
public class BeanConfigClass {
}
다음과 같이 @Configuration 어노테이션을 작성해 주면 된다.
빈 등록에서 사용할 기본적인 어노테이션들에는
@bean : bean객체를 정의할 때 사용한다. 메서드의 이름이 bean의 이름이 된다. @bean(name=이름) 이와같이 이름을 새롭게 정의할 수도 있다.
@Lazy : xml에서 사용한 lazy-init 속성을 지정
@scope : xml에서 사용한 scope 속성을 지정
@primary : primary 속성을 지정한다.
실습
//xml사용시에
ClassPathXmlApplicationContext ctx2 =
new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
//java파일 사용시에
AnnotationConfigApplicationContext ctx1 =
new AnnotationConfigApplicationContext(BeanConfigClass.class);
이렇게 사용한다.
자바파일
@Bean
public TestBean1 java1() {
TestBean1 t1 = new TestBean1();
return t1;
}
main
TestBean1 java1 = ctx1.getBean("java1",TestBean1.class);
System.out.printf("java1 : %s\n",java1);
/*
결과
TestBean1의 생성자
java1 : kr.co.softcampus.beans.TestBean1@25b485ba
*/
bean객체에 상세 설정을 해주지 않은상태
자바파일
@Bean(name="java600")
public TestBean1 java500() {
TestBean1 t1 = new TestBean1();
return t1;
}
main
TestBean1 java600 = ctx1.getBean("java600",TestBean1.class);
System.out.printf("java600 : %s\n",java600);
/*
결과
TestBean1의 생성자
java600 : kr.co.softcampus.beans.TestBean1@2b546384
*/
singleton상태이기 때문에 한번 생성된 객체를 동일하게 사용하기 때문에 객체의 주소가 같다
여기서 만약 자바파일에서 만든 java500의 이름을 그대로 사용하게 되면 오류발생한다.
자바파일
@Bean
@Lazy
public TestBean2 java2() {
TestBean2 t2 = new TestBean2();
return t2;
}
이 상태로 main문 실행시 생성자가 자동으로 생성되지 않는 것을 확인 할 수 있음
main
TestBean2 java2 = ctx1.getBean("java2",TestBean2.class);
System.out.printf("java2 : %s\n",java2);
/*
결과
TestBean2의 생성자
java2 : kr.co.softcampus.beans.TestBean2@5d740a0f
*/
자바파일
@Bean
@Scope("prototype")
public TestBean3 java3() {
TestBean3 t3 = new TestBean3();
return t3;
}
main
TestBean3 java3 = ctx1.getBean("java3",TestBean3.class);
System.out.printf("java3 : %s\n",java3);
TestBean3 java33 = ctx1.getBean("java3",TestBean3.class);
System.out.printf("java33 : %s\n",java33);
/*
결과
TestBean3의 생성자
java3 : kr.co.softcampus.beans.TestBean3@2893de87
TestBean3의 생성자
java33 : kr.co.softcampus.beans.TestBean3@55ca8de8
*/
scope prototype의 설정으로 각각 다른 객체가 생성된 것을 확인 할 수 있다.
자바파일
@Bean
@Primary
public TestBean4 java4() {
TestBean4 t4 = new TestBean4();
return t4;
}
@Bean
public TestBean4 java5() {
TestBean4 t4 = new TestBean4();
return t4;
}
사실 xml이든 자바파일이든 생성된 객체가 하나라면 굳이 id를 지정해주지 않아도 사용가능 하다. 객체를 두 개를 만들어 놓는다면 오류가 발생하게 되는데 그 때 @Primary 어노테이션을 사용해서 사용한 메서드가 호출되도록 한다.
main
TestBean4 java4 = ctx1.getBean(TestBean4.class);
System.out.printf("java4 : %s\n",java4);
/*
결과
TestBean4의 생성자
TestBean4의 생성자
java4 : kr.co.softcampus.beans.TestBean4@2ed0fbae
*/
init,destroy method
xml에서 설정해 주었던 init,destroy method를 자바파일에서도 설정 가능하다.
자바파일
@Bean(initMethod = "init",destroyMethod="destroy")
@Lazy
public TestBean1 java1() {
return new TestBean1();
}
main
TestBean1 java1 = ctx2.getBean("java1",TestBean1.class);
/*
결과
TestBean1dml 생성자 입니다.
TestBean1의 init메서드
23:56:16.699 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6321e813, started on Sun Jul 18 23:56:16 KST 2021
TestBean1의 destroy메서드
*/
끝!
'Spring' 카테고리의 다른 글
Annotation(어노테이션)을 이용한 빈 설정 (0) | 2021.07.23 |
---|---|
Annotation(어노테이션) 주입 (0) | 2021.07.21 |
DI(Dependency Injection) 자동주입 (0) | 2021.07.18 |
DI(Dependency Injection) Setter메서드를 통한 주입 (0) | 2021.07.17 |
DI(Dependency Injection) 컬렉션 주입 (0) | 2021.07.17 |