- 이 글은 아래의 내용에서 이어지는 내용입니다.

 

[Spring기초] Java로 Bean 만들기.(Java로 xml 대신하기)

- 이 글은 아래의 내용에서 이어지는 내용입니다. [Spring기초] 의존성 주입:DI(DEPENDENCY INJECTION) - 생성자Constructor DI - 이 글은 아래의 내용에서 이어지는 내용입니다. [Spring기초] 의존성 주입:DI(Dep..

minaminaworld.tistory.com


# @Autowired

    - 클래스 타입을 통한 자동 주입.

    - 하나의 클래스만 유일하게 존재할 때 사용하는 것을 추천.

# @Qualifier

    - 이름(아이디)을 통한 자동 주입.

    - 여러개의 동일 클래스가 존재할 때 사용하는 것을 추천.

 

# Autowired 어노테이션은 setter DI의 형식을 취함.


# XML을 통한 방식 / JAVA을 통한 방식

0. Java , Xml 방식의 기본 Beans 생성.

  - DataBean1.java

package AnnotationBean;

import org.springframework.stereotype.Component;

public class DataBean1 {
	private int a = 10;
	private String b = "간다";
	
	public int getA() {
		return a;
	}
	
	public String getB() {
		return b;
	}
	
	public void setA(int a) {
		this.a = a;
	}
	
	public void setB(String b) {
		this.b = b;
	}
}

  - DataBean2.java

package AnnotationBean;

public class DataBean2 {
	private int a = 20;
	private String b = "온다";
	
	public int getA() {
		return a;
	}
	
	public String getB() {
		return b;
	}
	
	public void setA(int a) {
		this.a = a;
	}
	
	public void setB(String b) {
		this.b = b;
	}
}

  - DataBean3.java

package AnnotationBean;

public class DataBean3 {
	private int a = 20;
	private String b = "온다";
	
	public int getA() {
		return a;
	}
	
	public String getB() {
		return b;
	}
	
	public void setA(int a) {
		this.a = a;
	}
	
	public void setB(String b) {
		this.b = b;
	}
}

  - DataBean4.java

package AnnotationBean;

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

public class DataBean4 {
	private int a = 20;
	private String b = "온다";
	
	// 생성자 기본값을 지정.
	public DataBean4(@Value("1000") int a , @Value("안녕하세요") String b) {
		this.a = a;
		this.b = b;
	}
	
	public int getA() {
		return a;
	}
	
	public String getB() {
		return b;
	}

}

  - TestBean1.java 

package AnnotationBean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class TestBean1 {
	
	// data1, data2의 주입은 사실상 동일하다고 생각해도 된다.
	// @Autowired 어노테이션의 경우 data1에 대한 setter 메소드를 통해서 주입이 된다.	
	@Autowired
	private DataBean1 data1;
	
	// @Autowired가 setter 메소드에 붙힘으로써 setter 메소드를 통해서 주입이 된다.
	private DataBean2 data2;
	@Autowired
	public void setData2(DataBean2 data2) {
		this.data2 = data2;
	}
	
	// @Autowried는 클래스 형식으로 찾을 때, 
	// 동일한 클래스가 한 개 이상 지정되어 있으면,
	// @Qualifier를 통해서 이름(id)값을 통해 지정한다.
	@Autowired
	@Qualifier("data3_1")
	private DataBean3 data3_1;
	
	// @Autowried는 클래스 형식으로 찾을 때, 
	// 동일한 클래스가 한 개 이상 지정되어 있으면,
	// @Qualifier를 통해서 이름(id)값을 통해 지정한다.
	@Autowired
	@Qualifier("data3_2")
	private DataBean3 data3_2;
	
	@Autowired
	@Qualifier("data4_1")
	private DataBean4 data4_1;
	
	@Autowired
	@Qualifier("data4_2")
	private DataBean4 data4_2;
	
	public TestBean1() {
		System.out.println("TestBean1 Created");
	}
	
	// Getter 부분.	
	public DataBean1 getData1() {
		return data1;
	}
	
	public DataBean2 getData2() {
		return data2;
	}
	
	public DataBean3 getData3_1() {
		return data3_1;
	}
	
	public DataBean3 getData3_2() {
		return data3_2;
	}
	
	public DataBean4 getData4_1() {
		return data4_1;
	}
	
	public DataBean4 getData4_2() {
		return data4_2;
	}
}

 

 

1. JAVA을 통한 방식

- AnnotationJavaBeans.java : Object을 대한 정보를 정의.

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import AnnotationBean.DataBean1;
import AnnotationBean.DataBean2;
import AnnotationBean.DataBean3;
import AnnotationBean.DataBean4;
import AnnotationBean.TestBean1;

// XML이 방식이 아닌 JAVA의 형식으로 beans.xml을 대체한다.
@Configuration
public class AnnotationJavaBeans {

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

	@Bean
	public DataBean1 data1() {
		DataBean1 d1 = new DataBean1();
		return d1;
	}

	@Bean
	public DataBean2 data2() {
		DataBean2 d2 = new DataBean2();
		return d2;
	}

	// DataBean3의 경우 setter형식	
	@Bean
	public DataBean3 data3_1() {
		DataBean3 d3 = new DataBean3();
		d3.setA(111);
		d3.setB("DataBean3_1");
		return d3;
	}

	// DataBean3의 경우 setter형식
	@Bean
	public DataBean3 data3_2() {
		DataBean3 d3 = new DataBean3();
		return d3;
	}

	// DataBean4의 경우 생성자 형식
	@Bean
	public DataBean4 data4_1() {
		DataBean4 d4 = new DataBean4(1000, "문자열1");
		return d4;
	}

	// DataBean4의 경우 생성자 형식
	@Bean
	public DataBean4 data4_2() {
		DataBean4 d4 = new DataBean4(2000, "문자열1");
		return d4;
	}

}

- main.java : 실행 코드 부분.

// JAVA 파일을 사용하는 방식
		System.out.println("-------------------------------------------");
		AnnotationConfigApplicationContext ctx2 = new AnnotationConfigApplicationContext(AnnotationJavaBeans.class);

		TestBean1 java1 = ctx2.getBean("java1" , TestBean1.class);
		System.out.println("java1.getData1().getA() = > " + java1.getData1().getA());
		System.out.println("java1.getData1().getB() = > " + java1.getData1().getB());
		System.out.println("----------------------");
		
		System.out.println("java1.getData2().getA() = > " + java1.getData2().getA());
		System.out.println("java1.getData2().getB() = > " + java1.getData2().getB());
		
		System.out.println("----------------------");
		System.out.println("java1.getData3_1().getA() = > " + java1.getData3_1().getA());
		System.out.println("java1.getData3_1().getB() = > " + java1.getData3_1().getB());
		
		System.out.println("----------------------");
		System.out.println("java1.getData3_2().getA() = > " + java1.getData3_2().getA());
		System.out.println("java1.getData3_2().getB() = > " + java1.getData3_2().getB());
		
		System.out.println("----------------------");
		System.out.println("java1.getData4_1().getA() = > " + java1.getData4_1().getA());
		System.out.println("java1.getData4_1().getB() = > " + java1.getData4_1().getB());
		
		System.out.println("----------------------");
		System.out.println("java1.getData4_2().getA() = > " + java1.getData4_2().getA());
		System.out.println("java1.getData4_2().getB() = > " + java1.getData4_2().getB());

		System.out.println("----------------------");
		ctx2.close();

실행결과


 

 

2. XML을 통한 방식

- Annotataionbeans.xml : Object을 대한 정보를 정의.

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/context
						http://www.springframework.org/schema/context/spring-context.xsd">

	<!--  bean 클래스에 설정되어 있는 어노테이션을 이용한다. -->
	<context:annotation-config></context:annotation-config>
	<bean class="AnnotationBean.TestBean1"></bean>
	
	<bean class="AnnotationBean.DataBean1"></bean>
	<bean class="AnnotationBean.DataBean2"></bean>
	
	<bean id="data3_1" class="AnnotationBean.DataBean3" lazy-init="true">
		<property name="a" value="100"></property>
		<property name="b" value="가나다라"></property>
	</bean>
	
	<bean id="data3_2" class="AnnotationBean.DataBean3" lazy-init="true">
		<property name="a" value="200"></property>
		<property name="b" value="뮤뮤뮤뮤뮤뮤~~"></property>
	</bean>
	
	<bean id="data4_1" class="AnnotationBean.DataBean4"></bean>
	<bean id="data4_2" class="AnnotationBean.DataBean4">
		<constructor-arg index="0" value="20000"></constructor-arg>
		<constructor-arg index="1" value="Hello"></constructor-arg>
	</bean>
	
</beans>

- main.java : 실행 코드 부분.

TestBean1 xml1 = ctx1.getBean(TestBean1.class);
		
		System.out.println("xml1.getData1().getA() = > " + xml1.getData1().getA());
		System.out.println("xml1.getData1().getB() = > " + xml1.getData1().getB());
		System.out.println("----------------------");
		
		System.out.println("xml1.getData2().getA() = > " + xml1.getData2().getA());
		System.out.println("xml1.getData2().getB() = > " + xml1.getData2().getB());
		
		System.out.println("----------------------");
		System.out.println("xml1.getData3_1().getA() = > " + xml1.getData3_1().getA());
		System.out.println("xml1.getData3_1().getB() = > " + xml1.getData3_1().getB());
		
		System.out.println("----------------------");
		System.out.println("xml1.getData3_2().getA() = > " + xml1.getData3_2().getA());
		System.out.println("xml1.getData3_2().getB() = > " + xml1.getData3_2().getB());
		
		System.out.println("----------------------");
		System.out.println("xml1.getData4_1().getA() = > " + xml1.getData4_1().getA());
		System.out.println("xml1.getData4_1().getB() = > " + xml1.getData4_1().getB());
		
		System.out.println("----------------------");
		System.out.println("xml1.getData4_2().getA() = > " + xml1.getData4_2().getA());
		System.out.println("xml1.getData4_2().getB() = > " + xml1.getData4_2().getB());

		System.out.println("----------------------");

실행결과


 

블로그 이미지

미나미나미

,

 

- 이 글은 아래의 내용에서 이어지는 내용입니다.

 

[Spring기초] 의존성 주입:DI(Dependency Injection) - Setter DI

# 의존성 주입 : DI(Dependency Injection) -Setter DI 주입 - Spring 의존성 주입 중 Setter를 통한 방법. # 수행 과제 - 학생들의 정보를 setter 방식을 통해서 주입하는 과정을 알아보도록 하겠습니다. 1. Pack..

minaminaworld.tistory.com


# 의존성 주입 : DI(Dependency Injection) - Constructor DI 주입 

    - Spring 의존성 주입 중 생성자(Constructor)를 통한 방법.

# 수행 과제 

    - 학생들의 정보를 생성자(Constructor)방식을 통해서 주입하는 과정을 알아보도록 하겠습니다.

 


1. Package SetterDI , StudentTestBean.java , StudentData.java

 생성자(Constructor) 생성

   - 패키지 constructorDI는 Student에 관한 Bean을 생성한다.

   - StudentTestBean.java는 학생의 이름, 학번, 학점 변수와 학생의 정보 객체을 가진다.

   - StudentData.java는 학생의 정보 주소를 가진다.

package constructorDI;

public class StudentTestBean {

	private String stuName; // 학생 이름
	private int stuNum; // 학생 번호
	private double stuGrade; // 학생 점수
	private StudentData stuData;

	// Constructor 방식 DI
	public StudentTestBean(String stuName, int stuNum, double stuGrade, StudentData stuData) {
		this.stuName = stuName;
		this.stuNum = stuNum;
		this.stuGrade = stuGrade;
		this.stuData = stuData;
	}

	public String getStuName() {
		return stuName;
	}

	public int getStuNum() {
		return stuNum;
	}

	public double getStuGrade() {
		return stuGrade;
	}

	public StudentData getStuData() {
		return stuData;
	}

}
package constructorDI;

public class StudentData {
	private String address; // 학생주소

	// constructor 방식 DI
	public StudentData(String stuAddress) {
		this.address = stuAddress;
	}

	public String getAddress() {
		return address;
	}
}

2. ConstructorBeans.xml (생성자 매개 변수 넣는법)

   - index로 위치 지정.

   - 생성자와 동일 순서로 매개변수 지정.

   - 매개변수의 type 지정을 통한 지정.

<?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
						http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- bean id 값으로 객체를 불러올 거라 bean id 값을 부여하였습니다. -->
	<!-- 자료형을 명시하지는 않는 경우, String > double > int 형으로 자리를 잡는다. -->
	<!-- 자료형 명시를 통해서 매개변수의 위치를 잡아준다. -->
	<bean id="stuTest1_1" class="constructorDI.StudentTestBean"
		lazy-init="true">
		<constructor-arg value="이름1" type="java.lang.String"></constructor-arg>
		<constructor-arg value="2.2" type="double"></constructor-arg>
		<constructor-arg value="20501212" type="int"></constructor-arg>
		<!-- studentData를 bean을 생성을 통해서 명시 -->
		<constructor-arg index="3">
			<bean class="constructorDI.StudentData">
				<constructor-arg index="0" value="제주" type="java.lang.String"></constructor-arg>
			</bean>
		</constructor-arg>
	</bean>
	
	<!-- index 위치를 지정해주면서, 매개변 위치를 잡아준다. -->
	<bean id="stuTest1_2" class="constructorDI.StudentTestBean"
		lazy-init="true">
		<constructor-arg index="2" value="2.2"></constructor-arg>
		<constructor-arg index="0" value="이름1"></constructor-arg>
		<constructor-arg index="1" value="20501212"></constructor-arg>
		<!-- studentData를 bean을 생성을 통해서 명시 -->
		<constructor-arg index="3">
			<bean class="constructorDI.StudentData">
				<constructor-arg index="0" value="제주" type="java.lang.String"></constructor-arg>
			</bean>
		</constructor-arg>
	</bean>

	<!-- 생성자의 들어가는 매개변수가 생성자와 동일하면 순서대로 명시하면 그대로 들어간다. -->
	<bean id="stuTest2" class="constructorDI.StudentTestBean"
		lazy-init="true">
		<constructor-arg value="이름2"></constructor-arg>
		<constructor-arg value="20501213"></constructor-arg>
		<constructor-arg value="4.5"></constructor-arg>
		<!-- studentData를 bean을 id를 참조를 통해서 명시 -->
		<constructor-arg ref="stuBasicData"></constructor-arg>
	</bean>

	<!-- studentData의 기본형 -->
	<bean id="stuBasicData" class="constructorDI.StudentData"
		scope="prototype">
		<constructor-arg type="java.lang.String" value="서울"></constructor-arg>
	</bean>

</beans>

3. Main.java

package main;


import org.springframework.context.support.ClassPathXmlApplicationContext;

import constructorDI.StudentData;
import constructorDI.StudentTestBean;

public class Main {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("config/ConstructorBeans.xml");
		System.out.println("--------------------------");

		// getter를 통해서 setter을 통해서 주입한 데이터를 가져온다.
		// student stuTest1 의 정보 출력
		StudentTestBean stb1_1 = ctx.getBean("stuTest1_1", StudentTestBean.class);
		System.out.println("stuTest1 name => " + stb1_1.getStuName());
		System.out.println("stuTest1 num => " + stb1_1.getStuNum());
		System.out.println("stuTest1 grade => " + stb1_1.getStuGrade());
		System.out.println("stuTest1 address => " + stb1_1.getStuData().getAddress());
		// 또는 StudentData stuData= stb1.getStuData(); stuData.getAddress(); 하는 방법도 있다.
		System.out.println("--------------------------");
		
		StudentTestBean stb1_2 = ctx.getBean("stuTest1_2", StudentTestBean.class);
		System.out.println("stuTest1 name => " + stb1_2.getStuName());
		System.out.println("stuTest1 num => " + stb1_2.getStuNum());
		System.out.println("stuTest1 grade => " + stb1_2.getStuGrade());
		System.out.println("stuTest1 address => " + stb1_2.getStuData().getAddress());
		// 또는 StudentData stuData= stb1.getStuData(); stuData.getAddress(); 하는 방법도 있다.
		System.out.println("--------------------------");

		// student stuTest2 의 정보 출력
		StudentTestBean stb2 = ctx.getBean("stuTest2", StudentTestBean.class);
		System.out.println("stuTest2 name => " + stb2.getStuName());
		System.out.println("stuTest2 num => " + stb2.getStuNum());
		System.out.println("stuTest2 grade => " + stb2.getStuGrade());
		System.out.println("stuTest2 address => " + stb2.getStuData().getAddress());

		ctx.close();
		System.out.println("--------------------------");
		System.out.println("-ctx.close() 됨");
	}
}

