본문 바로가기

스프링 Spring

IoC 21. 03. 29.

.xml 네임스페이스

 

c: construct
p: property
tx: 트랜잭션
c랑 p는 주입 방법으로 쓸 수 있음. (생성자, 세터)

 

 

 

 

Setter Injection (Anno tation 기반)

 

Audi.java

package site.levinni.ioc4;

import javax.annotation.Resource;
import javax.inject.Inject;

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

@Component
public class Audi {
	@Inject
	private Car car;

	public Car getCar() {
		return car;
	}

	@Autowired
	public void setCar(Car car) {
		this.car = car;
	}
}

 

 

Car.java

package site.levinni.ioc4;

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

@Component
public class Car {
	@Value("r8")
	private String name;

	public Car() {}

	public Car(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

 

ioc4.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:p="http://www.springframework.org/schema/p"
	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-4.2.xsd">

<!-- 	<bean class="site.levinni.ioc4.Audi" id="audi" p:car-ref="car"></bean>
	<bean class="site.levinni.ioc4.Car" id="car" p:name="r8"></bean> -->
	
	<context:component-scan base-package="site.levinni.ioc4"></context:component-scan>
</beans>
주석부분 - Audi는 프로퍼티로 Car 타입을 가지고 있었고 Car의 id는 car이기 때문에 p:car-ref="car"이 되는 것.   

 

 

CarApp.java

package site.levinni.ioc4;

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

import ch.qos.logback.classic.net.SyslogAppender;

public class CarApp {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("ioc4.xml");
		Audi audi =ctx.getBean("audi", Audi.class);
		System.out.println(audi.getCar().getName());
		ctx.close();
	}
}
실행을 위한 메인 메소드
이 메인 메소드는 스프링식. 자바식으로 생각하면,

 

package site.levinni.ioc4;

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

import ch.qos.logback.classic.net.SyslogAppender;

public class CarApp {
	public static void main(String[] args) {
		Car car = new Car();
		car.setName("r8");
		
		Audi audi1 = new Audi();
		audi1.setCar(car);
		
		System.out.println(audi.getCar().getName());
	}
}
bean 하나가 객체 하나니깐 new 있는 만큼 빈을 만들어 주는 것!!

 

@Component냐 @Service냐는 해당 클래스가 빈으로 등록되어 있느냐 아니냐가 중요.
역할에 따라 Component, Service, Controller가 될 수 있음.

 

@AutoWired (Car를 주입)하려고 했을 때 주입 대상이 될 게 필드든, setter든 생성자든 상관 없음.
위 예제에서 getter에 @AutoWired 했을 때 NullPointer가 발생하는 건, audi.getCar()가 이미 null이기 때문.

 

 

@Inject, Autowired, Resource < 의존 객체 자동 주입 / 의존 객체를 찾는 방식이 다름.

@Inject는 maven에서 코드 복사 후 pom.xml에 복붙해야 라이브러리 추가됨.
@의 사용방식은 엄청 다채로움.

 

 

 

Constructor Injection (XML 기반)

 

Audi.java

package site.levinni.ioc5;

import javax.inject.Inject;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Service
public class Audi implements CarMaker{
	@Inject
	private Car car;
	public Audi() {	} // 기본생성자 반드시 있어야 함.

	public Audi(Car car) { // 추가생성자
		super();
		this.car = car;
	}

	public Car getCar() {
		return car;
	}

	@Override
	public Car sell(Money money) {
		// TODO Auto-generated method stub
		System.out.println(car.getName() + "의 차를 " + money.getAmount() + "의 가격으로 판매");
		return car;
	}

}
특정 빈을 가지고 생성할 때 이 빈은 자바빈 규칙을 따라야 함.

 

 

ioc5.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"
	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
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">

	<bean class="site.levinni.ioc5.Money" name="money" p:amount="2000"></bean>
	<bean class="site.levinni.ioc5.Car" name="car">
		<property name="name" value="a4"/>
	</bean>
	<bean class="site.levinni.ioc5.Audi" name="audi">
		<constructor-arg ref="car"/>
	</bean>	

</beans>
ref : setter에 주입할 bean(객체)의 이름

 

 

Method Injection

  • Method Replace
  • Getter Injection

Method Replace 예제

MagicBox.java

package site.levinni.magic;

public interface MagicBox {
	String getContent();
}

 

 

MagitBoxImpl.java

package site.levinni.magic;

public class MagicBoxImpl implements MagicBox {

