본문 바로가기
Kosta DevOps 과정 280기/Java

DI와 XML 이용-2

by 롯슈83 2024. 8. 1.

p 라는 접두어를 이용하여 property 작성하기 

  • 먼저 beans 태그에 네임 스페이스를 넣고 그 이후 p라는 접두어를 이용해서 다음과 같이 값을 넣는다. 

  • 예제 코드
package exam03;

public class SmsSender {
	public void send() {
		System.out.println("메세지를 전송하였습니다.");
	}
}
package exam03;

public class SystemMonitor {
	private long periodTime;
	private SmsSender sender;
	
	public void setPeriodTime(long periodTime) {
		this.periodTime = periodTime;
	}

	public void setSender(SmsSender sender) {
		this.sender = sender;
	}

	public void monitor() {
		System.out.println(periodTime +"분 간격으로");
		sender.send();
		System.out.println("----------------------------------");
	}
}
<?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: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="smsSender" class="exam03.SmsSender" />
	<bean id="systemMonitor" class="exam03.SystemMonitor" 
		p:periodTime="10"
		p:sender-ref="smsSender"
	/>
</beans>
package exam03;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("exam03/beans.xml");
		SystemMonitor sm= (SystemMonitor)context.getBean("systemMonitor");
		sm.monitor();
	}
}

 

 

  • 이 때 namespace 를 추가하여 p 를 추가할 수도 있다.

비식별자 전달하기

  • 안에서 직접 객체를 생성하면 id 가 없이(비식별자) 생성할 수 있다.

  • 예제 코드
package exam04;

public class DeptVO {
	private int dno;
	private String dname;
	private String dloc;
	
	public void setDno(int dno) {
		this.dno = dno;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public void setDloc(String dloc) {
		this.dloc = dloc;
	}
	@Override
	public String toString() {
		return "DeptVO [dno=" + dno + ", dname=" + dname + ", dloc=" + dloc + "]";
	}
}

 

package exam04;

public class DeptDAO {
	private DeptVO deptVO;

	public void setDeptVO(DeptVO deptVO) {
		this.deptVO = deptVO;
	}

	public void insert() {
		System.out.println("부서를 등록하였습니다.");
		System.out.println(deptVO);
	}
	
	@Override
	public String toString() {
		return "DeptDAO [deptVO=" + deptVO + "]";
	}
}
<?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="dao" class="exam04.DeptDAO">
		<property name="deptVO">
			<bean class="exam04.DeptVO">
				<property name="dno" value="10" />
				<property name="dname" value="개발 1팀" />
				<property name="dloc" value="종각" />
			</bean>
		</property>
	</bean>
</beans>
package exam04;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("exam04/beans.xml");
		DeptDAO dao = (DeptDAO)context.getBean("dao");
		dao.insert();
	}
}

 

 

Java 컬렉션 프레임워크에서 list를 멤버로 가졌을 때 DI 와 XML

package exam05;

public interface Filter {
	public void pro();
}
package exam05;

public class ZipFilter implements Filter {

	@Override
	public void pro() {
		System.out.println("ZipFilter의 처리");
	}
}
package exam05;

public class HeaderFilter implements Filter {

	@Override
	public void pro() {
		System.out.println("HeaderFilter의 처리");
	}
}
package exam05;

public class EncryptionFilter implements Filter {

	@Override
	public void pro() {
		System.out.println("EncryptionFilter의 처리");
	}
}
package exam05;

import java.util.List;

public class ProtocolHandler {
	private List<Filter> filters;

	public void setFilters(List<Filter> filters) {
		this.filters = filters;
	}
	
	public void exec() {
		for(Filter filter:filters) {
			filter.pro();
		}
	}
}
<?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="zipFilter" class="exam05.ZipFilter" />
	<bean id="encryptionFilter" class="exam05.EncryptionFilter" />
	
	<bean id="ph" class="exam05.ProtocolHandler">
		<property name="filters">
			<list>
				<ref local="encryptionFilter" />
				<ref local="zipFilter" />
				<bean class="exam05.HeaderFilter" />
			</list>
		</property>
	</bean>
