2022.10.04 Spring

sofia·2022년 10월 11일
0

Spring

목록 보기
2/11
post-thumbnail

chap3

이어서

예제 5

Won2Dollar.java

package com.javalec.spring_ex_3_4;

public class Won2Dollar {
	public void exchange(int money) {
		double dollar = money / 1200;
		System.out.println(money+"원은 $"+dollar+"입니다.");
	}
}

MyWon2Dollar.java

package com.javalec.spring_ex_3_4;

public class MyWon2Dollar {
	private Won2Dollar won2Dollar;
	
	private int money;
	
	public void exch() {
		won2Dollar.exchange(money);
	}

	public Won2Dollar getWon2Dollar() {
		return won2Dollar;
	}

	public void setWon2Dollar(Won2Dollar won2Dollar) {
		this.won2Dollar = won2Dollar;
	}

	public int getMoney() {
		return money;
	}

	public void setMoney(int money) {
		this.money = money;
	}
}

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

	<!-- Won2Dollar Bean 객체 생성 -->
	<bean id="won2Dollar" class="com.javalec.spring_ex_3_4.Won2Dollar"></bean>
	
	<bean id="myWon2Dollar" class="com.javalec.spring_ex_3_4.MyWon2Dollar">
		<property name="won2Dollar">
			<ref bean="won2Dollar"/>
		</property>
		<property name="money" value="3600"></property>
	</bean>
</beans>

MainWon2Dollar.java

package com.javalec.spring_ex_3_4;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainWon2Dollar {
	public static void main(String[] args) {
		String configLoc = "classpath:won2DollarCTX.xml";
		AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
		//객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)
		MyWon2Dollar myWon2Dollar = ctx.getBean("myWon2Dollar",MyWon2Dollar.class);

		
		myWon2Dollar.exch();
	}
}

예제 6

Three.java

package com.javalec.spring_ex_3_5;

public class Three {
	public void process(int i) {
		if (i % 3 == 0) {
			System.out.println("입력된 수 : "+i+"는 3의 배수입니다.");
		}else {
			System.out.println("입력된 수 : "+i+"는 3의 배수가 아닙니다.");
		}
	}
}

MyThree.java

package com.javalec.spring_ex_3_5;

public class MyThree {
	private Three three;
	
	private int num;
	
	public void pc() {
		three.process(num);
	}

	public Three getThree() {
		return three;
	}

	public void setThree(Three three) {
		this.three = three;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}package com.javalec.spring_ex_3_5;

public class Three {
	public void process(int i) {
		if (i % 3 == 0) {
			System.out.println("입력된 수 : "+i+"는 3의 배수입니다.");
		}else {
			System.out.println("입력된 수 : "+i+"는 3의 배수가 아닙니다.");
		}
	}
}package com.javalec.spring_ex_3_5;

public class Three {
	public void process(int i) {
		if (i % 3 == 0) {
			System.out.println("입력된 수 : "+i+"는 3의 배수입니다.");
		}else {
			System.out.println("입력된 수 : "+i+"는 3의 배수가 아닙니다.");
		}
	}
}package com.javalec.spring_ex_3_5;

public class Three {
	public void process(int i) {
		if (i % 3 == 0) {
			System.out.println("입력된 수 : "+i+"는 3의 배수입니다.");
		}else {
			System.out.println("입력된 수 : "+i+"는 3의 배수가 아닙니다.");
		}
	}
}
	
}

threeCTX.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 http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	
	<bean id="three" class="com.javalec.spring_ex_3_5.Three"></bean>

	<bean id="myThree" class="com.javalec.spring_ex_3_5.MyThree">
		<property name="three">
			<ref bean="three"/>
		</property>
		<property name="num" value="129"></property>
	</bean>

</beans>

MainThree.java