4. 실행결과.

블로그 이미지

미나미나미

,

# 의존성 주입 : DI(Dependency Injection) -Setter DI 주입 

    - Spring 의존성 주입 중 Setter를 통한 방법.

# 수행 과제 

    - 학생들의 정보를 setter 방식을 통해서 주입하는 과정을 알아보도록 하겠습니다.

 


1. Package SetterDI , StudentTestBean.java , StudentData.java 생성

   - 패키지 SetterDI는 Student에 관한 Bean을 생성한다.

   - StudentTestBean.java는 학생의 이름, 학번, 학점 변수와 학생의 정보 객체을 가진다.

   - StudentData.java는 학생의 정보 주소를 가진다.

package SetterDI;

public class StudentTestBean {

	private String stuName; // 학생 이름
	private int stuNum; // 학생 번호
	private double stuGrade; // 학생 점수
	private StudentData stuData;

	public String getStuName() {
		return stuName;
	}

	public void setStuName(String stuName) {
		this.stuName = stuName;
	}

	public int getStuNum() {
		return stuNum;
	}

	public void setStuNum(int stuNum) {
		this.stuNum = stuNum;
	}

	public double getStuGrade() {
		return stuGrade;
	}

	public void setStuGrade(double stuGrade) {
		this.stuGrade = stuGrade;
	}

