공격하는 방식을 바꾸는데 클래스를 따로 만들고 다른 타입의 객체를 만들거야
WeaponImpl2 클래스를 만들어
1 2 3 4 5 6 7 8 9 10 11 12 | package test.mypac; public class WeaponImpl2 implements Weapon{ @Override public void attack() { System.out.println("변칙 공격을 해요!"); } } | cs |
메인 클래스를 수정하지 않고 이 객체의 attack 라는 곳에 실행 순서가 들어오가 할수 있음
xml 문서를 수정하면 됌.
1 2 3 4 5 6 7 8 9 10 11 | <?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"> <!-- new WeaponImpl() 한 객체의 참조값을 myWeapon 이라는 아이디로 관리하기 --> <bean id="myWeapon" class="test.mypac.WeaponImpl2"></bean> </beans> | cs |
이렇게 수정해 주면 됌.
Spring 은 이거에서 부터 시작
메인이 하나의 객체라면
그 객체에 의존하고 있는 다른 클래스도 수정할 필요가 없어
필요한 객체를 사용하지 않고 인터페이스를 사용하는 것을 봐야해
의존관계를 느슨하게 하기 위해서
이렇게 하는 것
핵심객체를 직접 만들지 않고, 어디에선가 관리하게 만들어 놓고, 거기에서 받아서 쓰는 구조
메인 클래스 하나 더 만들어서
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package test.main; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import test.mypac.Weapon; public class MainClass2 { public static void main(String[] args) { ApplicationContext context= new ClassPathXmlApplicationContext("test/main/init.xml"); Weapon w1=(Weapon)context.getBean("myWeapon"); Weapon w2=(Weapon)context.getBean("myWeapon"); if(w1==w2){ System.out.println("w1 과 w2 는 같아요"); }else{ System.out.println("w1 과 w2 는 달라요"); } } } | cs |
이렇게 코딩후 실행 해 보면
같다고 출력되는 것을 볼 수 있어
여러번 가져와도 참조값이 같다는 얘기는
getBean 할때마다 객체를 생성하지 않는 다는 얘기
하나만 생성하고 id가 myWeapon 이라는 것을 가져온다는 것을 알수 있다.
Car와 Engine 클래스를 만들고
Car 클래스는
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package test.mypac; public class Car { // 맴버필드 private String company; private Engine engine; public void setCompany(String company) { this.company = company; } public void setEngine(Engine engine) { this.engine = engine; } // 달리는 메소드 public void drive(){ System.out.println("부릉~부릉~ 자동차가 달려요~!"); } } | cs |
이렇게 코딩해 주고
달리는 메소드를 호출할때는 xml 을 이용할거야
test.main2 패키지와 그 하위에 init.xml 만들어주
1 2 3 4 5 6 7 8 9 | <?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="car1" class="test.mypac.Car"></bean> </beans> | cs |
init.xml 코드
MainClass 만들어서
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package test.main2; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import test.mypac.Car; public class MainClass { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("test/main2/init.xml"); Car car1=(Car)context.getBean("car1"); } } | cs |
이렇게 코딩해 주고
init.xml 에
1 2 3 4 5 6 7 8 9 10 11 | <?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="car1" class="test.mypac.Car"></bean> <bean id="car2" class="test.mypac.Car"></bean> </beans> | cs |
car2 bean 추가생성
이렇게 해주고 MainClass로 가서 car2를 추가해 준후 비교 해보면??
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package test.main2; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import test.mypac.Car; public class MainClass { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("test/main2/init.xml"); Car car1=(Car)context.getBean("car1"); Car car2=(Car)context.getBean("car2"); if(car1==car2){ System.out.println("car1과 car2는 참조값이 같아요!"); }else{ System.out.println("car1과 car2는 참조값이 달라요!"); } } } | cs |
메인 클래스에 이렇게 소스코드를 추가해 준후 실행해보면 알수 있어!!
참조값이 다르다고 나옴
SpringBeanContainer 에 객체의 아이디 값을 다르게 해놓고
가져와서 참조값이 다르다고 나온 것.
Car 클래스로 가서
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package test.mypac; public class Car { // 맴버필드 private String company; private Engine engine; public void setCompany(String company) { this.company = company; } public void setEngine(Engine engine) { this.engine = engine; } // 달리는 메소드 public void drive(){ System.out.println("자동차의 제조사는 :"+company); if(engine==null){ System.out.println("Engine 객체가 없어서 못달려요!"); return; } System.out.println("부릉~부릉~ 자동차가 달려요~!"); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package test.main2; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import test.mypac.Car; public class MainClass { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("test/main2/init.xml"); Car car1=(Car)context.getBean("car1"); Car car2=(Car)context.getBean("car2"); if(car1==car2){ System.out.println("car1과 car2는 참조값이 같아요!"); }else{ System.out.println("car1과 car2는 참조값이 달라요!"); } car1.drive(); System.out.println("----------------------------"); car2.drive(); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?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="car1" class="test.mypac.Car"></bean> <bean id="car2" class="test.mypac.Car"> <property name="company" value="현대자동차"></property> </bean> </beans> | cs |
car2는 제조사가 null이 아닌 것을 볼수 있어
car2 에 engine 도 넣어주고 싶은데
이렇게 넣을때 넣을수 있는 것이 문자나 숫자뿐이 안돼...
근데 engine 은 engine 타입이야
그래서 engine 객체가 있어야해
init.xml에
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?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"> <!-- Engine 객체 --> <bean id="myEngine" class="test.mypac.Engine"></bean> <bean id="car1" class="test.mypac.Car"></bean> <bean id="car2" class="test.mypac.Car"> <property name="company" value="현대자동차"></property> <property name="engine" ref="myEngine"></property> </bean> </beans> | cs |
Engine 객체 추가해주고
참조값을 넣을때에는 value가 아닌 ref로 넣어줘
이제 MainClass 로가서 다시 실행해 보면
car2가 잘 달리는 것을 볼수 있어
xml 문서를 JAVA 코드로 바꾸면
이렇게 되는 것과 마찬가지임
value로 초록색과 핑크색이 들어가는 것이고
ref 는 Spring Bean Container 에서 관리 하고 있는 객체중 하나를 넣어줄때 사용
car1은 조립을 못한거고
car2는 조립을 잘 한거라고 느끼면 됌
'FrameWork > spring' 카테고리의 다른 글
4. Step01_Hello (0) | 2017.07.26 |
---|---|
3. spring 기본 - 3 (0) | 2017.07.26 |
3. Spring 기본 (0) | 2017.07.25 |
2. maven 설치 이후 프로젝트 만들기전에 할 설정 들 (0) | 2017.07.25 |
1. maven 설치 (0) | 2017.07.25 |