본문 바로가기

Spring

Annotation(어노테이션) 자바 코드를 이용한 bean 등록

인터넷 강의를 듣고 공부한 내용을 포스팅합니다.

'윤재성의 스프링 프레임워크 개발자를 위한 실습을 통한 입문 과정' 이란 강의를 듣고 있습니다.

 

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메서드
*/

 

끝!