You are using an outdated browser. Please upgrade your browser to improve your experience.

12/15 Spring IOC

ex04 a~

스프링에서 value가 prinitive타입이라면 알아서 형변환하여 넣어주기 때문에 꼭 타입을 정확히 적어줄 필요가 없다.

xml은 왜 url형태로 되어있는가?

url자체가 그 태그의 규칙을 소개하는 홈페이지이기 때문이다.

xmlns는 네임스페이스의 문서 url로도 사용된다 -> 그래서 네임스페이스명이 url형태를 가진다.

schema : 규칙, 개요, 도표, 형식

http프로토콜, 데이터베이스의 테이블, xml규칙 등등 모두 schema라고 부른다.

xmlns:p=”http://www.springframework.org/schema/p

p 네임스페이스나 xsi는 schema로케이션을 적을 필요가 없다.

     -->
<bean id="c4" class="com.eomcs.spring.ioc.ex04.Car"
      p:model="티코4" p:maker="비트자동차" p:cc="890"/>

위 코드는 자바코드에서 세터메서드에 set하는것과 똑같은 효과가 있다.

프로퍼티가 setter를 호출하는 방법만 이해하고 넘어가자..

    
    <bean id="c1" 
          class="com.eomcs.spring.ioc.ex06.a.CarFactory"
          factory-method="create">
        <!-- create() 메서드를 호출할 때 넘겨줄 파라미터 값 -->
        <constructor-arg value="티코"/>
    </bean>

위의 경우 factory-method타입은 꼭 스태틱이여야 한다.

c1은 create메서드가 리턴한 인스턴스객체임.

인스턴스 팩토리 메서드 만들기

<!-- 팩토리 메서드를 통해 객체를 만들기 : 인스턴스 메서드 호출 -->
    <bean id="carFactory" class="com.eomcs.spring.ioc.ex06.c.CarFactory"/>
    
    <!-- 자바 코드:
            CarFactory carFactory = new CarFactory();
            Object obj = carFactory.create("SM5");
            objPool.put("c1", obj);
     -->
    <bean id="c1" 
          factory-bean="carFactory"
          factory-method="create">
        <constructor-arg value="SM5"/>
    </bean>
    <!--
        속성:
            factory-bean="공장역할을 수행하는 객체이름"
            factory-method="인스턴스 메서드 이름"
            => factory-bean 속성을 설정하면 factory-method는 
               스태틱 메서드가 아니라 인스턴스 메서드를 가리키게 된다.
     -->
    

ex07 : 커스텀 프로퍼티에디터

BeanPostProcessor : 빈 생성 후 처리기 (post코로나, pre코로나에서 post뜻)

@Autowired

필드에도 붙일 수 있다.

필드에 @Autowired를 붙인 경우, 셋터를 통해 값을 넣는 것이 아니라, 인스턴스 필드에 직접 값을 넣는다. private 이라도 상관없다. 따라서 셋터를 정의하지 않아도 된다.

// 의존 객체 주입 자동화하기 - 인스턴스 필드에 @Autowired 애노테이션 붙이기
package com.eomcs.spring.ioc.ex08.d;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;

public class Exam01 {

  public static void main(String[] args) {
    // @Autowired 애노테이션을 필드(인스턴스 변수)에 붙여도 된다.
    // => 그러면 의존 객체를 직접 변수에 주입한다.
    // => 셋터를 호출하지 않는다. 즉 셋터가 없어도 된다.
    // => 인스턴스 변수에 직접 의존 객체를 주입한다는 것은
    // 캡슐화(즉 외부에서 직접 인스턴스 변수에 접근하는 것을 막는 기법)를
    // 위배하는 측면이 있기 때문에
    // 이 방식은 "객체지향을 파괴하는 방식"이라는 비난을 받는다.
    //
    ApplicationContext iocContainer = new ClassPathXmlApplicationContext(//
        "com/eomcs/spring/ioc/ex08/e/application-context.xml");

    // Spring IoC 컨테이너에 들어 있는 객체 출력
    SpringUtils.printBeanList(iocContainer);

    // Car 객체를 꺼내 Engine 객체가 주입되었는지 확인해보자!
    System.out.println(iocContainer.getBean("c1"));

  }

}

ex09 특정 패키지만 제외시키고 annotaion만들기

ex10 xml파일이 드디어 없어짐. 클래스를 이용해 스프링 설정