	@Override
	public String getContent() {
		return "아름다운 아가씨";
	}
	
}

 

 

Magician.java

package site.levinni.magic;

public class Magician {
	private String magicWord;
	private MagicBox magicBox;
	public void setMagicWord(String magicWord) {
		this.magicWord = magicWord;
	}
	public void setMagicBox(MagicBox magicBox) {
		this.magicBox = magicBox;
	}
	
	public void magic() {
		System.out.println("마술 시작");
		System.out.println(magicWord);
		System.out.println("짜잔 상자 안에 " + magicBox.getContent());
	}
}

 

 

위 코드들로 수행할 것을 자바로 나타내면

	
		Magician magician = new Magician(); // DL을 통해 (겟빈)
		magician.setMagicWord("얍");
		magician.setMagicBox(new MagicBoxImpl()); // DI를 통해
		magician.magic();
new 만큼 빈 만들기!

 

 

magic.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 class="site.levinni.magic.Magician" id="magician">
		<property name="magicWord" value="얍"></property>
		<property name="magicBox">
			<bean class="site.levinni.magic.MagicBoxImpl"></bean> // 익명빈 형태
		</property>
	</bean>
</beans>

 

 

getContent() replace 할 것.

 

Tiger.java

package site.levinni.magic;

import java.lang.reflect.Method;
import java.util.Arrays;

import org.springframework.beans.factory.support.MethodReplacer;

public class Tiger implements MethodReplacer{

	@Override
	public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
		System.out.println("Tiger :: obj :: " + obj);
		System.out.println("Tiger :: method.getName() :: " + method.getName());
		System.out.println("Tiger :: args.length :: " + args.length);
		System.out.println("Tiger :: Arrays.toString(args) :: " + Arrays.toString(args));
		return "어흥";
		
	}
	
}

 

 

magic.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:context="http://www.springframework.org/schema/context"
	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
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">

	<bean class="site.levinni.magic.Magician" id="magician">
		<property name="magicWord" value="얍!"/>
		<property name="magicBox">
			<bean class="site.levinni.magic.MagicBoxImpl" id="magicBox"> <!-- 익명빈 -->
				<replaced-method name="getContent" replacer="tiger"/>
			</bean>
		</property>
	</bean>
	<bean class="site.levinni.magic.Tiger" id="tiger"/>
</beans>
아래에 tiger 빈 하나 만들고 익명빈 안에 replaced-mathod 넣은 형태.

obj는 MagicBoxImpl 타입. 배열의 길이는 파라미터 개수. getContent는 파라미터가 0개였음. 나중에 aop의 기본! ※ 필터는 요청과 응답 - 거대한 단위. 얘는 내부적으로 메소드 단위로 쪼갬.

 

 

 

 

Getter Injection 예제

 

Emp.java

package site.levinni.emp;

public abstract class Emp {
	private String name;
	private String work;
	
	public void setName(String name) {
		this.name = name;
	}

	public void setWork(String work) {
		this.work = work;
	}

	public void work() {
		System.out.println(getEmp() + "객체의 " + name + "이 " + work + "합니다.");
	}
	
	public abstract Emp getEmp();
	
}

 

 

Programmer.java, Designer.java

package site.levinni.emp;

public class Programmer extends Emp{

	@Override
	public Emp getEmp() {
		return this;
	}

}

 

 

 

중간 단계

 

익명 클래스 형태!!

 

 

 

 

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

	<bean class="site.levinni.emp.Programmer" id="programmer1">
		<property name="name" value="가가가 개발자"/>
		<property name="work" value="자바 프로그래밍"/>
	</bean>
	
	<bean class="site.levinni.emp.Programmer" id="programmer2" p:name="나나나 개발자" p:work="JSP"/>
	<bean class="site.levinni.emp.Designer" id="designer" p:name="다다다 디자이너" p:work="포토샵"/>
	<bean class="site.levinni.emp.Emp" id="emp">
		<lookup-method bean="programmer1" name="getEmp"/>
	</bean>
	<util:list value-type="site.levinni.emp.Emp" id="emps" list-class="java.util.ArrayList">
		<ref bean="programmer1"/>
		<ref bean="programmer2"/>
		<ref bean="designer"/>
	</util:list>
	<!-- <bean class="site.levinni.emp.AbClass" id="abclass"/> -->
</beans>
id와 name 차이 : 고유 유무. id는 절대 겹치면 안 됨. 
 -> id로 많이 쓰기.
