스프링에서 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를 붙인 경우, 셋터를 통해 값을 넣는 것이 아니라, 인스턴스 필드에 직접 값을 넣는다. 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파일이 드디어 없어짐. 클래스를 이용해 스프링 설정