지금까지는 bean을 등록하기 위해서 beans.xml 이라는 xml파일을 계속해서 사용해왔다.
이는 spring버전의 발전에 따라 xml파일에서 뿐만 아니라 java코드에서 bean을 등록할 수도 있도록 바뀌었다.
(그리고, 이게 더 많이 쓰인다고 한다...)
지금까지 했던 bean등록의 여러가지 방법을 java파일에서는 어떻게 활용하면 되는지 알아보자!!
1. java파일을 bean등록파일로 만들기
(@Configration , @Bean)
java 파일에서 bean을 등록하기 위해서는 @Configration이라는 어노테이션을 클래스에 붙여준다.
그리고 xml파일에서 bean태그를 이용하여 빈을 등록해 주었듯이 @Bean 어노테이션을 이용하여 메소드로써 정의해주면 된다.
TestBean6 라는 클래스가 정의되어 있다고 치자.
위와 같이 빈 등록 파일을 JavaBean이라는 자바파일로 만들었다.
java1이라는 메소드를 @Bean 어노테이션을 이용하여 정의하였는데 bean의 id값이 바로 메소드의 이름이 된다.
xml파일과 동일하게 다른 설정을 해주지 않으면 default값은 singleton이다.
main도 조금 달라졌다.
ClassPathXmlApplicationContext를 사용하여 xml을 불러왔었는데, 자바를 사용할때는
AnnotationConfigApplicationContext를 사용하여 자바클래스를 불러온다. xml파일은 해당파일의 path를 다 적어주어야 하지만 자바클래스는 위와같이 JavaBean.class와 같이 적어주면 된다.
2. Bean의 이름 설정해주기
(@Bean(name="빈 이름"))
위에서 bean의 id값은 메소드의 이름이라고 설명하였다. 메소드의 이름을 건드리지 않고 빈의 이름을 설정하는 방법이 있다.
위와 같이 빈의 name속성을 바꾸어주면 메소드의 이름을 바꾸지 않고 손쉽게 빈의 이름을 변경할 수 있다.
3. 여러가지 bean 설정들
(@Lazy, @Scope("singleton/prototype"), @Primary)
xml에서 사용했던 설정들을 java파일에서도 그대로 다 사용할 수 있다. 모두 어노테이션을 이용하여 설정한다.
@Lazy 어노테이션은 xml의 lazy-init 속성과 같다. @Lazy를 설정하면 lazy-init이 true값이 되며, getBean을 해야 객체를 생성한다.
@Scope("prototype") 어노테이션은 안써주면 default값은 singleton이다. @Scope("prototype")을 써줌으로써 getBean으로 객체를 새로 생성할 때마다 서로 다른 객체가 생성된다.
@Primary 어노테이션은 bean의 id가 설정되어 있지 않을 때 사용한다. 같은 type의 빈이 여러개 설정되어 있을 때, @Primary 어노테이션이 설정되어 있는 bean이 우선으로 불러와진다.
4. init, destroy 메소드 설정하기
(@Bean(initMethod="init메소드", destroyMethod="destroy메소드"))
xml에서는 init메소드나 destroy메소드를 사용하기 위해서는
intit-method="init메소드" 이나 destroy-method="destroy메소드" 를 사용하였다. java도 비슷하다.
@Bean 어노테이션에 설정에 @Bean(initMethod="init메소드", destroyMethod="destroy메소드") 와 같이 설정해주면 된다.
TestBean6 클래스에 다음과 같이 init이라는 메소드와 destroy라는 메소드를 정의하였다.
자바 빈 설정파일에 java2라는 메소드를 정의하였으며 @Bean 어노테이션의 속성을 위와 같이 설정하여 init메소드와 destroy메소드를 설정하였다.
main에서 돌리면 다음과 같이 bean객체가 생성되기 전과 후에 각각 init메소드와 destroy메소드가 정상적으로 호출된 것을 볼 수 있었다.
'JAVA > Spring' 카테고리의 다른 글
Annotation을 이용한 빈 설정 (0) | 2020.04.11 |
---|---|
Java를 이용한 Bean 객체 주입 (0) | 2020.04.10 |
자동 주입 (0) | 2020.04.10 |
컬렉션 주입 (0) | 2020.04.09 |
의존성 주입 (Dependency Injection) (0) | 2020.04.09 |