id는 상속 관계인 xml 상에서도 유일한 값이어야 함.
name은 같은 문서에서만 겹치면 안 됨.
※ <import resource>는 꽤 쓰는데 xml 안에 다른 xml 파일 포함시킬 수 있음. (상속이 아닌 포함!)

Emp는 추상 클래스기 때문에 Emp로는 빈 생성 불가.
<bean class = ..Emp"/> 하면 InstantiationException 발생.

<lookup-method> : 인스턴스를 생성하는 시점에 메서드 탐색(?)

 

 

EmpApp.java

 

package site.levinni.emp;

import java.lang.reflect.Array;
import java.util.ArrayList;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class EmpApp {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("emp.xml");
		
		Emp[] emps = new Emp[3];
		emps[0] = ctx.getBean("programmer1", Emp.class);
		emps[1] = ctx.getBean("programmer2", Emp.class);
		emps[2] = ctx.getBean("designer", Emp.class);
		
		for (Emp e : emps) {
			e.work();
		}
		
		System.out.println(emps[0] instanceof Emp);
		System.out.println(emps[0] instanceof Programmer);
		System.out.println(emps[0] instanceof Designer);

	}
}

emps[0]이 Emp의 인스턴스인지 물어봤을 때 true기 때문에 Programmer.class뿐만 아니라 Emp.class도 되는 것!

 

 

 

EmpApp.java - xml에서 <util:list>를 이용

package site.levinni.emp;

import java.lang.reflect.Array;
import java.util.ArrayList;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class EmpApp {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("emp.xml");
		
//		Emp[] emps = new Emp[3];
//		emps[0] = ctx.getBean("programmer1", Emp.class);
//		emps[1] = ctx.getBean("programmer2", Emp.class);
//		emps[2] = ctx.getBean("designer", Emp.class);

		ArrayList<Emp> emps = ctx.getBean("emps", ArrayList.class);
		for (Emp e : emps) {
			e.work();
		}
		
		ctx.getBean("emp", Emp.class).work();
		
		AbClass abClass = new AbClass() {
		};
	}
}

EmpApp.java

실행 결과에서 1줄과 4줄 주소가 같음 -> 싱글톤!!!!
xml 에서 lookup-method한 getEmp()가 추상메소드이기 때문에 null 나옴.

 

 

 

ValueInjectApp.java

package site.levinni.inject;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ValueInjectApp {
	private String name;
	private int age;

	public void setName(String name) {
		this.name = name;
	}



	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "ValueInjectApp [name=" + name + ", age=" + age + "]";
	}



	public static void main(String[] args) {
//		ValueInjectApp app = new ValueInjectApp();
//		app.setAge(10);
//		app.setName("김보경");
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("inject.xml");
		ValueInjectApp app = ctx.getBean("inject", ValueInjectApp.class);
		
//		System.out.println(app);
		System.out.println(new ClassPathXmlApplicationContext("inject.xml").getBean("inject", ValueInjectApp.class));
		
	}
}

 

더보기
<?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 class="site.levinni.inject.ValueInjectApp" id="inject">
		<property name="name" value="김보경"></property>
		<property name="age" value="100"></property>
	</bean>

</beans>

 

 

(패키지 site.levinni.inject2) - SpEL을 이용한 value Injection <xml 방식>

Person.java

package site.levinni.inject2;

public class Person {
	private String name;
	private int age;
	
	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;
	}
	
	
}

 

 

ValueInjectApp.java

package site.levinni.inject2;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ValueInjectApp {
	private String name;
	private int age;

	public void setName(String name) {
		this.name = name;
	}



	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "ValueInjectApp [name=" + name + ", age=" + age + "]";
	}



	public static void main(String[] args) {
//		ValueInjectApp app = new ValueInjectApp();
//		app.setAge(10);
//		app.setName("김보경");
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("inject2.xml");
		ValueInjectApp app = ctx.getBean("app", ValueInjectApp.class);
		Person person = ctx.getBean("person", Person.class);
		person.setAge(40); // 별개의 인스턴스로 인식하기 때문에 반영이 안 됨.
		System.out.println(app);
//		System.out.println(new ClassPathXmlApplicationContext("inject2.xml").getBean("inject2", ValueInjectApp.class));
		
	}
}

 

 

inject2.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 class="site.levinni.inject2.Person" id="person">
	<property name="name" value="홍길동"></property>
	<property name="age" value="30"></property>
</bean>
<bean class="site.levinni.inject2.ValueInjectApp" id="app">
	<property name="name">
		<value>#{person.name}</value>
	</property>
	<property name="age" value="#{person.age}"/>