package com.javalec.spring_ex_3_5;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainThree {
	public static void main(String[] args) {
		String configLoc = "classpath:threeCTX.xml";
		AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
		//객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)
		
		MyThree mythree = ctx.getBean("myThree", MyThree.class);
		
		mythree.pc();
	}
}

예제 7

DivAndRemains.java

package com.javalec.spring_ex_3_6;

public class DivAndRemains {
	public void process(int num) {
		int ten = num / 10;
		int one = num % 10;
		
		if (one == ten ) {
			System.out.println("입력된 수 : "+ num+"는 10의 자리와 1의 자리가 같습니다.");
		}else {
			System.out.println("입력된 수 : "+ num+"는 10의 자리와 1의 자리가 다릅니다.");
		}
	}
}

MydivAndRemains.java

package com.javalec.spring_ex_3_6;

public class MyDivAndRemains {
	private DivAndRemains divAndRemains;
	
	private int num;
	
	public void pc() {
		divAndRemains.process(num);
	}

	public DivAndRemains getDivAndRemains() {
		return divAndRemains;
	}

	public void setDivAndRemains(DivAndRemains divAndRemains) {
		this.divAndRemains = divAndRemains;
	}

	public int getNum() {
		return num;
	}

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

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

	<bean id="divAndRemains" class="com.javalec.spring_ex_3_6.DivAndRemains"></bean>

	<bean id="myDivAndRemains" class="com.javalec.spring_ex_3_6.MyDivAndRemains">
		<property name="divAndRemains">
			<ref bean="divAndRemains"/>
		</property>
		<property name="num" value="77" ></property>
	</bean>

</beans>

DivAndRemains.java

package com.javalec.spring_ex_3_6;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainDivAndRemains {
	public static void main(String[] args) {
		String configLoc = "classpath:divAndRemainsCTX.xml";
		AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
		//객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)
		
		MyDivAndRemains myDivAndRemains = ctx.getBean("myDivAndRemains", MyDivAndRemains.class);
		
		myDivAndRemains.pc();
	}
}

예제 8

Rectangel.java

package com.javalec.spring_ex_3_7;

public class Rectangel {
	public void process(int x, int y) {
		if ( (x<= 100 && x <=200)&&  (y<= 100 && y <=200)) {
			System.out.println("("+x+","+y+")는 사각형 안에 있습니다.");
		}else {
			System.out.println("("+x+","+y+")는 사각형 안에 없습니다.");
		}
	}
}

MyRectangel.java

package com.javalec.spring_ex_3_7;

public class MyRectangel {
	private Rectangel rectangel;
	
	private int x;
	private int y;
	
	public void pc() {
		rectangel.process(x, y);
	}

	public Rectangel getRectangel() {
		return rectangel;
	}

	public void setRectangel(Rectangel rectangel) {
		this.rectangel = rectangel;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}
	
	
}

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

	<bean id="rectangel" class="com.javalec.spring_ex_3_7.Rectangel"></bean>
	
	
	<bean id="myRectangel" class="com.javalec.spring_ex_3_7.MyRectangel">
		<property name="rectangel">
			<ref bean="rectangel"/>
		</property>
		<property name="x" value="150"></property>
		<property name="y" value="150"></property>
	</bean>

</beans>

MainRectangel.java

package com.javalec.spring_ex_3_7;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainRectangel {
	public static void main(String[] args) {
		String configLoc = "classpath:rectangelCTX.xml";
		AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
		//객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)
		
		MyRectangel myRectangel = ctx.getBean("myRectangel", MyRectangel.class);
		
		myRectangel.pc();
	}
}

예제 9

Median.java

package com.javalec.spring_ex_3_8;

public class Median {
	public void process(int a, int b, int c) {
		if ((a<b && b<c)||(c<b && b<a)) {
			System.out.println("입력된 정수가 "+a+"와 "+b+"와 "+c+"의 중간값은 "+b);
		}else if ((b<a && a<c)||(c<a && a<b))  {
			System.out.println("입력된 정수가 "+a+"와 "+b+"와 "+c+"의 중간값은 "+a);
		}else if ((b<c && c<a)||(a<c && c<b)) {
			System.out.println("입력된 정수가 "+a+"와 "+b+"와 "+c+"의 중간값은 "+c);
		}
	}
}

MyMedian.java

package com.javalec.spring_ex_3_8;

public class MyMedian {
	private Median median;
	
