Spring - Java를 이용한 Bean 등록(어노테이션)

2020. 8. 18. 21:38Java/Spring

반응형

Spring에서는 xml을 이용하는 방법 말고도 자바 코드를 이용하여 빈을 관리할 수 있다.

 xml java파일의 차이는 xml은 값을 정해줘야 하는 반면 java 파일은 코드를 자유롭게 작성할 수 있다는 것이다.

 개발을 하면서 둘 다 사용하는 경우가 있기에 둘 다 알아두는 것이 좋다.

 

 

먼저 프로젝트를 생성하고 다음과 같이 패키지 및 파일을 만들어 준다.


beanconfig 자바파일을 이용해서 빈들을 관리 할 것이다.

먼저 빈이 정의된 파일들을 불러오는 차이에 대해 알아보자.

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("cookingcoding/config/beans.xml");

MainClass에서 Xml파일을 불러오는 방법이다.

 


MainClass에서 bean이 정의 된 class를 불러오는 방법이다.

AnnotationConfigApplicationContext ctx2 = new AnnotationConfigApplicationContext(beanconfig.class);

 둘 다 파일 및 클래스를 불러오고 getBean을 통해서 bean 객체를 가져온다.

 


beanconfig.java 파일에서 다음 메소드를 추가하자

@Bean
public TestBean1 java1() {
	TestBean1 t1 = new TestBean1();
	return t1;
}

다음 코드를 설명하면, @Bean 어노테이션은 아래에 있는 메소드를 빈 객체 생성하는데 사용한다는 의미이다.

해당 빈의 id는 메소드의 이름인 java1이 된다.

 

MainClass에서 다음과 같이 불러 올 수 있다.

TestBean1 z1 = ctx2.getBean("java1",TestBean1.class);

이전의 빈과 마찬가지로 기본적으로 싱글톤의 성격을 가진다.

 


다음으로 해당 Bean의 id를 설정하는 방법이다.

@Bean(name="java2")
public TestBean1 java100() {
	TestBean1 t1 = new TestBean1();
	return t1;
}

위와 같이 name을 사용하여 특정 id로 설정한다.

위 처럼 설정하면 java100으로는 호출 할 수 없다.

TestBean1 z3 = ctx2.getBean("java2",TestBean1.class);
System.out.println("Z3 ==>"+z3);

java2로 불러와야 한다.

 


MainClass에서 xml 파일을 불러 올 때 자동으로 정의 된 모든 빈 객체를 생성했다. 이때 자동 생성을 막기 위해서

아래와 같이 lazy-init 속성을 추가하였었다.

<bean id="t4" class="cookingcoding.beans.TestBean2" lazy-init="true"/>

Java를 이용한 방법에서는 아래와 같이 @Lazy을 준다면 자동으로 생성되지 않는다.

@Bean
@Lazy
public TestBean2 java3() {
	TestBean2 t1 = new TestBean2();
	return t1;
}

빈객체가 생성될 때는 기본적으로 싱글톤 타입을 갖는데, 이를 scope 속성을 통해 설정이 가능했다.

Java에서는 해당 방법을 아래와 같이 @Scope("prototype") 을 추가 함으로써 사용이 가능하다.

@Bean
@Scope("prototype")
public TestBean2 java4() {
	TestBean2 t1 = new TestBean2();
	return t1; 
}

xml에서 같은 객체를 가르키는 빈이 2개이상 정의된 경우 id를 통해서 구분했다. 이때, id를 주지 않고 호출에 우선권을 갖는 빈을 설정 가능한데, Primary 속성을 통해서 설정 가능하다.

 

Java에서는 해당 속성을 아래와 같이 사용한다.

@Bean 
public TestBean3 java5() { 
TestBean3 t1 = new TestBean3(); 
return t1; 
}


@Bean 
@Primary 
public TestBean3 java6() { 
TestBean3 t1 = new TestBean3(); 
return t1; 
}

MainClass에서 TestBean3을 id없이 불러 올 때, Primary 어노테이션이 있는 java6()이 불려온다.

 


beanconfig.java

public class beanconfig {

	@Bean
	public TestBean1 java1() {
		TestBean1 t1 = new TestBean1();
		return t1;
	}
	
	@Bean(name="java2")
	public TestBean1 java100() {
		TestBean1 t1 = new TestBean1();
		return t1;
	}
	
	@Bean
	@Lazy
	public TestBean2 java3() {
		TestBean2 t1 = new TestBean2();
		return t1;
	}
	
	@Bean
	@Scope("prototype")
	public TestBean2 java4() {
		TestBean2 t1 = new TestBean2();
		return t1; 
	}
	
	@Bean
	public TestBean3 java5() {
		TestBean3 t1 = new TestBean3();
		return t1;
	}
	@Bean
	@Primary
	public TestBean3 java6() {
		TestBean3 t1 = new TestBean3();
		return t1;
	}
}

MainClass.java

public class MainClass {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("cookingcoding/config/beans.xml");
		
		TestBean1 t1 = ctx.getBean("t1",TestBean1.class);
		System.out.println("t1 ==>"+ t1);
		System.out.println("=======================================================");
		TestBean1 t2 = ctx.getBean("t1",TestBean1.class);
		System.out.println("t2 ==>"+ t2);
		System.out.println("=======================================================");
		TestBean2 t3 = ctx.getBean("t4",TestBean2.class);
		System.out.println("t3 ==>"+ t3);
		
		ctx.close();
		
		AnnotationConfigApplicationContext ctx2 = new AnnotationConfigApplicationContext(beanconfig.class);
		TestBean1 z1 = ctx2.getBean("java1",TestBean1.class);
		System.out.println("Z1 ==>"+z1);
		System.out.println("=======================================================");
		TestBean1 z2 = ctx2.getBean("java1",TestBean1.class);
		System.out.println("Z2 ==>"+z2);
		System.out.println("=======================================================");
		TestBean1 z3 = ctx2.getBean("java2",TestBean1.class);
		System.out.println("Z3 ==>"+z3);
		System.out.println("=======================================================");
		TestBean2 z4 = ctx2.getBean("java3",TestBean2.class);
		System.out.println("Z4 ==>"+z4);
		System.out.println("=======================================================");
		TestBean2 z5 = ctx2.getBean("java4",TestBean2.class);
		System.out.println("Z5 ==>"+z5);
		System.out.println("=======================================================");
		TestBean2 z6 = ctx2.getBean("java4",TestBean2.class);
		System.out.println("Z6 ==>"+z6);
		System.out.println("=======================================================");
		TestBean3 z7 = ctx2.getBean(TestBean3.class);
		System.out.println("Z7 ==>"+z7);
		ctx2.close();
	}

}

- @Bean 어노테이션은 bean 객체를 정의할 때 사용한다.

- 메서드의 이름이 bean의 이름이 된다.

- @Bean(name=이름) : bean의 이름을 새롭게 정의한다.

- @Lazy : lazy-init 속성을 지정한다.

- @Scope : beanscope를 설정한다.

- @Primary : primary 속성을 지정한다.

반응형