Jam's story

[Spring] 뉴렉처강의_DI 본문

Spring

[Spring] 뉴렉처강의_DI

애플쩀 2022. 7. 12. 00:09

결합력이 낮은 느슨한 코드를 사용하자

출처: 뉴렉처

DI(의존성주입) ->객체를 조립해준다

 

일체형과 조립형에 대해 알아보자

 

좌측이 일체형 우측이 조립형

조립형으로 하게되면 , setter를 이용하여 부품을 꽂아줄 수 있다.

조립형의 방법-> setter과 생성자주입

 

 

LOC 컨테이너

부품들을 담고 있는 것 

 

 

예제 )Dependecy Injection - 우선 자바코드로

Program.java

package spring.di;

import spring.di.entity.Exam;
import spring.di.entity.GridExamConsole;
import spring.di.entity.NewlecExam;
import spring.di.ui.ExamConsole;
import spring.di.ui.InlineExamConsole;

public class Program {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	//Exam은 인터페이스 , NewlecExam 구현 클래스 
		Exam exam=new NewlecExam();
		
		//이렇게 조립하는 것이 DI 
       //ExamConsole은 인터페이스 , InlineExamConsole구현 클래스 
		//ExamConsole console=new InlineExamConsole(exam);
		ExamConsole console=new GridExamConsole(exam);
		console.print();
	}

}

 

Exam.java

package spring.di.entity;

public interface Exam {
	int total();
	float avg();
	
}

 

 

NewLecExam.java

Exam인터페이스의 구현클래스

package spring.di.entity;

public class NewlecExam implements Exam {

	private int kor;
	private int eng;
	private int math;
	private int com;
	
	@Override
	public int total() {
		// TODO Auto-generated method stub
		return kor+eng+math+com;
	}

	@Override
	public float avg() {
		// TODO Auto-generated method stub
		return total()/4.0f;
	}

}

 

ExamConsole.java 인터페이스

package spring.di.ui;

public interface ExamConsole {
	void print();
}

 

InlineExamConsole.java

ExamConsole인터페이스의 구현클래스

  • 생성자를 통해서 인터페이스를 물려받기때문에, 물려받을 인터페이스 객체를 생성
package spring.di.ui;

import spring.di.entity.Exam;

public class InlineExamConsole implements ExamConsole {

	//물려받기 때문에 생성자추가 
	private Exam exam;

	public InlineExamConsole(Exam exam) {
		super();
		this.exam = exam;
	}


	public void print() {
		System.out.printf("total is %d ,avg is %f\n", exam.total(), exam.avg() );
	}

}

 

 GridExamConsole.java()

package spring.di.entity;

import spring.di.ui.ExamConsole;

public class GridExamConsole implements ExamConsole {
	private Exam exam;

	public GridExamConsole(Exam exam) {
		super();
		this.exam = exam;
	}

	@Override
	public void print() {
		// TODO Auto-generated method stub
System.out.printf("Grid: total: %d ,avg:%3.2f ",exam.total(), exam.avg());

	}

}

 

 

이제 스프링을 통해서 DI

Spring Di 지시서 작성하기

 

setting.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-3.0.xsd">
   <!--         Exam exam =new NewlecExam(); -->
<!--    id= 변수명 , class=어떤 클래스를 요청할것인지  -->
   <bean id="exam" class="spring.di.entity.NewlecExam">
   </bean>
   
  <!--  ExamConsole console=new GridExamConsole(); -->
  <bean id="console" class="spring.di.entity.GridExamConsole"/>
  
<!-- console2.setExam(exam); -->
<bean id="console2" class="spring.di.entity.GridExamConsole">
<!-- set을 빼고 첫문자는 소문자로  -->
<!-- <property name="exam"  value="" ref=""></property> -->
<!--s pring.di.entity.GridExamConsole에 setter가 있어야함  -->
<property name="exam"  ref="exam"></property>
</bean>
           </beans>

 

Program.java

package spring.di;
import spring.di.ui.ExamConsole;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Program {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	//Exam은 인터페이스 , NewlecExam 구현 클래스 
		//Exam exam=new NewlecExam();
		
		//이렇게 조립하는 것이 DI 
		//ExamConsole console=new InlineExamConsole(exam);
		//ExamConsole console=new GridExamConsole(exam);
		
		//setter
		/*
		 * ExamConsole console=new GridExamConsole(); console.setexam(exam);
		 * console.print();
		 */
		
		ApplicationContext context=new ClassPathXmlApplicationContext("spring/di/setting.xml");
		
//		console 이름에 담긴 것을 ,가져와라 
//		이름에 대한 객체의 형식을 알 수 없기때문에 형식변환을 해야한다. 
		ExamConsole console=(ExamConsole)context.getBean("console");
		
		ExamConsole console2=context.getBean(ExamConsole.class);
		console.print();
		
	}

}

 

Comments