</bean>
</beans>
SpEL의 문법은 #만 됨.

※ $와 #의 차이?
현재 지정된 값이 아니라 객체가 실제로 사용될 시점의 값

 

 

(패키지 site.levinni.inject3) - SpEL을 이용한 value Injection - annotation 방식

 

Person.java

package site.levinni.inject3;

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

@Component
public class Person {
	@Value("둘리")
	private String name;
	@Value("12")
	private int age;
	
	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;
	}
	
	
}
private 필드면 getter를 알아서 찾음. 그래서 getter가 없으면 예외 발생. private가 아닌 public은 게터 없어도 가능!
@value 말고 직접 값을 입력해도 됨.

 

 

ValueInjectApp.java

package site.levinni.inject3;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;

@Service("app")
public class ValueInjectApp {
	@Value("#{person.name}")
	private String name;
	@Value("#{person.age}")
	private int age;

	public void setName(String name) {
		this.name = name;
	}



	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "ValueInjectApp [name=" + name + ", age=" + age + "]";
	}



	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("inject3.xml");
		ValueInjectApp app = ctx.getBean("app", ValueInjectApp.class);
		Person person = ctx.getBean("person", Person.class);
		person.setAge(40); // 별개의 인스턴스로 인식하기 때문에 반영이 안 됨.
		System.out.println(app);
		
	}
}

 

 

inject3.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-4.2.xsd">

	<context:component-scan base-package="site.levinni.inject3"></context:component-scan>
</beans>

 

 

 

(패키지 site.levinni.inject4) - ref 태그를 이용한 빈 주입

 

Person.java (inject2 패키지와 같음)

package site.levinni.inject4;

public class Person {
	private String name;
	private int age;
	
	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;
	}
	
	
}

 

 

ValueInjectApp.java

package site.levinni.inject4;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ValueInjectApp {
	private Person person;

	public void setPerson(Person person) {
		this.person = person;
	}



	@Override
	public String toString() {
		return "ValueInjectApp [name=" + person.getName() + ", age=" + person.getAge() + "]";
	}



	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("inject4.xml");
		ValueInjectApp app = ctx.getBean("app", ValueInjectApp.class);
		Person person = ctx.getBean("person", Person.class);
		System.out.println(app);
		
	}
}

 

 

injection4.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 class="site.levinni.inject4.Person" id="person">
		<property name="name" value="또치"/>
		<property name="age" value="13"/>
	</bean>
	<bean class="site.levinni.inject4.ValueInjectApp" id="app">
		<property name="person" ref="person">
		
		</property>
	</bean>
	
</beans>
Person이 기본형이 아니기 때문에(참조형) value가 아닌 ref를 쓴 것

 

(패키지 site.levinni.inject5) - annotation 방식

Person.java

package site.levinni.inject5;

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

@Component
public class Person {
	@Value("또치")
	private String name;
	@Value("13")
	private int age;
	
	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;
	}
	
	
}

 

 

ValueInjectApp.java

package site.levinni.inject5;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;

@Service("app")
public class ValueInjectApp {
	@Value("#{person.name}")
	private String name;
	@Value("#{person.age}")
	private int age;
	
//	@Autowired
	@Value("#{person}")
	private Person person;
	
	public void setName(String name) {
		this.name = name;
	}



	public void setAge(int age) {
		this.age = age;
	}



	public void setPerson(Person person) {
		this.person = person;
	}



	@Override
	public String toString() {
		return "ValueInjectApp [name=" + person.getName() + ", age=" + person.getAge() + "]";
	}



	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("inject5.xml");
		ValueInjectApp app = ctx.getBean("app", ValueInjectApp.class);
		Person person = ctx.getBean("person", Person.class);
		System.out.println(app);
		
	}
}
@AutoWired를 안 하면 person이 null 이기 때문에 당연히 널포인터 뜨지 바보야!!
제일 쉬운 방법은 @AutoWired고, @Value에 SpEL로도 쓸 수 있음. 

 

 

inject5.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-4.2.xsd">

	<context:component-scan base-package="site.levinni.inject5"></context:component-scan>
</beans>

 

 

(패키지 site.levinni.inject6) - xml 내 상속

 

Person.java

package site.levinni.inject6;

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

public class Person {
	private String name;
	private int age;
	
	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;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	
}

 

 

ValueInjectApp.java

package site.levinni.inject6;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.stereotype.Service;

import ch.qos.logback.classic.net.SyslogAppender;

public class ValueInjectApp {
	private Person person;
	
	public void setPerson(Person person) {
		this.person = person;
	}

