쌍용교육 -JSP수업 78일차 - ch07_SpringDI(3)

2024. 6. 14. 17:16· 쌍용교육(JAVA)/Spring
목차
  1. kr.spring.ch08 ~
  2. kr.spring.ch15 명시해야됨
  3. kr.spring.ch16 => SmsSender 
  4. SystemMonitor
  5. applicationContextAnnot.xml
  6. SpringMain
  7. kr.spring.ch17 =>Recorder
  8. SystemMonitor2
  9. applicationContextAnnot.xml
  10. SpringMain
  11. applicationContextAnnot.xml
  12. SystemMonitor2를 수정한다.
  13. 어노테이션을 쓰기위한 과정
  14. kr.spring.ch18 => camera
  15. HomeController
  16. applicationContextAnnot.xml 내용추가
  17. SpringMain
  18. camera2=null, camera3=null 을 지정하는 방법
  19. 어노테이션을 이용한 자동 스캔
  20. applicationContextScan.xml
  21. kr.spring.ch19 => Camera
  22. HomeController
  23. SpringMain
  24.  

kr.spring.ch08 ~

kr.spring.ch15 명시해야됨

kr.spring.ch16 => SmsSender 

package kr.spring.ch16;

public class SmsSender {

}

SystemMonitor

package kr.spring.ch16;

import org.springframework.beans.factory.annotation.Autowired;

public class SystemMonitor {
	/*
	 * @Autowired
	 * 생성자, 필드, 메서드에 지정 가능
	 * 메서드에 지정할 때는 setXXX뿐만 아니라 일반메서드에도 적용 가능
	 * 
	 * @Autowired 어노테이션은 타입을 이용해서 자동적으로 프로퍼티 값을 설정하기 때문에,
	 * 해당 타입의 빈 객체가 존재하지 않거나 또는 빈 객체가 두 개 이상 존재할 경우 스프링은 
	 * @Autowired 어노테이션이 적용된 빈 객체를 생성할 때 예외를 발생
	 * 
	 * @Autowired(required=false)로 지정하면 해당 타입의 빈 객체가
	 * 존재하지 않더라도 스프링은 예외를 발생하지 않음
	 * 기본값은 @Autowired(required=true)가 기본값이다.
	 */
	
	
	//프로퍼티
	private int  periodTime;
	private SmsSender sender;
	
	public void setPeriodTime(int periodTime) {
		this.periodTime = periodTime;
	}
	@Autowired
	public void setSender(SmsSender sender) {
		this.sender = sender;
	}
	@Override
	public String toString() {
		return "SystemMonitor [periodTime=" + periodTime + ", sender=" + sender + "]";
	}
	
}

 

applicationContextAnnot.xml

<!-- @Autowired,@Resource, @Qualifier 사용시 아래 설정 추가 -->
	<context:annotation-config /><!-- @Autowired를 쓰러면 이 태그가 필수로 사용된다. -->
	
	<!-- @Autowired 어노테이션을 이용한 의존관계 자동 설정 -->
	<bean id="monitor" class="kr.spring.ch16.SystemMonitor">
		<property name="periodTime">
			<value>70</value>
		</property>
	</bean>
	<bean id="sender" class="kr.spring.ch16.SmsSender"/>

SpringMain

package kr.spring.ch16;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringMain {
	public static void main(String[] args) {
		AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContextAnnot.xml");
		
		//DI - @Autowired 어노테이션을 이용한 의존관계 자동 설정
		SystemMonitor monitor = (SystemMonitor)context.getBean("monitor");
		System.out.println(monitor);
		
		context.close();
		
		
	}
}
SystemMonitor [periodTime=70, sender=kr.spring.ch16.SmsSender@7a527389]


applicationContextAnnot.xml에서 

<bean id="sender" class="kr.spring.ch16.SmsSender"/>을 주석처리하고 springmain을 실행하

대충 하나의 값을 기대했다라는 소리

WARN : org.springframework.context.support.ClassPathXmlApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'monitor': Unsatisfied dependency expressed through method 'setSender' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'kr.spring.ch16.SmsSender' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

