13
스프링 컨텍스트 설정과 관련된 어노테이션 소개 작성자 : 이종철, 탑크리에듀(topcredu.co.kr)

(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

  • Upload
    3-2

  • View
    1.446

  • Download
    2

Embed Size (px)

Citation preview

Page 1: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

스프링 컨텍스트 설정과 관련된 어노테이션 소개

작성자 : 이종철, 탑크리에듀(topcredu.co.kr)

Page 2: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

• 일반적으로 @Component, @Service, @Repository 등으로 자동 스캐닝한 자바빈은 싱글톤 형태로 하나만 생성하는데 이를 변경하려면 @Scope 어노테이션을 사용하면 된다. 즉 빈의 범위를 설정한다.

singleton – IoC 컨테이너당 하나의 빈을 리턴(기본값)

prototype – 요구가 있을 때 마다 새로운 빈을 만들어 리턴

request - HTTP request 객체당 하나의 빈을 리턴

session - HTTP session 당 하나의 빈을 리턴

globalSession - 전체 모든 세션에 대해 하나의 빈을 리턴

@Component

@Scope("prototype") //요구시마다 하나의 새로운 빈을 리턴

class Ojc { …… }

<bean id="ojc" class=“com.topcredu.edu" scope="prototype"/>

1. @Scope

Page 3: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

• Spring Framework에 종속적인 어노테이션 이다.

• 빈의 id, name로 아무거나 맞으면 주입한다.(Type Driven Injection)

• 여러개의 빈이 검색될 경우 @Qualifier(name="xxx") 어노테이션으로 구별한다.

• 기본적으로 @Autowired된 속성은 모두 빈이 주입되어야 한다. (주입될 빈이 없는 경우가 있다면 required=false로 하면 오류는 발생하지 않는다.)

• 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능하다.

class OrderManager {

@Autowired // TYPE이 CarMaker 인것 찾아 자동 주입, 여러 개인 경우 Qualifier로 지정

@Qualifier("daewoo") // 빈의 이름이 “daewoo” 인것을 주입한다.

private CarMaker maker;

……

}

2. @Autowired

Page 4: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

• Spring2.5 이상에서 사용가능하며 Spring Framework에 비종속적으로 권장하는 방식이다.

• 빈의 name으로 주입될 빈을 찾아 주입하는데 멤버변수, setter 메소드에 적용가능하다.

• 사용하기 위해서는 jsr250-api.jar가 클래스패스에 추가되어야 한다.

• [MAVEN 설정]

<dependency>

<groupId>javax.annotation</groupId>

<artifactId>jsr250-api</artifactId>

<version>1.0</version>

</dependency>

3. @Resource

Page 5: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

• Spring3.0 이상에서 사용가능 하며 @Autowired처럼 Type이 같은 빈을 찾아 주입한다.

• 특정 Framework에 종속되지 않은 어플리케이션을 구성하기 위해서는 @Inject를 사용할 것을 권장한다.

• JSR.330 라이브러리인 javax.inject-x.x.x.jar 파일이 추가되어야 한다.

• 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능하다.

• [MAVEN 설정]

<dependency>

<groupId>javax.inject</groupId>

<artifactId>javax.inject</artifactId>

<version>1</version>

</dependency>

4. @Inject

Page 6: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

• Setter 메소드 위에 기술하여 필수 프로퍼티를 설정하는 용도로 사용된다.

package day1;

public class Emp {

private String ename;

@Required

public void setEname(String ename)

{ this.ename = ename; }

public String getEname() {

return this.ename;

}

}

5. @Required • XML설정에서(Beans.xml)…

<context:annotation-config/>

<bean id="emp" class="day1.Emp">

<!-- 아래 프로퍼티를 설정하지 않으면 오류 -->

<!-- <property ename="ename" value="홍길동" /> -->

</bean>

• main에서…

ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

Emp emp = (Student) context.getBean("emp");

System.out.println(“Ename : " + emp.getEname() );

• 오류메시지 Property 'ename' is required for bean 'emp'

• @Required 어노테이션이 사용되기 위해서는 RequiredAnnotationBeanPostProcessor 클래스를 빈으로 등록하거나 <context:annotation-config> 설정을 추가하면 된다.

Page 7: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

• JSR-330의 어노테이션이며 Spring의 빈으로 등록하는 @Component, @Service, @Repository,

이름으로 검색해서 주입하는 @Qualifier와 동일하다.

• @Repository @Named

• public class EmpDAO { … } public class EmpDAO { … }

• @Service @Named

• public class EmpService { … } public class EmpService { … }

• @Component @Named

• public class EmpVO { … } public class EmpVO { … }

• @Autowired

• public void setEmp(@Qualifier(“programmer") Emp emp) { … }

• 아래와 동일

• @Inject

• public void setEmp(@Named(“programmer") Emp emp) { … }

6. @Named

[메이븐 설정] <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>

Page 8: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

• Spring4에서 새로 소개된 @Order 어노테이션은 같은 타입의 빈이 컬렉션(List등)에 Autowired 될 때 그 순서를 지정한다.(낮은 숫자가 우선순위가 높다)

• 먼저 @Order를 사용하지 않은 예제를 작성해 보자.(스프링 버전은 4이상으로)

7. @Order - 1

Page 9: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

7. @Order - 2

emps 리스트에 주입되는 빈에 순서가 정의되지 않는다. 이때 주입되는 순서를 주기 위해 @Order를 사용하면 된다. 물론 XML설정을 이용하여 Programmer, Designer를 빈으로 등록해 놓고 List<Emp> emps의 setter를 이용하여 Collection 형태로 빈을 주입한다면 기술된 빈의 순서대로 List에 들어가게 된다.

Page 10: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

• @Order를 사용한 예제를 작성해 보자.(스프링 버전은 4이상으로)

7. @Order - 3

Page 11: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

• 객체가 생성된 후 별도의 초기화 작업을 위해 실행하는 메소드를 선언한다.

• CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시키거나 <context:annotation-config> 태그를 사용하면 된다.

• 스프링의 설정 파일에서 init-method 속성을 이용하여 지정한 메서드와 동일하다.

8. @PostConstruct

class Hello { String name = null; Hello(String name) { this.name = name; } @PostConstruct public initObj() { if (name == null) { name = "홍길동"; } } }

Page 12: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

• 스프링 컨테이너에서 객체(빈)를 제거하기 전에 해야할 작업이 있다면 메소드위에 사용하는 어노테이션 이다.

• 이 어노테이션을 사용하기 위해서는 CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록하거나 <context:annotation-config> 태그를 사용하면 된다.

• 스프링의 설정 파일에서 destroy-mehtod속성을 이용하여 지정한 메서드와 동일하다.

9. @PreDestroy

Page 13: (스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션

THIS PRACTICE MAKES THE EXPERT!

스프링,마이바티스기초 단기속성과정

자바기초에서JSP스프링, MyBatis까지

Spring Framework & JPA