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
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 |