Day089

RISK_TAKER·2023년 6월 8일
0

root-context.xml에서 생성자에 값을 전달하여 Bean객체를 등록하는 방법

  • 생성자가 오버로딩 되어 있는 경우
  • root-context.xml에서 정수를 넣어 주어도 String이 우선 순위가 높기때문에 String을 받는 생성자가 호출이 된다.
  • 정수를 받는 생성자를 호출하기 위해서는 type="int" 를 같이 작성해야 한다.

SampleBean5.java

public class SampleBean5 {
	
	int num;
	String str;
	
	public SampleBean5() {
		num = 0;
		str = null;
	}
	public SampleBean5(int num) {
		this.num = num;
		str = null;
	}
	public SampleBean5(String str) {
		this.num = 0;
		this.str = str;
	}
	public SampleBean5(int num, String str) {
		this.num = num;
		this.str = str;
	}
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getStr() {
		return str;
	}
	public void setStr(String str) {
		this.str = str;
	}
	
}

root-context.xml

<bean id="sampleBean5" class="com.app.beans.SampleBean5"></bean>
	
<bean id="sampleBean5_2" class="com.app.beans.SampleBean5">
		<!-- <constructor-arg value="30"></constructor-arg> -->
	<constructor-arg value="30" type="int"></constructor-arg>
</bean>
	
<bean id="sampleBean5_3" class="com.app.beans.SampleBean5">
	<constructor-arg value="10" />
	<constructor-arg value="20" />
</bean>

root-context.xml에서 setter를 통해 값을 주입하는 경우

  • GetSetBean.java
  • 필드변수 int var1; String var2; String var3;
  • Getter, Setter 메소드가 있어야 함
<bean id="gsb1" class="com.app.beans.GetSetBean">
	<property name="var1" value="500"></property>
 	<property name="var2" value="600"></property>
  	<property name="var3" value="문자"></property>
</bean>

<bean id="sb1" class="com.app.beans.SampleBean1" />
<bean id="sb2" class="com.app.beans.SampleBean1" />

<bean id="gsb2" class="com.app.beans.GetSetBean2">
 	<property name="var1" value="500"></property>
  	<property name="var2" value="600"></property>
  	<property name="var3" value="문자"></property>
  	<property name="sb1" ref="sb1"></property>
  	<property name="sb2" ref="sb2"></property>
</bean>


<bean id="gsb3" class="com.app.beans.GetSetBean2">
  	<property name="var1" value="500"></property>
  	<property name="var2" value="600"></property>
  	<property name="var3" value="문자"></property>
  	<property name="sb1">
    	<bean class="com.app.beans.SampleBean1" />
  	</property>
  <property name="sb2" ref="sb2"></property>
</bean>

@어노테이션을 통해 빈으로 등록하는 방법

  1. @Configuration을 찾기 위해 servlet-context.xml에 다음을 추가한다.
<context:component-scan base-package="com.app.config"></context:component-scan>
  1. com.app.config 패키지에 Configuration 클래스 생성
  • @Configuration 어노테이션을 클래스명 위에 작성한다.
//스프링에서 bean등록 설정과 관련된 것으로 인식
@Configuration
public class BeanConfiguration {

	
	//등록할 빈에 대한 리턴 형태의 메소드를 작성
	@Bean
	public JavaConfigBean javaConfigBean() { //javaConfigBean <- id 역할
		return new JavaConfigBean();
	}
	
	@Bean
	public JavaConfigBean javaConfig1() {
		return new JavaConfigBean();
	}
	
	@Bean
	public JavaBean1 javaTempBean1() {
		return new JavaBean1();
	}
	@Bean
	public JavaBean1 javaBean1Lunch() {
		return new JavaBean1();
	}
	
}
  1. com.app.beans 패키지에 Bean클래스 작성
public class JavaConfigBean {

	public JavaConfigBean() {
		System.out.println("JavaConfigBean 생성자 호출");
	}
}
  1. Controller 클래스 작성
@Controller
public class JavaBeanController {

	@Autowired
	ApplicationContext applicationContext;
	
	@GetMapping("/javaBean")
	public String javaBean() {
		
		JavaConfigBean jb1 = (JavaConfigBean)applicationContext.getBean("javaConfigBean");
		JavaConfigBean jb2 = (JavaConfigBean)applicationContext.getBean("javaConfig1");
		
		System.out.println(jb1);
		System.out.println(jb2);
		
		return "checkBean";
	}
	
	@GetMapping("/javaBean1")
	public String javaBean1() {
		JavaBean1 jb1 =  (JavaBean1)applicationContext.getBean("javaTempBean1");
		JavaBean1 jb2 =  (JavaBean1)applicationContext.getBean("javaBean1Lunch");
		
		System.out.println(jb1);
		System.out.println(jb2);
		
		return "checkBean";
	}
}

@Autowired 어노테이션을 사용해서 Bean을 쉽게 등록하고 사용하는 방법

//주입을 하고 싶을때 @Autowired 을 사용한다.

@Autowired
NewBean newBean;

@GetMapping("/newBean")
public String checkNewBean() {

	System.out.println(newBean);

	return "checkBean";
}
/*

 아래의 1,2에 해당하는 관점 대신 @Autiwired 처리하면 바로 Bean 주입이 끝난다. 

 1. xml 관점
 	<bean id="beanController" class="com.app.controller.BeanController">
 		<property name="newBean">
 			<bean class="com.app.beans.NewBean" />
 		</property>
	 </bean>

2. Java Configuration 관점
	 @Bean //setter를 통한 주입
	 public BeanController beanController() {
	 		BeanController beanController = new BeanController();
	 		NewBean newBean = new NewBean();
	 		beanController.setNewBean(newBean);
	 		return beanController;
	 }

	 @Bean //생성자를 통한 주입
	 public BeanController beanController() {
	 	NewBean newBean = new NewBean();
	 	BeanController beanController = new BeanController(newBean);
*/

DI, IOC 관련 추가 내용

/*
	DI : 의존성 주입
		1. xml등록
		2. Java 레벨 Configuration + Bean 설정등록 (생성자/Setter)
		3. 어노테이션 활용(@Autowired)
	IOC : 제어의 역전(IOC 컨테이너 빈 등록)
		1. xml등록
		2. Java 레벨 Configuration + Bean 설정등록
		3. 어노테이션 활용(@Component)
		
	활용 :  1. 클래스 레벨에서 설정단계에서 주입된 객체를 활용(외부 xml로 주입 / Java 설정 주입)
			2. 어노테이션을 통해 주입해서 사용(@Autowired)
			3. ApplicationContext를 통해서 getBean()으로 접근해서 사용
	
*/

0개의 댓글