SystemMonitor에서 @Autowired(required=false)를 쓰면

@Autowired(required=false)
	public void setSender(SmsSender sender) {
		this.sender = sender;
	}
SystemMonitor [periodTime=70, sender=null]

null값이 들어가지만 잘 쓰지 않는 방법이다.

 

kr.spring.ch17 =>Recorder

package kr.spring.ch17;

public class Recorder {

}

SystemMonitor2

package kr.spring.ch17;

import org.springframework.beans.factory.annotation.Autowired;

public class SystemMonitor2 {
	//프로퍼티
	@Autowired
	private Recorder recorder;

	public Recorder getRecorder() {
		return recorder;
	}

	public void setRecorder(Recorder recorder) {
		this.recorder = recorder;
	}
	
	
}

applicationContextAnnot.xml

<bean id="systemMonitor" class="kr.spring.ch17.SystemMonitor2"/>
	<bean id="recorder1" class="kr.spring.ch17.Recorder"/>

SpringMain

package kr.spring.ch17;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringMain {
	public static void main(String[] args) {
		AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationCOntextAnnot.xml");
		
		//DI - @Autowired 어노테이션을 이용한 자동 설정
		SystemMonitor2 monitor = (SystemMonitor2)context.getBean("systemMonitor");
		System.out.println(monitor.getRecorder());
		
		context.close();
	}
}
kr.spring.ch17.Recorder@75e01201

applicationContextAnnot.xml

<bean id="systemMonitor" class="kr.spring.ch17.SystemMonitor2"/>
	<bean id="recorder1" class="kr.spring.ch17.Recorder"/>
    <bean id="recorder12" class="kr.spring.ch17.Recorder"/>

하면 에러가 나는 문제를 해결하고자한다. 아래처럼 qulifier을 써서 자동 설정 제한을 하고

<!-- @Qualifier 어노테이션을 이용한 자동 설정 제한 -->
	<bean id="systemMonitor" class="kr.spring.ch17.SystemMonitor2"/>
	<bean id="recorder1" class="kr.spring.ch17.Recorder">
		<qualifier value= "main"/>	
	</bean>
	<bean id="recorder12" class="kr.spring.ch17.Recorder"/>

SystemMonitor2를 수정한다.

package kr.spring.ch17;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class SystemMonitor2 {
	//프로퍼티
	@Autowired
	//@Qualifier를 이용한 자동 설정 제한
	@Qualifier("main") //main이라고 표시되어있는 것만 자동 설정 제한
	private Recorder recorder;

	public Recorder getRecorder() {
		return recorder;
	}

	public void setRecorder(Recorder recorder) {
		this.recorder = recorder;
	}
	
	
}

springMain 실행시 결과가 에러없이 나온다.

 

어노테이션을 쓰기위한 과정

kr.spring.ch17.Recorder@2453f95d

https://mvnrepository.com/

tomcat의 버전이 10 이상이면 1번 10 이하이면 2를 고르면 된다 (난 tomcat 9이기떄문에 2번째)

pom.xml 에 일부분

<!-- 라이브러리 추가 시작 -->
		<dependency>
		    <groupId>javax.annotation</groupId>
		    <artifactId>javax.annotation-api</artifactId>
		    <version>1.3.2</version>
		</dependency>

kr.spring.ch18 => camera

package kr.spring.ch18;

public class Camera {
	//프로퍼티
	private int number;

	public void setNumber(int number) {
		this.number = number;
	}

	@Override
	public String toString() {
		return "camera [number=" + number + "]";
	}
	
}

HomeController

package kr.spring.ch18;

import javax.annotation.Resource;

public class HomeController {
	//빈의 이름과 프로퍼티명이 일치하면 의존관계 설정
	@Resource
	private Camera camera1;
	private Camera camera2;
	private Camera camera3;
	