	@Override
	public String toString() {
		return "ValueInjectApp [name=" + person.getName() + ", age=" + person.getAge() + "]";
	}



	public static void main(String[] args) {

		GenericXmlApplicationContext parent = new GenericXmlApplicationContext();
		parent.load("inject6-parent.xml");
		parent.refresh();
		String p1 = parent.getBean("parent1", String.class);
		String p2 = parent.getBean("parent2", String.class);
		System.out.println(p1);
		System.out.println(p2);
		
		GenericXmlApplicationContext child = new GenericXmlApplicationContext();
		child.load("inject6.xml");
		child.setParent(parent);
		child.refresh();
		
		Person person1 = child.getBean("person1", Person.class);
		Person person2 = child.getBean("person2", Person.class);
		
		System.out.println(person1);
		System.out.println(person2);
	}
}

 

부모는 자식의 존재를 몰라도 자식은 부모를 확실하게 앎.
xml에서 상속을 많이 쓰지는 않지만 알아두자.

ApplicationContext 마다 쓰는 방식이 다른데,
GenericXmlApplicationContext는 load() -> setParent() -> refresh() 이런 순서.


 

 

inject6.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 class="site.levinni.inject6.Person" id="person1">
		<property name="age" value="30"></property>
		<property name="name">
			<ref bean="parent1"/>
		</property>
	</bean>
	<bean class="site.levinni.inject6.Person" id="person2">
		<property name="age" value="40"></property>
		<property name="name">
			<ref bean="parent2"/>
		</property>
	</bean>
	<bean class="java.lang.String" id="parent1">
		<constructor-arg>
			<value>child1</value>
		</constructor-arg>
	</bean>
 	<bean class="java.lang.String" id="parent2">
		<constructor-arg>
			<value>child2</value>
		</constructor-arg>
	</bean>
</beans>
ㅇdfref parent= 일 때랑 ref bean= 일 때랑 차이 알기.

 

<ref parent = "parent2"/>

 

<ref bean = "parent2"/>

 

 

inject6-parent. 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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean class="java.lang.String" id="parent1">
		<constructor-arg>
			<value>parent1</value>
		</constructor-arg>
	</bean>
	
	<bean class="java.lang.String" id="parent2">
		<constructor-arg>
			<value>parent2</value>
		</constructor-arg>
	</bean>
</beans>

 

 

 

(패키지 site.levinni.inject7) - 주입 파라미터 (Collection 주입)

 

Person.java

package site.levinni.inject7;

public class Person {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return name;
	}
	
}

 

 

App.java

package site.levinni.inject7;

import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
	private Map<String, Object> map;
	private Set<Object> set;
	private Properties properties;
	public void setMap(Map<String, Object> map) {
		this.map = map;
	}
	public void setSet(Set<Object> set) {
		this.set = set;
	}
	public void setProperties(Properties properties) {
		this.properties = properties;
	}
	
	void display() {
		System.out.println("========map===========");
		map.forEach((k, v ) -> {System.out.println(k + "::" + v); });
		System.out.println("========set===========");
		set.forEach(System.out::println);
		System.out.println("========props===========");
		properties.forEach((k, v ) -> {System.out.println(k + "::" + v); });
	}
	
	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("inject7.xml");
		App app = ctx.getBean("app", App.class);
		app.display();
	}
}

 

더보기
<?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 class="site.levinni.inject7.Person" id="person">
		<property name="name" value="지보경"></property>
	</bean>
	<bean class="site.levinni.inject7.App" id="app">
		<property name="map">
			<map>
				<entry key="someValue" value="hello map.."/>
				<entry key="someBean" value-ref="person"/>
				<entry key="someBean2" value="person"/>
			</map>
		</property>
		
		<property name="set">
			<set>
				<value>걍 밸류</value>
				<ref bean="person"/>
			</set>
		</property>
		
		<property name="properties">
			<props>
				<prop key="내가 키">내가 값</prop>
				<prop key="lastName">Kim</prop>
				<prop key="firstName">bo kyeong</prop>
			</props>
		
		</property>
	</bean>
</beans>

 

 

 

 

'스프링 Spring' 카테고리의 다른 글

21. 04. 01.  (0) 2021.04.01
Spring JDBC 21. 03. 31.  (0) 2021.03.31
AOP 끝 21. 03. 31.  (0) 2021.03.31
AOP 21. 03. 30.  (0) 2021.03.30
Spring IoC 및 DI 21. 03. 26.  (0) 2021.03.26