	private int num1;
	private int num2;
	private int num3;
	
	public void pc() {
		median.process(num1,num2,num3);
	}

	public Median getMedian() {
		return median;
	}

	public void setMedian(Median median) {
		this.median = median;
	}

	public int getNum1() {
		return num1;
	}

	public void setNum1(int num1) {
		this.num1 = num1;
	}

	public int getNum2() {
		return num2;
	}

	public void setNum2(int num2) {
		this.num2 = num2;
	}

	public int getNum3() {
		return num3;
	}

	public void setNum3(int num3) {
		this.num3 = num3;
	}

	
}

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

	<bean id="median" class="com.javalec.spring_ex_3_8.Median"></bean>

	<bean id="myMedian" class="com.javalec.spring_ex_3_8.MyMedian" >
		<property name="median">
			<ref bean="median"/>
		</property>
		<property name="num1" value="20"></property>
		<property name="num2" value="100"></property>
		<property name="num3" value="33"></property>
	</bean>
</beans>

MainMedian.java

package com.javalec.spring_ex_3_8;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainMedian {
	public static void main(String[] args) {
		String configLoc = "classpath:medianCTX.xml";
		AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
		//객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)
		
		MyMedian myMedian = ctx.getBean("myMedian",MyMedian.class);
		
		myMedian.pc();
	}
}

예제 10

EvenNumber.java

package com.javalec.spring_ex_3_9;

public class EvenNumber {
	public void process(int num) {
		int sum=0;
		for (int j = 0; j <=num ; j+=2) {
			sum+=j;
		}
		System.out.println(num+"까지의 짝수들의 합은 "+sum);
	}
}

MyEvenNumber.java

package com.javalec.spring_ex_3_9;

public class MyEvenNumber {
	private EvenNumber evenNumber;
	
	private int num;
	
	public void pc() {
		evenNumber.process(num);
	}

	public EvenNumber getEvenNumber() {
		return evenNumber;
	}

	public void setEvenNumber(EvenNumber evenNumber) {
		this.evenNumber = evenNumber;
	}

	public int getNum() {
		return num;
	}

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

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

	
	<bean id="evenNumber" class="com.javalec.spring_ex_3_9.EvenNumber"></bean>

	<bean id="myEvenNumber" class="com.javalec.spring_ex_3_9.MyEvenNumber">
		<property name="evenNumber">
			<ref bean="evenNumber"/>
		</property>
		<property name="num" value="10"></property>
	</bean>
</beans>

MainEvenNumber.java

package com.javalec.spring_ex_3_9;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainEvenNumber {
	public static void main(String[] args) {
		String configLoc = "classpath:evenNumberCTX.xml";
		AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
		//객체 정보를 가지고 와서 AbstractApplicationContext로 받음(업캐스팅 발생)
		
		MyEvenNumber myEvenNumber = ctx.getBean("myEvenNumber", MyEvenNumber.class);
		
		myEvenNumber.pc();
	}
}

예제 11

Capital.java

package com.javalec.spring_ex_3_10;

public class Capital {
	public void alphabet(String str) {
		char c ='A';
		char c2 = str.charAt(0);
		
		for (char i = c2; i >= c; i--) {
			for (char j = c; j <= i; j++) {
				System.out.print(j);
			}
			System.out.println();
		}
	}
}

MyCapital.java

package com.javalec.spring_ex_3_10;

public class MyCapital {
	private Capital capital;
	private String str;
	
	public void alpha() {
		capital.alphabet(str);
	}

	public Capital getCapital() {
		return capital;
	}

