2020년 10월 3일 토요일

스프링 XML기반 DI/IoC 세터주입/생성자주입(Xml based Injection, setter/constructor)(자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원)


스프링 XML기반 DI/IoC 세터주입/생성자주입(Xml based Injection, setter/constructor)(자바교육/스프링교육/SpringFramework/스프링프레임워크/스프링학원/자바학원) 

 


1. XML 기반 DI

Spring5 에서 어노테이션 기반으로 DI를 하는 방법은 3가지이다. (Constructor Injection, Setter Injection, Field Injection)

XML 기반인 경우에는 Constructor Injection, Setter Injection 만 가능하다.(Bean 요소의 constructor-arg, property 태그를 통해)


2. XML 기반 DI(세터 주입)

XML기반 Setter 주입은 클래스 파일의 set * 메서드를 사용하고, 스프링 XML 설정에서 Property 태그를 이용하여 빈을 주입한다.

<bean id=“empDao" class=“xmlinjection.EmpDao“/>

<bean id=“empService" class=“xmlinjection.EmpService">

   <property name=“empDao" ref=“empDao”/>

</bean>

<bean id=“empController" class=“xmlinjection.EmpController">

        <property name=“empService" ref=“empService”/>

</bean>

Spring은 메소드 이름에서 "set"뒤의 첫 글자를 소문자로하고 나머지 메소드 이름을 그대로 사용하여 속성 이름을 추론한다. 클래스에 setEmpService()라는 세터가 있을 경우 속성이름은 empService가 된다.

“set”뒤의 문자가 모두 대문자 인 경우 Spring은 속성 이름을 대문자로 유지한다. 따라서 클래스에 setXML()이있는 경우 속성 이름은 'XML'이 된다.




3. XML 기반 DI(생성자 주입)


생성자를 통해 객체를 주입 받는 방법으로 가장 권장하는 방법이다. 어노테이션 방식인 경우 스프링4.3 이후 생성자가 하나인 경우 @Autowired를 생략가능하다.

<bean id=“empDao" class=“xmlinjection.EmpDao“/>

<bean id=“empService" class=“xmlinjection.EmpService">

   <!– 파라미터 하나인 경우 index 생략가능 

   <constructor-arg index=“0” ref=“empDao”/>

</bean>

<bean id=“empController" class=“xmlinjection.EmpController">

    <constructor-arg index=“0” ref=“empService”/>

</bean>

의존하는 객체를 주입하지 않을 경우 객체생성 불가능하므로 반드시 주입되어야 한다. 의존관계를 외부로 노출시킴으로서 컴파일 타임에 오류를 확인할 수 있다.

주입받는 변수를 final로 선언 가능하다. 생성 한 이후 객체참조변수의 값을 바꿀 수 없다.

생성자 주입에서 순환 의존성을 가질 경우 BeanCurrentlyCreationExeption이 발생되어 오류를 확인할 수 있다.


4. XML기반 세터주입 실습


db3d955e8763692214ca113c1ff03603_1601725


------------pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>xmlinjection</groupId>

<artifactId>xmlinjection</artifactId>

<version>0.0.1-SNAPSHOT</version>

<name>xmlinjection</name>

<description>xmlinjection</description>


<properties>

<java-version>1.8</java-version>

<org.springframework-version>5.2.9.RELEASE</org.springframework-version>

</properties>


<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${org.springframework-version}</version>

</dependency>

</dependencies>


<build>

<sourceDirectory>src</sourceDirectory>

<plugins>

<plugin>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.8.1</version>

<configuration>

<source>1.8</source>

<target>1.8</target>

</configuration>

</plugin>

</plugins>

</build>


</project>



------------- Emp.java

package xmlinjection;


/*

 * Model

 */

public class Emp {

private String empno;

private String ename;


public Emp(String empno, String ename) {

super();

this.empno = empno;

this.ename = ename;

}


@Override

public String toString() {

return "Emp [empno=" + empno + ", ename=" + ename + "]";

}


public String getEmpno() {

return empno;

}


public void setEmpno(String empno) {

this.empno = empno;

}


public String getEname() {

return ename;

}


public void setEname(String ename) {

this.ename = ename;

}


}



---------------- EmpDao.java

package xmlinjection;


import java.util.ArrayList;

import java.util.List;


import org.springframework.stereotype.Repository;


public class EmpDao {

public List<Emp> getAllEmps() {

List<Emp> emps = new ArrayList<Emp>();

emps.add(new Emp("1", "이종철"));

emps.add(new Emp("2", "오라클자바커뮤니티"));

return emps;

}

}