</beans>
package exam05;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("exam05/beans.xml");
		ProtocolHandler ph= (ProtocolHandler)context.getBean("ph");
		ph.exec();
	}
}

 

 

의존 관계 자동 설정

  • 의존관계가 복잡하거나 많아지게 되면 설정파일도 그만큼 복잡하고 커지게 된다. 
  • 의존 객체를 자동으로 설정하게 되면 설정 파일의 크기를 줄일 수 있다
  • byName : 프로퍼티 이름과, 이미 생성된 이름과 같아야한다. 같지 않으면, 아래의 이미지와 같이 에러가 난다. 
<?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="dao" class="exam06.MySqlArticleDao" />
    <!-- ws 객체의 속성이름과 위의 이름이 dao 로 같으므로 자동으로 의존관계가 설정된다.-->
	<bean id="ws" class="exam06.WriteArticleServiceImple" 
		autowire="byName"
	/>
	<!-- <bean id="ws" class="exam06.WriteArticleServiceImple">
		<property name="dao" ref="dao" />
	</bean> -->
</beans>

 

  • byType : 프로퍼티 타입을 체크하여 자동으로 의존관계 설정된다.
    • 동일 타입 객체 2개 이상이면 아래와 같이 예외 발생. 단, 동일한 타입 빈 객체 설정시 byType 할 수 있다.
<?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="mySqlArticleDao" class="exam07.MySqlArticleDao" />
    <!-- <bean id="mySqlArticleDao2" class="exam07.MySqlArticleDao" /> -->
	<bean id="ws" class="exam07.WriteArticleServiceImple" 
		autowire="byType"
	/>
</beans>

 

  • Constructor
  • autodetect – 생성자를 먼저 적용하고, byType에 의한 설정

 

빈 객체 범위

package exam08;

public class Person {
	private String name;
	private int age;
	
	
	public Person() {
		System.out.println("생성자 동작함");
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
<?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: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="kim" class="exam08.Person"
		p:name="김유신"
		p:age="20"
	/>
</beans>
package exam08;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {
	public static void main(String[] args) {
		System.out.println("1");
		ApplicationContext context = new ClassPathXmlApplicationContext("exam08/beans.xml");
		System.out.println("2");
		Person p1 = (Person)context.getBean("kim");
		Person p2 = (Person)context.getBean("kim");
		System.out.println("3");
		
		//동일 객체인지 확인
		if(p1 == p2) {
			System.out.println("서로 같은 객체를 참조함");
		}else {
			System.out.println("서로 다른 객체를 참조함");
		}
		
		//테스트
		p1.setAge(30);
		System.out.println(p1);
		System.out.println(p2);
	}
}

 

 

별도의 객체를 생성했으면 싶을 때 Bean 객체 범위를 지정할 수 있다.

  • sigleton : 스프링 컨테이너에 한 개의 객체만 존재(기본값)
    • xml 을 읽어들일 때 생성
  • prototype : 빈을 사용할 때 마다 생성
    • getBean 할 때 마다 생성
<?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: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="kim" class="exam08.Person"
		p:name="김유신"
		p:age="20"
		scope="prototype"
	/>
</beans>

  • request :  http 요청 마다 생성(WebApplicationContext에서 적용)
  • session :  http 세션 마다 생성(WebApplicationContext에서 적용)

'Kosta DevOps 과정 280기 > Java' 카테고리의 다른 글

MVC 패턴과 DI  (0) 2024.08.01
어노테이션 기반의 DI  (0) 2024.08.01
어제 복습  (0) 2024.08.01
DI 의 필요성  (0) 2024.07.31
스프링 베이직 시작 : 환경설정  (0) 2024.07.31