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 넣은 형태.
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);
}
}
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() {
};
}
}
실행 결과에서 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= 일 때랑 차이 알기.
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 |