	public void setCapital(Capital capital) {
		this.capital = capital;
	}

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}
}

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

	<bean id="capital" class="com.javalec.spring_ex_3_10.Capital"></bean>

	<bean id="myCapital" class="com.javalec.spring_ex_3_10.MyCapital">
		<property name="capital">
			<ref bean="capital"/>
		</property>
		<property name="str" value="F"></property>
	</bean>
</beans>

MainCapital.java

package com.javalec.spring_ex_3_10;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainCapital {
	public static void main(String[] args) {
		String configLoc = "classpath:capitalCTX.xml";
		AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
		
		MyCapital myCapital =ctx.getBean("myCapital",MyCapital.class);
		
		myCapital.alpha();
	}
}

chap4. DI - 2

스프링 프로퍼티 설정

스프링 컨테이너

: 자바객체의 생명주기를 관리하며 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할
여기서 자바 객체를 스프링에서는 Bean이라고 함.

DI와 IoC의 원리가 스프링 컨테이너에 적용됨

개발자는 NEW연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸 시킬 수있는데 스프림 컨테이너가 이 역할을 대신해줌. → 제어흐름을 외부에서 관리
객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 만들어 줌

예제 1

BMICalculator.java

package com.javalec.spring_4_1;

public class BMICalculator {
	private double lowWeight;
	private double normal;
	private double overWeight;
	private double obesity;
	
	public void bmiCalculator(double weight , double height) {
		double h = height * 0.01;
		double result = weight / (h*h);
		
		System.out.println("BMI 지수 : "+(int)result);
		
		if (result>obesity) {
			System.out.println("비만입니다.");
		}else if (result>overWeight) {
			System.out.println("과체중입니다.");
		}else if (result>normal) {
			System.out.println("정상입니다..");
		}else {
			System.out.println("저체중입니다.");
		}
	}
	
	public double getLowWeight() {
		return lowWeight;
	}
	public void setLowWeight(double lowWeight) {
		this.lowWeight = lowWeight;
	}
	public double getNormal() {
		return normal;
	}
	public void setNormal(double normal) {
		this.normal = normal;
	}
	public double getOverWeight() {
		return overWeight;
	}
	public void setOverWeight(double overWeight) {
		this.overWeight = overWeight;
	}
	public double getObesity() {
		return obesity;
	}
	public void setObesity(double obesity) {
		this.obesity = obesity;
	}
}

MyInfo.java

package com.javalec.spring_4_1;

import java.util.ArrayList;

public class MyInfo {
	private String name;
	private double height;
	private double weight;
	private ArrayList<String> hobbys;
	private BMICalculator bmiCalculator;
	
	
	public void bmiCalculator() {
		bmiCalculator.bmiCalculator(weight, height);
	}
	//몸무게와 키 필드값을 넘김
	
	public void getInfo() {
		System.out.println("이름: "+name);
		System.out.println("키: "+height);
		System.out.println("몸무게: "+weight);
		System.out.println("취미: "+hobbys);
		
		bmiCalculator();
	}
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	public ArrayList<String> getHobbys() {
		return hobbys;
	}
	public void setHobbys(ArrayList<String> hobbys) {
		this.hobbys = hobbys;
	}
	public BMICalculator getBmiCalculator() {
		return bmiCalculator;
	}
	public void setBmiCalculator(BMICalculator bmiCalculator) {
		this.bmiCalculator = bmiCalculator;
	}
	
	

}

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

	<bean id="bmiCalculator" class="com.javalec.spring_4_1.BMICalculator">
		<property name="lowWeight" value="18.5"></property>
		<property name="normal">
			<value>23</value>
		</property>
		<property name="overWeight">
			<value>25</value>
		</property>
		<property name="obesity">
			<value>30</value>
		</property>
	</bean>
	
