# Spring07

제로·2023년 1월 18일
0

Spring

목록 보기
7/18

1.의존성 자동 주입 설정

  1. 컨테이너 안에 여러가지 객체들이 선언하면 메모리에 로딩되어 사용할 수 있다.
  2. 이 때, 서로 연관관계가 있는 객체 즉, 메서드나 필드에 선언되어 호출되는 관계의 객체들이 있다.
    ex) EmpController.java
    private EmpService service;
    EmpService.java
    private EmpDao dao;
  3. 컨테이너에서 autowiring 옵션을 이용하면, 객체가 현재 메모리에 로딩된 상태이기에 바로 new XXXX() 형태로 객체를 생성하여 할당없이 처리가 가능한데 이것을 의존성 자동 주입설정이라고 한다.
  4. 의존성 자동 주입 설정 옵션
  • autowire="byType"
    스프링 컨테이너 메모리가 해당 객체 타입으로 들어올 수 있는 메서드가 정의가 되어 있으면 자동으로 할당이 되게 처리하는 것을 말한다.
  • autowire = "byName"
    byType은 컨테이너에 들어올 수 있는 객체가 하나일 때, 처리가 가능한데 특정 객체가 여러 개 선언되어 있는 경우 byName으로 하면 일단 type이 같고 id값이 같은 property가 있는 메서드가 있을 경우 할당하는 것을 말한다.
  • autowire ="constructor"
    생성자를 통해서 해당 타입이 할당될 때, 자동 주입된다.
  • autowire="autodetect"
    우선 할당할 수 있는 생성자를 살피고, 없을 때는 기능메서드를 살펴서 byType으로 할당한다.
  • autowire="no"
    자동주입을 하지 못하게 한다. default값이다.
@@ di16.xml
// public void setPhone(Phone phone) 메서드를 기준으로 자동으로 할당하게 하는것이 의존성 자동주입의 개념이다.

# byType
 //포함될 객체 생성
 <bean id="hp02" class="a01_diexp.z01_vo.Phone" c:_0="010-3752-5329" c:_1="삼성전자"/>
//포함할 객체 생성
 <bean id="us01" class="a01_diexp.z01_vo.HPUser" p:name="홍길동" autowire="byType" />

# byName
//포함될 객체 생성 
 <bean id="car01" class="a01_diexp.z01_vo.Car" c:_0="붕붕이" c:_1="230"/>
 <bean id="car02" class="a01_diexp.z01_vo.Car" c:_0="벤츠" c:_1="320"/>
 <bean id="car03" class="a01_diexp.z01_vo.Car" c:_0="BMW" c:_1="270"/>
//포함할 객체 생성 
 <bean id="cr01" class="a01_diexp.z01_vo.CarRacer" p:name="박사장" autowire="byName"/>

@@ CarRacer.java
// bean의 id값과 동일한 이름으로 set메서드를 생성해줘야 한다
public void setCar03(Car car) { 
		this.car = car;
	}	

2. 패키지 단위 자동 클래스 선언

  1. 컨테이너 설정 옵션 가운데 특정한 패키지와 각 클래스마다 선언된 annotation(@Controller/@Service/@Repository)를 기준으로 자동으로 선언하게 하여, was(tomcat)이 로딩되고, 첫번째 controller를 호출할 때, 메모리에 로딩되게 처리하는 기능을 지원한다.
  2. 이런 객체들의 id값은 default로 클래스명의 소문자 시작으로 자동 설정된다.
  3. 변경이 필요할 때는 @Controller("변경할 아이디") 형식으로 선언하면 된다.
  4. 기본형식 : 컨테이너 안에 선언
    1) <context:component-scan base-package="적용할 최상위 패키지명">
    -> 패키지 하위에 @Component로 선언된 모든 클래스는 자동으로 메모리에 로딩된다.
    2) 특정 패키지에 있는 객체들을 @Component 선언없이 메모리 로딩하려면 아래의 옵션을 추가해야한다.
    <context:component-scan base-package="적용할 최상위 패키지명">
    <context:include-filter type="regex" expression=".*"/>
    정규식표현식에 해당하는 클래스를 메모리에 로딩하는 것을 .* 하위에 있는 모든 클래스를 지칭한다.
@@ di17.xml
  <context:component-scan base-package="a01_diexp.z02_vo">
  </context:component-scan>

@@ a01_diexp.z02_vo.Person
  @Component // @Component를 상단에 꼭 선언해줘야 컨테이너에서 인식한다.
  public class Person {}
  
  
@@ di18.xml
  	<context:component-scan base-package="a01_diexp.z03_vo">
  		<context:include-filter type="regex" expression=".*"/>
  	</context:component-scan>
    //a01_diexp.z03_vo 패키지 하위의 모든 클래스를 메모리에 저장
profile
아자아자 화이팅

0개의 댓글

관련 채용 정보