	public StudentData getStuData() {
		return stuData;
	}

	public void setStuData(StudentData stuData) {
		this.stuData = stuData;
	}
}

 

 

package SetterDI;

public class StudentData {
	private String address; // 학생주소

	public void setAddress(String address) {
		this.address = address;
	}
	
	public String getAddress() {
		return address;
	}
}
​

 


2. StudentBeans.xml 생성

   - StudentBeans.xml에서는 stuTest1, stuTest2 객체를 생성한다.

      - stuTest1의 학생 정보를 입력하고, StudentData는 bean 객체를 생성한다.

      - stuTest2의 학생 정보를 입력하고, StudentData는 bean 객체를 참조해서 생성한다.

         - 객체 생성시 property에 name을 명시하여, 넣을 변수에 알맞은 값을 value에 넣는다.

<?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
						http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- bean id 값으로 객체를 불러올 거라 bean id 값을 부여하였습니다. -->
	<bean id="stuTest1" class="SetterDI.StudentTestBean"
		lazy-init="true">
		<property name="stuName" value="이름1"></property>
		<property name="stuNum" value="205012000"></property>
		<property name="stuGrade" value="2.2"></property>
		<!-- studentData를 bean을 생성을 통해서 명시 -->
		<property name="stuData">
			<bean class="SetterDI.StudentData">
				<property name="address" value="제주"></property>
			</bean>
		</property>
	</bean>

	<bean id="stuTest2" class="SetterDI.StudentTestBean"
		lazy-init="true">
		<property name="stuName" value="이름2"></property>
		<property name="stuNum" value="205012100"></property>
		<property name="stuGrade" value="4.5"></property>
		<!-- studentData를 bean을 id를 참조를 통해서 명시 -->
		<property name="stuData" ref="stuBasicData"></property>
	</bean>

	<!-- studentData의 기본형  -->
	<bean id="stuBasicData" class="SetterDI.StudentData"
		scope="prototype">
		<property name="address" value="서울"></property>
	</bean>