	public void setCamera1(Camera camera1) {
		this.camera1 = camera1;
	}
	public void setCamera2(Camera camera2) {
		this.camera2 = camera2;
	}
	public void setCamera3(Camera camera3) {
		this.camera3 = camera3;
	}
	@Override
	public String toString() {
		return "HomeController [camera1=" + camera1 + ", camera2=" + camera2 + ", camera3=" + camera3 + "]";
	}
	
}

applicationContextAnnot.xml 내용추가

<!-- @Resourse 어노테이션을 이용한 자동 설정
		 (빈 객체의 이름과 프로퍼티명이 일치하면 의존관계 설정) -->
	<bean id="homeController" class="kr.spring.ch18.HomeController"/>
	<bean id="camera1" class="kr.spring.ch18.Camera" p:number="1"/> <!-- id를 camera1으로 해뒀기 떄문에  HomeController의 프로터피와 자동으로 매핑이된다.-->

SpringMain

package kr.spring.ch18;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringMain {
	public static void main(String[] args) {
		AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContextAnnot.xml");
		
		//@Resourse 어노테이션을 이용한 프로퍼티 설정
		HomeController home = (HomeController)context.getBean("homeController");
		
		System.out.println(home);
		
		context.close();
	}
}
HomeController [camera1=camera [number=1], camera2=null, camera3=null]

camera2=null, camera3=null 을 지정하는 방법

HomeController 파일 안에 있는 프로퍼티에 빈 객체 이름을 지정한다.

package kr.spring.ch18;

import javax.annotation.Resource;

public class HomeController {
	//빈의 이름과 프로퍼티명이 일치하면 의존관계 설정
	@Resource
	private Camera camera1;
	//@Resource(name="빈 객체의 이름") 빈 객체의 이름 지정
	@Resource(name="camera2")
	private Camera camera2;
	@Resource(name="cameraz")
	private Camera camera3;
	
	public void setCamera1(Camera camera1) {
		this.camera1 = camera1;
	}
	public void setCamera2(Camera camera2) {
		this.camera2 = camera2;
	}
	public void setCamera3(Camera camera3) {
		this.camera3 = camera3;
	}
	@Override
	public String toString() {
		return "HomeController [camera1=" + camera1 + ", camera2=" + camera2 + ", camera3=" + camera3 + "]";
	}
	
}

applicationContextAnnot.xml 내용수정

<!-- @Resourse 어노테이션을 이용한 자동 설정
		 (빈 객체의 이름과 프로퍼티명이 일치하면 의존관계 설정) -->
	<bean id="homeController" class="kr.spring.ch18.HomeController"/>
	<bean id="camera1" class="kr.spring.ch18.Camera" p:number="1"/> <!-- id를 camera1으로 해뒀기 떄문에  HomeController의 프로터피와 자동으로 매핑이된다.-->
	<bean id="camera2" class="kr.spring.ch18.Camera" p:number="2"/>
	<bean id="cameraz" class="kr.spring.ch18.Camera" p:number="3"/>

SpringMain을 실행 하면 결과가 정상적으로 나온다

HomeController [camera1=camera [number=1], camera2=camera [number=2], camera3=camera [number=3]]

어노테이션을 이용한 자동 스캔

applicationContextScan.xml

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
 
	<!-- 어노테이션을 이용한 자동 스캔 
		 (컨테이너에 빈을 등록하기 위해서 검색할 패키지 지정)-->
	<context:component-scan base-package="kr.spring.ch19"/>
<!--==============================================================================================================-->			
	
</beans>

kr.spring.ch19 => Camera

package kr.spring.ch19;

import org.springframework.stereotype.Component;

//자동스캔 대상 지정
@Component
public class Camera {

}

HomeController

package kr.spring.ch19;

import javax.inject.Named;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


/*
 * <context:component-scan> 태그를 추가하면 스프링은 지정한 패키지에서 
 * @Component 어노테이션이 적용된 클래스를 검색하여 빈으로 등록
 * 자동 등록된 빈의 아이디는 클래스 이름의 첫 글자를 소문자로 바꿔서 사용함
 * 예) HomeController -> homeController로 빈의 이름 지정 
 * 
 * 빈의 이름을 지정하고 싶으면 @Component("home")와 같이 명시함 또는
 * @Component
 * @Named("home")
 */