	<bean id="myInfo" class="com.javalec.spring_4_1.MyInfo">
		<property name="name">
			<value>홍길동</value>
		</property>
		<property name="height">
			<value>187</value>
		</property>
		<property name="weight">
			<value>84</value>
		</property>
		<property name="hobbys">
			<list>
				<value>수영</value>
				<value>요리 </value>
				<value>독서</value>
			</list>
		</property>
		<property name="bmiCalculator">
			<ref bean="bmiCalculator"/>
		</property>
	</bean>
</beans>

MainClass.java

package com.javalec.spring_4_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	public static void main(String[] args) {
		String configLoc =  "classpath:myInfoCTX.xml";
		AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
		MyInfo myInfo = ctx.getBean("myInfo",MyInfo.class);
		
		myInfo.getInfo();
		ctx.close();
	
	}
}

Char5 DI 활용

의존관계

Student가 StudentInfo에 의존하고 있으며, 값을 StudentInfo에서 세팅하고 생성

예제 2

Student.java

package com.javalec.spring_5_1;

public class Student {
	private String name;
	private String age;
	private String gradeNum;
	private String ClassNum;
	
	public Student(String name, String age, String gradeNum, String classNum) {
		this.name = name;
		this.age = age;
		this.gradeNum = gradeNum;
		ClassNum = classNum;
	}
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getGradeNum() {
		return gradeNum;
	}
	public void setGradeNum(String gradeNum) {
		this.gradeNum = gradeNum;
	}
	public String getClassNum() {
		return ClassNum;
	}
	public void setClassNum(String classNum) {
		ClassNum = classNum;
	}
}

StudentInfo.java

package com.javalec.spring_5_1;

public class StudentInfo {
	private Student student;
	
	public StudentInfo(Student student) {
		this.student = student;
	}

	public void getStudentInfo() {
		System.out.println("이름: "+student.getName());
		System.out.println("나이: "+student.getAge());
		System.out.println("학년: "+student.getGradeNum());
		System.out.println("반: "+student.getClassNum());
		System.out.println("=========================");
	}

	public void setStudent(Student student) {
		this.student = student;
	}
}

applicationCTX.xml

=> 생성자에서 설정한 매개변수만큼 constructor의 값을 입력 필요

<?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="student1" class="com.javalec.spring_5_1.Student">
		<constructor-arg>
			<value>홍길동</value>
		</constructor-arg>
		<constructor-arg>
			<value>10</value>
		</constructor-arg>
		<constructor-arg>
			<value>3학년</value>
		</constructor-arg>
		<constructor-arg>
			<value>2</value>
		</constructor-arg>
	</bean>
	
	
	<bean id="student2" class="com.javalec.spring_5_1.Student">
		<constructor-arg value="홍길순"></constructor-arg>
		<constructor-arg value="9살"></constructor-arg>
		<constructor-arg value="2학년"></constructor-arg>
		<constructor-arg value="1반"></constructor-arg>
	</bean>

	<bean id="studentInfo" class="com.javalec.spring_5_1.StudentInfo">
		<constructor-arg>
			<ref bean="student1"/>
		</constructor-arg>
	</bean>
</beans>

MainClass.java

package com.javalec.spring_5_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	public static void main(String[] args) {
		String configLoc = "classpath:applicationCTX.xml";
		AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
		StudentInfo studentInfo = ctx.getBean("studentInfo", StudentInfo.class);
		studentInfo.getStudentInfo();//student1 호출
	
		Student student2 = ctx.getBean("student2",Student.class);
		//student1는 studentInfo으로 받음
		studentInfo.setStudent(student2);//student2 세팅
		studentInfo.getStudentInfo();
		
		ctx.close();//자원 반납
	}
}

DI 사용에 따른 장점

pencil이라는 인터페이스를 사용하여 각각 클래스에서 상속받아 사용가능함.

의존관계를 인터페이스로 추상화하여 다양한 의존 관계를 맺을 수 있음

예제 3

Pencil.java(Interface)

