본문 바로가기
IT/Spring

[Spring] - 스프링 Bean 등록(Annotation, XML) 하는 방법

by 차이나는 개발자 2020. 8. 13.
728x90
반응형

#스프링 Bean 등록(Annotation, XML) 하는 방법

 

 

#Annotation
@Component : bean으로 등록

 

bean등록 어노테이션
@Controller : 요청과 응답처리
@Repository : DAO(파일, 데이터베이스) 
@Service : Command(비즈니스 로직)

 

#@Component

package org.green.di_test;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/*
 *  Annotation
 *  	@Component : bean으로 등록
 *  	
 *  	bean등록 어노테이션
 *  	@Controller :  
 *  	@Repository : DAO
 *  	@Service : Command
 * 
 */

// 단순 @Component로 등록하면 xml과 비교해서 어떻게 식별(ID)할까 ?
// == <bean id="some" class="org.green.di_test.Some" />

//@Component("someObj") // 컴포넌트의 이름을 임의로 지정
@Component
public class Some {
	
	
	
//	@Value("test") // 값을 임의로 저장
	private String contents;

	public Some() {
	}
	
	public Some(String contents) {
		super();
		this.contents = contents;
	}

	public String getContents() {
		return contents;
	}

	public void setContents(String contents) {
		this.contents = contents;
	}

	@Override
	public String toString() {
		return "Some [contents=" + contents + "]";
	}
	
}

 

@Autowired

-정밀한 의존관계 주입이 필요한 경우에 유용하다.

-프로퍼티, setter 메서드, 생성자, 일반 메서드에 적용 가능하다.

-의존하는 객체를 주입할 때 주로 Type을 이용한다.

-<property>, <contructor-arg> 태그와 동일한 역할을 한다.

 

@Resource

 -애플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용한다.

 -@Resource는 poperty, setter 메서드에 적용 가능하다.

 -의존하는 객체를 주입할 때 주로 Name을 이용한다.

 

@Value

-단순한 값을 주입할 때 사용되는 annotation.

-@Value("Spring")은 <property .. value="Spring" />와 동일한 역할을 한다.

 

@Qualifier

-@Autowired annotation와 함께 사용합니다.

-@Autowired는 타입으로 찾아서 주입하므로, 동일 타입의 Bean 객체가 여러 개 존재할 때 특정 Bean을 찾기 

위해 사용한다.

 

 

#어노테이션으로 빈 등록

package org.green.di_test;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
	
	// @Autowired
	// 스프링 프레임워크에서 관리하는 Bean 객체와 같은 타입의 객체를 찾아서 자동으로 주입해주는 것. 
	// 해당 객체를 Bean으로 등록하지 않으면 주입해줄 수 없다.
	// root-context.xml에 등록
	// @Qualifier : 같은 객체가 복수일때 임의로 지정가능
	
	@Autowired
	@Qualifier("mySome") // 타입이 같은 빈이 있을 경우 조금 더 딮하게 찾을때 사용
	private Some some; 
	  
	@Autowired	
	private Other obj;
	
	// IAnimal은 인터페이스
	// 빈으로 등록 되어있지않다.
	// 다형성을 기반으로 자동으로 구현하고있는 모든객체를 잡아준다.
	@Autowired 
	private IAnimal myCat;
	
	// has a
//	@RequestMapping(value = "/", method = RequestMethod.GET)
//	public String home() {   
//		System.out.println(obj);
//		return "home";
//	} 
	
	// 인터페이스 방식 
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home() {   
		myCat.cry(); 
		return "home";
	}  
	  
	
}

 

 

#XML로 빈 등록 (root-context.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- 모든 웹 Component들이 공유할 수 있는 리소스 -->
	<!-- Root Context: defines shared resources visible to all other web components -->
	<bean id="some" class="org.green.di_test.Some" />
	
	<!-- DI(has a관계) -->
	
	<!-- 생성자로 전달 -->
	<bean id="mySome" class="org.green.di_test.Some" >
		<constructor-arg value="java" />  
	</bean>
	  
	<!-- property == setter로 전달 --> 
	<bean id="yourSome" class="org.green.di_test.Some">
		<property name="contents" value="JSP" />
	</bean>
	
	<!-- 객체로 된 멤버변수  <bean>태그 안에 공백이면 기본 생성자 호출 -->
	<!-- 멤버변수 some에 + yourSome 넣기  -->
	<bean id="obj" class="org.green.di_test.Other">
		<property name="some" ref="yourSome" />
	</bean>
		    
	<bean id="myCat" class="org.green.di_test.Cat"></bean> 
	<bean id="myDog" class="org.green.di_test.Dog"></bean>
	
	
	<!-- 객체가 배열일때 -->
	<bean id="ball1" class="org.green.di_test.Ball">
		<constructor-arg value="1" />
	</bean>
	<bean id="ball2" class="org.green.di_test.Ball">
		<constructor-arg value="2" />
	</bean>
	<bean id="ball3" class="org.green.di_test.Ball">
		<constructor-arg value="3" />
	</bean>
	
	<!-- 멤버변수가 배열일때 -->
	<!-- <list> 배열이나 콜랙션 사용할때 -->
	<!-- property <-setter가 있어야함 -->
	<bean id="myBasket" class="org.green.di_test.BallBasket">
	
		<!-- 일반배열(arr[]) -->
		<property name="arr">
			<list>
				<value>first</value>
				<value>second</value>
				<value>third</value>
			</list>
		</property>
		
		<!-- 객체배열이나 list(ball[]) -->
		<property name="list">
			<list>
				<ref bean="ball1" />
				<ref bean="ball2" />
				<ref bean="ball3" />
			</list>
		</property>
		
		<!-- set형태 -->
<!-- 		<property name=""> -->
<!-- 			<set> -->
<!-- 				<ref bean="ball1" /> -->
<!-- 				<ref bean="ball2" /> -->
<!-- 				<ref bean="ball3" /> -->
<!-- 			</set> -->
<!-- 		</property> -->
		
		<!-- map형태 -->
<!-- 		<property name=""> -->
<!-- 			<map> -->
<!-- 				<entry key="ball1" value-ref="ball1" />		 -->
<!-- 				<entry key-ref="id" value-ref="id" />		 -->
<!-- 			</map> -->
<!-- 		</property> -->
	</bean>
	
</beans>

 

1. BallBasket.java

package org.green.di_test;

import java.util.Arrays;

public class BallBasket {
	private String[] arr;
	private Ball[] list;
	
	public BallBasket() {
		super();
	}
	
	public BallBasket(String[] arr) {
		super();
		this.arr = arr;
	}

	public String[] getArr() {
		return arr;
	}

	public void setArr(String[] arr) {
		this.arr = arr;
	}

	public Ball[] getList() {
		return list;
	}

	public void setList(Ball[] list) {
		this.list = list;
	}

	@Override
	public String toString() {
		return "BallBasket [arr=" + Arrays.toString(arr) + "]";
	}
		
}

 

2. Ball.java

package org.green.di_test;

public class Ball {
	private int num;

	public Ball() {
	}
	
	public Ball(int num) {
		super();
		this.num = num;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	@Override
	public String toString() {
		return "Ball [num=" + num + "]";
	}
	
	
}

 

 

 

728x90
반응형

댓글