--------------- EmpService.java

package xmlinjection;


import java.util.List;


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

import org.springframework.stereotype.Service;


public class EmpService {

private EmpDao empDao;

public void setEmpDao(EmpDao empDao) {

this.empDao = empDao;

}

public List<Emp> getAllEmps() {

return empDao.getAllEmps();

}

}




--------------------- EmpController.java


package xmlinjection;


import java.util.List;


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

import org.springframework.stereotype.Controller;

public class EmpController {

private EmpService empService;

public void setEmpService(EmpService empService) {

this.empService = empService;

}

public void getAllEmps() {

List<Emp> emps = empService.getAllEmps();

emps.forEach( emp -> System.out.println(emp) );  //jdk 1.8이상

}

}




------------------------ EmpTest.java

package xmlinjection;


import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;


public class EmpTest {

public static void main(String[] args) {

ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:setter.xml");

EmpController empController = factory.getBean(EmpController.class); 

empController.getAllEmps();

}

}




------------------ setter.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: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 id="empDao" class="xmlinjection.EmpDao" />

<bean id="empService" class="xmlinjection.EmpService ">

<property name="empDao" ref="empDao" />

</bean>

<bean id="empController" class="xmlinjection.EmpController">

<property name="empService" ref="empService" />

</bean>



</beans>


[실행]

Emp [empno=1, ename=이종철]

Emp [empno=2, ename=오라클자바커뮤니티]



5. XML기반 생성자주입 실습


------------------------ Emp.java


package xmlinjection;


/*

 * Model

 */

public class Emp {

private String empno;

private String ename;


public Emp(String empno, String ename) {

super();

this.empno = empno;

this.ename = ename;

}


@Override

public String toString() {

return "Emp [empno=" + empno + ", ename=" + ename + "]";

}


public String getEmpno() {

return empno;

}


public void setEmpno(String empno) {

this.empno = empno;

}


public String getEname() {

return ename;

}


public void setEname(String ename) {

this.ename = ename;

}


}



----------------------------- EmpDao.java

package xmlinjection;


import java.util.ArrayList;

import java.util.List;


import org.springframework.stereotype.Repository;


public class EmpDao {

public List<Emp> getAllEmps() {

List<Emp> emps = new ArrayList<Emp>();

emps.add(new Emp("1", "이종철"));

emps.add(new Emp("2", "오라클자바커뮤니티"));

return emps;

}

}




------------------------------- EmpService.java

package xmlinjection;


import java.util.List;


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

import org.springframework.stereotype.Service;


public class EmpService {

private EmpDao empDao;

public EmpService(EmpDao empDao) {

this.empDao = empDao;

}

public List<Emp> getAllEmps() {

return empDao.getAllEmps();

}

}



------------------------------------ EmpController.java


package xmlinjection;


import java.util.List;


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

import org.springframework.stereotype.Controller;

public class EmpController {

private EmpService empService;

public EmpController(EmpService empService) {

this.empService = empService;

}

public void getAllEmps() {

List<Emp> emps = empService.getAllEmps();

emps.forEach( emp -> System.out.println(emp) );  //jdk 1.8이상

}

}



------------------------------- EmpTest.java

package xmlinjection;


import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;


public class EmpTest {

public static void main(String[] args) {

ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:constructor.xml");

EmpController empController = factory.getBean(EmpController.class); 

empController.getAllEmps();

}

}



[실행]

Emp [empno=1, ename=이종철]

Emp [empno=2, ename=오라클자바커뮤니티]



-------------------------------------- constructor.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: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 id="empDao" class="xmlinjection.EmpDao" />

<bean id="empService" class="xmlinjection.EmpService ">

<constructor-arg index="0" ref="empDao"/>

</bean>

<bean id="empController" class="xmlinjection.EmpController">

<constructor-arg index="0" ref="empService"/>

</bean>


</beans>



#스프링세터주입, #스프링생성자주입, #세터주입, #생성자주입, #생성자주입어노테이션, #스프링DI, #SetterInjection, #세터주입어노테이션,  #스프링IoC, #SpringDI, #SpringIoC, #자바스프링, #Spring동영상, #Spring강의, #스프링프레임워크, #스프링교육, #스프링학원, #스프링강좌, #스프링강의, #자바학원, #자바, #스프링동영상, #자바동영상, #스프링프레임워크교육, #스프링프레임워크강의, #스프링프레임워크학원 

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...