package com.javalec.spring_5_2;

public interface Pencil {
	public void use();
}

Pencil4B

package com.javalec.spring_5_2;

public class Pencil4B implements Pencil {
	
	@Override
	public void use() {
		System.out.println("4B 입니다.");
	}
}

Pencil6B

package com.javalec.spring_5_2;

public class Pencil6B implements Pencil{
	
	@Override
	public void use() {
		System.out.println("6B 입니다.");
		}
	
}

Pencil6BWithEraser

package com.javalec.spring_5_2;

public class Pencil6BWithEraser implements Pencil{
	 
	@Override
	public void use() {
		System.out.println("6B이고,지우개가 있습니다.");
		}
}

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

	<bean id="pencil" class="com.javalec.spring_5_2.Pencil6BWithEraser"></bean>
	<bean id="pencil2" class="com.javalec.spring_5_2.Pencil6B"></bean>
	<bean id="pencil3" class="com.javalec.spring_5_2.Pencil4B"></bean>
	
	
</beans>

MainClass.java

package com.javalec.spring_5_2;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	public static void main(String[] args) {
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml");
		Pencil pencil = ctx.getBean("pencil",Pencil.class);
//		Pencil pencil = ctx.getBean("pencil2",Pencil.class);
//		Pencil pencil = ctx.getBean("pencil3",Pencil.class);
		pencil.use();

		Pencil pencil2 = ctx.getBean("pencil2",Pencil.class);
		pencil2.use();
	
		Pencil pencil3 = ctx.getBean("pencil3",Pencil.class);
		pencil3.use();

		ctx.close();
	}
}
}

예제 4

Circle.java

package com.javalec.spring_ex_5_1;

public class Circle {
	private int radius;
	public Circle(int radius) {
		super();
		this.radius = radius;
	}
	

	public double process() {
		return 3.14*radius*radius;
	}
	
	public int getRadius() {
		return radius;
	}

	public void setRadius(int radius) {
		this.radius = radius;
	}

	
}

CircleInfo.java

package com.javalec.spring_ex_5_1;

public class CircleInfo {
	private Circle circle;

	public void setCircle(Circle circle) {
		this.circle = circle;
	}

	public CircleInfo(Circle circle) {
		this.circle = circle;
	}
	
	public void getCircleInfo() {
		if (circle != null) {
			System.out.println("반지름:"+circle.getRadius());	
			System.out.println("원의 면적은: "+circle.process());	
		}
	}
	
	
}

circleCTX.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 http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<bean id="circle1" class="com.javalec.spring_ex_5_1.Circle">
		<constructor-arg>
			<value>10</value>
		</constructor-arg>
	</bean>
	
	<bean id="circle2" class="com.javalec.spring_ex_5_1.Circle">
		<constructor-arg>
			<value>5</value>
		</constructor-arg>
	</bean>

	<bean id="circleInfo" class="com.javalec.spring_ex_5_1.CircleInfo">
		<constructor-arg>
			<ref bean="circle1"/>
		</constructor-arg>
	</bean>
</beans>

MainClass.java

package com.javalec.spring_ex_5_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	public static void main(String[] args) {
		String configLoc = "classpath:circleCTX.xml";
		AbstractApplicationContext ctx =  new GenericXmlApplicationContext(configLoc);
		CircleInfo circleInfo = ctx.getBean("circleInfo",CircleInfo.class);
		circleInfo.getCircleInfo();//circle1의 정보 가지고 옴.
		
		Circle circle2 = ctx.getBean("circle2",Circle.class);
		circleInfo.setCircle(circle2);
		circleInfo.getCircleInfo();
		
		ctx.close();
		
	}
}

Char 6. DI설정 방법

XML 파일을 이용한 DI 설정 방법

1.xml을 이용하여 설정(기존 방식)

  1. 두개의 bean.xml 생성하여 가지고 오는 방법

  1. xmlns:c="http://www.springframework.org/schema/c"
    xmlns:p="http://www.springframework.org/schema/p"를 사용하는 방법
    c : 생성자(constructor)
    p : 성분, 필드(property)