@Component
@Named("home") //homeController 대신 home이라고 이름을 지정함. 
public class HomeController {
	@Autowired
	private Camera camera;

	public void setCamera(Camera camera) {
		this.camera = camera;
	}

	@Override
	public String toString() {
		return "HomeController [camera=" + camera + "]";
	}
	
	
}

SpringMain

package kr.spring.ch19;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringMain {
	public static void main(String[] args) {
		AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContextScan.xml");
		
		//@Component 어노테이션을 이용한 빈 객체 생성
		HomeController home = (HomeController)context.getBean("home"); // HomeController에서 home으로 이름을 줄였기 떄문에 homeController라고 하지 않아도됨
		System.out.println(home);
		
		context.close();
	}
}
HomeController [camera=kr.spring.ch19.Camera@3234f74e]

 

 

'쌍용교육(JAVA) > Spring' 카테고리의 다른 글

쌍용교육 -JSP수업 79일차 - ch08_SpringMVC(1)  (0) 2024.06.17
쌍용교육 -JSP수업 79일차 - ch07_SpringDI(4)  (0) 2024.06.17
쌍용교육 -JSP수업 77일차 - ch07_SpringDI(2)  (0) 2024.06.13
쌍용교육 -JSP수업 77일차 - ch07_SpringDI(1)  (0) 2024.06.12
이클립스 스프링 설치 방법  (0) 2024.06.11
  1. kr.spring.ch08 ~
  2. kr.spring.ch15 명시해야됨
  3. kr.spring.ch16 => SmsSender 
  4. SystemMonitor
  5. applicationContextAnnot.xml
  6. SpringMain
  7. kr.spring.ch17 =>Recorder
  8. SystemMonitor2
  9. applicationContextAnnot.xml
  10. SpringMain
  11. applicationContextAnnot.xml
  12. SystemMonitor2를 수정한다.
  13. 어노테이션을 쓰기위한 과정
  14. kr.spring.ch18 => camera
  15. HomeController
  16. applicationContextAnnot.xml 내용추가
  17. SpringMain
  18. camera2=null, camera3=null 을 지정하는 방법
  19. 어노테이션을 이용한 자동 스캔
  20. applicationContextScan.xml
  21. kr.spring.ch19 => Camera
  22. HomeController
  23. SpringMain
  24.  
'쌍용교육(JAVA)/Spring' 카테고리의 다른 글
  • 쌍용교육 -JSP수업 79일차 - ch08_SpringMVC(1)
  • 쌍용교육 -JSP수업 79일차 - ch07_SpringDI(4)
  • 쌍용교육 -JSP수업 77일차 - ch07_SpringDI(2)
  • 쌍용교육 -JSP수업 77일차 - ch07_SpringDI(1)
구 승
구 승
열심히 살아보기위해 만든 블로그입니다.
구 승
훌륭한 개발자가 되기위한 기록소
구 승
전체
오늘
어제
  • 분류 전체보기 (258)
    • 산엔지니어링 (1)
      • C# (0)
    • 쌍용교육(JAVA) (236)
      • JAVA (55)
      • SQL (18)
      • PL\SQL (7)
      • JDBC (12)
      • HTML (4)
      • CSS (13)
      • JavaScript (26)
      • jquery (11)
      • Bootstrap (4)
      • Servlet (4)
      • JSP (25)
      • MVC (23)
      • Spring (12)
      • SpringBoot (22)
    • 코딩테스트 공부 (9)
    • Do it! 자료구조와 함께 배우는 .. (2)
    • 정보처리기사 (1)
    • AWS (3)
    • UML (1)
    • Kafka (2)
    • 여러 이론들 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • SQL
  • CSS
  • JDBC
  • java
  • HTML
  • JQuery
  • javascript
  • PL/SQL

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
구 승
쌍용교육 -JSP수업 78일차 - ch07_SpringDI(3)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.