스프링에서는 스프링 컨테이너가 bean의 life cycle 관리.
코드 내부에서 new로 객체를 생성하는 것이 아니라, 스프링 컨테이너에서 생성한 객체를 주입한다.
package com.snowcat471.spring;
public interface Character {
public String move();
}
public class Warrior implements Character {
@Override
public String move() {
return "전사 이동";
}
}
public class Mage implements Character {
@Override
public String move() {
return "마법사 이동";
}
}
<?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="mage"
class="com.snowcat471.spring.Mage">
</bean>
</beans>
<?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">
<!-- add entry to enable component scanning -->
<context:component-scan base-package="com.snowcat471.spring" />
</beans>
//@Component("mage")
@Component // bean id를 지정하지 않으면 class 이름에 맞춰 "mage"로 생성됨
public class Mage implements Character {
@Override
public String move() {
return "마법사 이동";
}
}
@Configuration
@ComponentScan("com.snowcat471.spring")
public class MyConfig {
}
//@Component("mage")
@Component // bean id를 지정하지 않으면 class 이름에 맞춰 "mage"로 생성됨
public class Mage implements Character {
@Override
public String move() {
return "마법사 이동";
}
}
package com.snowcat471.spring;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("파일명.xml");
// 스프링 컨테이너에서 bean 가져오기
Character character = context.getBean("mage", Character.class);
// bean의 메서드 호출
System.out.println(character.move());
// 마법사 이동
// 컨텍스트 close
context.close();
}
}
package com.snowcat471.spring;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(MyConfig.class);
// 스프링 컨테이너에서 bean 가져오기
Character character = context.getBean("mage", Character.class);
// bean의 메서드 호출
System.out.println(character.move());
// 마법사 이동
// 컨텍스트 close
context.close();
}
}
의존하는 객체를 new로 코드에서 생성하지 않고 스프링 컨테이너로부터 주입 받는 것.
package com.snowcat471.spring;
public interface Character {
public String move();
public String attack();
}
public interface Weapon {
public String attack();
}
public Road implements Weapon {
@Override
public String attack() {
return "지팡이 공격";
}
}
public class Mage implements Character {
private Weapon weapon;
@Override
public String move() {
return "마법사 이동";
}
@Override
public String attack() {
return weapon.attack();
}
}
public class Mage implements Character {
@Autowired
private Weapon weapon;
}
public class Mage implements Character {
private Weapon weapon;
public mage(Weapon weapon) {
this.weapon = weapon;
}
}
<bean id="weapon"
class="com.snowcat471.spring.Road">
</bean>
<bean id="mage"
class="com.snowcat471.spring.Mage">
<constructor-arg ref="weapon" />
</bean>
public class Mage implements Character {
private Weapon weapon;
public setWeapon(Weapon weapon) {
this.weapon = weapon;
}
}
<bean id="weapon"
class="com.snowcat471.spring.Road">
</bean>
<bean id="mage"
class="com.snowcat471.spring.Mage">
<property name="weapon" ref="weapon" />
</bean>