예제 5

Student.java

package com.javalec.spring_6_1;

import java.util.ArrayList;

public class Student {
	private String name;
	private int age;
	private ArrayList<String> hobbys;
	private double height;
	private double weight;
	
	public Student(String name, int age, ArrayList<String> hobbys) {
		super();
		this.name = name;
		this.age = age;
		this.hobbys = hobbys;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public ArrayList<String> getHobbys() {
		return hobbys;
	}
	public void setHobbys(ArrayList<String> hobbys) {
		this.hobbys = hobbys;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
}

StudentInfo.java

package com.javalec.spring_6_1;

public class StudentInfo {
	private Student student;

	public Student getStudent() {
		return student;
	}

	public void setStudent(Student student) {
		this.student = student;
	}
	
	
}

Family.java

package com.javalec.spring_6_1;

public class Family {
	String papaName;
	String mamiName;
	String sisterName;
	String brotherName;
	
	
	
	public Family(String papaName, String mamiName) {
		super();
		this.papaName = papaName;
		this.mamiName = mamiName;
	}
	
	
	
	public String getPapaName() {
		return papaName;
	}
	public void setPapaName(String papaName) {
		this.papaName = papaName;
	}
	public String getMamiName() {
		return mamiName;
	}
	public void setMamiName(String mamiName) {
		this.mamiName = mamiName;
	}
	public String getSisterName() {
		return sisterName;
	}
	public void setSisterName(String sisterName) {
		this.sisterName = sisterName;
	}
	public String getBrotherName() {
		return brotherName;
	}
	public void setBrotherName(String brotherName) {
		this.brotherName = brotherName;
	}

}

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

	<bean id="student1" class="com.javalec.spring_6_1.Student">
		<constructor-arg value="홍길동"></constructor-arg>
		<constructor-arg value="10"></constructor-arg>
		<constructor-arg>
			<list>
				<value>수영</value>
				<value>요리</value>
			</list>
		</constructor-arg>
		<property name="height">
			<value>187</value>
		</property>
		<property name="weight">
			<value>84</value>
		</property>
	</bean>
<!-- 안에 매개변수 (생성자) 넣지 않으면 오류 발생함 -->

	<bean id="studentInfo1" class="com.javalec.spring_6_1.StudentInfo">
		<property name="student">
			<ref bean="student1"/>
		</property>
	</bean>
	

</beans>

applicationCTX1.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"
	xmlns:c="http://www.springframework.org/schema/c"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="student3" class="com.javalec.spring_6_1.Student">
		<constructor-arg value="홍길자"></constructor-arg>
		<constructor-arg value="8"></constructor-arg>
		<constructor-arg>
			<list>
				<value>줄넘기</value>
				<value>공기놀이</value>
			</list>	
		</constructor-arg>
		<property name="height">
			<value>126</value>
		</property>
		<property name="weight">
			<value>21</value>
		</property>
	</bean>
	
	<!-- <bean></bean> 안에 매개변수 (생성자) 넣지 않으면 오류 발생함 -->
	
	<bean id="family" class="com.javalec.spring_6_1.Family" c:papaName="홍아빠" c:mamiName="홍엄마" p:sisterName="홍누나">
		<property name="brotherName" value="홍오빠"></property>
	</bean>
<!-- p:와 property는 동일함. c:와 constructor와 동일함.  -->	
	
</beans>

MainClass.java

package com.javalec.spring_6_1;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	public static void main(String[] args) {
		String configLoc1 = "classpath:applicationCTX.xml";
		
		// 추가된 부분1//
		String configLoc2 = "classpath:applicationCTX1.xml";
		
//		AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLoc1);
		//변경된 부분 1//
		AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLoc1,configLoc2);
		
		// 추가 및 변경된 부분1 끝//
		
		
		Student student1 =	ctx.getBean("student1", Student.class);
		System.out.println(student1.getName());
		System.out.println(student1.getHobbys());
		
		StudentInfo studentInfo = ctx.getBean("studentInfo1",StudentInfo.class);
		Student student2 = studentInfo.getStudent();
		System.out.println(student2.getName());
		System.out.println(student2.getHobbys());
		
		
		if (student1.equals(student2)) {
			System.out.println("student1 == student2 ");
		} else {
			System.out.println("student1 != student2 ");
		}
		
		
		//추가된 부분1 // 
		Student student3 = ctx.getBean("student3",Student.class);
		System.out.println(student3.getName());
		System.out.println(student3.getHobbys());
		
		if (student1.equals(student3)) {
			System.out.println("student1 == student3 ");
		} else {
			System.out.println("student1 != student3 ");
		}
		
		Family family = ctx.getBean("family",Family.class);
		System.out.println(family.getPapaName());
		System.out.println(family.getMamiName());
		System.out.println(family.getSisterName());
		System.out.println(family.getBrotherName());
		// 추가된 부분1 끝//
	}
}