</beans>

 

 


3. Main.java 

   - StudentBeans.xml에서는 stuTest1, stuTest2 객체를 생성한다.

   - stuTest1의 학생 정보를 입력하고, StudentData는 bean 객체를 생성한다.

   - stuTest2의 학생 정보를 입력하고, StudentData는 bean 객체를 참조해서 생성한다.

 

package main;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import SetterDI.StudentData;
import SetterDI.StudentTestBean;

public class Main {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("config/SetterBeans.xml");
		System.out.println("--------------------------");

		// getter를 통해서 setter을 통해서 주입한 데이터를 가져온다.
		
		// student stuTest1 의 정보 출력
		StudentTestBean stb1 = ctx.getBean("stuTest1", StudentTestBean.class);
		System.out.println("stuTest1 name => " + stb1.getStuName());
		System.out.println("stuTest1 num => " + stb1.getStuNum());
		System.out.println("stuTest1 grade => " + stb1.getStuGrade());
		System.out.println("stuTest1 address => " + stb1.getStuData().getAddress());
		// 또는 StudentData stuData= stb1.getStuData(); stuData.getAddress(); 하는 방법도 있다.
		System.out.println("--------------------------");

		// student stuTest2 의 정보 출력
		StudentTestBean stb2 = ctx.getBean("stuTest2", StudentTestBean.class);
		System.out.println("stuTest2 name => " + stb2.getStuName());
		System.out.println("stuTest2 num => " + stb2.getStuNum());
		System.out.println("stuTest2 grade => " + stb2.getStuGrade());
		System.out.println("stuTest2 address => " + stb2.getStuData().getAddress());

		ctx.close();
		System.out.println("--------------------------");
		System.out.println("-ctx.close() 됨");
	}
}

4. 결과화면


 

블로그 이미지

미나미나미

,