JAVA를 사용한 DI 설정 방법


hobbys객체에 add()로 값을 넣고(수영, 요리)
Student에 매개변수로 hobbys를 넣고, 키와 몸무게를 세팅하여 student 객체의 값들을 모두 리턴함

예제 5

Student.java

package com.javalec.spring_6_2;

import java.util.ArrayList;

public class Student {
	private String name;
	private int age;
	private ArrayList<String> hobbys;
	private double height;
	private double weight;
	
	public Student(String name, int age, ArrayList<String> hobbys) {
		super();
		this.name = name;
		this.age = age;
		this.hobbys = hobbys;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public ArrayList<String> getHobbys() {
		return hobbys;
	}
	public void setHobbys(ArrayList<String> hobbys) {
		this.hobbys = hobbys;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
}

ApplicationConfig.java

package com.javalec.spring_6_2;

import java.util.ArrayList;

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

@Configuration
public class ApplicationConfig {
	@Bean
	public Student student1() {
		ArrayList<String> hobbys = new ArrayList<String>();
		hobbys.add("수영");
		hobbys.add("요리");
		
		Student student = new Student("홍길동", 20, hobbys);
		student.setHeight(180);
		student.setWeight(80);
		
		return student;
	}
	
	@Bean
	public Student student2() {
		ArrayList<String> hobbys = new ArrayList<String>();
		hobbys.add("독서");
		hobbys.add("음악감상");
		
		Student student = new Student("홍길순", 18, hobbys);
		student.setHeight(170);
		student.setWeight(55);
		
		return student;
	}
}

cglib 추가 필요(pom.xml)

<!-- cglib -->
		<dependency>
		    <groupId>com.kenai.nbpwr</groupId>
		    <artifactId>net-sf-cglib</artifactId>
		    <version>2.1.3-201003011305</version>
		</dependency>

MainClass.java

package com.javalec.spring_6_2;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainClass {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx =  new AnnotationConfigApplicationContext(ApplicationConfig.class);
		Student student1 = ctx.getBean("student1",Student.class);
		System.out.println("이름 :"+student1.getName());
		System.out.println("나이 :"+student1.getAge());
		System.out.println("취미 :"+student1.getHobbys());
		System.out.println("신장 :"+student1.getHeight());
		System.out.println("몸무게 :"+student1.getWeight());
	
		System.out.println("========================================");

		
		Student student2 = ctx.getBean("student2",Student.class);
		System.out.println("이름 :"+student2.getName());
		System.out.println("나이 :"+student2.getAge());
		System.out.println("취미 :"+student2.getHobbys());
		System.out.println("신장 :"+student2.getHeight());
		System.out.println("몸무게 :"+student2.getWeight());
		
	}
}

reference

0개의 댓글