2016년 9월 19일 월요일

[자바교육,스프링교육추천◆탑크리에듀]#8.스프링DI관련어노테이션((@Scope,@Autowired,@Resource,@Inject,@Required,@Named,@Order,@PostConstruct,@PreDestroy)

#8.스프링DI관련어노테이션((@Scope,@Autowired,@Resource,@Inject,@Required,@Named,@Order,@PostConstruct,@PreDestroy)

Context Configuration Annotations(@Scope,@Autowired,@Resource,@Inject,@Required,@Named,@Order,@PostConstruct,@PreDestroy)

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

singleton – IoC 컨테이너당 하나의 빈을 리턴
prototype – 요구가 있을 때 마다 새로운 빈을 만들어 리턴
request - HTTP request 객체당 하나의 빈을 리턴
session - HTTP session 당 하나의 빈을 리턴
globalSession - 전체 모든 세션에 대해 하나의 빈을 리턴

@Component
@Scope("prototype")   //요구시마다 하나의 새로운 빈을 리턴
class Ojc {
   ……
}

<bean id="ojc" class="oraclejava.edu.Ojc"   scope="prototype"/>

빈을 주입 받는 경우 아래의 어노테이션이 사용 가능하다.

n  @Autowired
Spring Framework에 종속적인 어노테이션 이다.
빈의 id, name로 아무거나 맞으면 적용(Type Driven Injection)
여러개의 빈이 검색될 경우 @Qualifier(name="xxx") 어노테이션으로 구분한다.
기본적으로 @Autowired된 속성은 모두 빈이 주입되어야 한다. (주입될 빈이 없는 경우가 있다면 required=false로 하면 오류는 발생하지 않는다.)
멤버변수, setter 메소드생성자일반 메소드에 적용 가능

n  @Resource
Spring2.5 이상에서 사용가능하며 Spring Framework에 비종속적으로 권장하는 방식이다.
빈의 name으로 주입될 빈을 찾는다.
멤버변수, setter 메소드에 적용가능
사용하기 위해서는 jsr250-api.jar가 클래스패스에 추가되야 한다.

[MAVEN 설정]
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>

n  @Inject
Spring3.0 이상에서 사용가능 하다.
특정 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>

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

package day1;
public class Emp {
   private String ename;
   @Required
   public void setEname(String ename) {      this.ename = ename;    }
   public String getEname() {      return this.ename;    }
}

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> 설정을 추가하면 된다.

n  @Named : JSR-330의 어노테이션이며 Spring @Component, @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) {  }

[MAVEN 설정]
<dependency>
           <groupId>javax.inject</groupId>
           <artifactId>javax.inject</artifactId>
           <version>1</version>
</dependency>





n  @Order
Spring4에서 새로 소개된 @Order 어노테이션은 같은 타입의 빈이 컬렉션(List) Autowired 될 때 그 순서를 지정한다.(낮은 숫자가 우선순위가 높다)
  
n  @PostConstruct
객체가 생성된 후 별도의 초기화 작업을 위해 실행하는 메소드를 선언한다.
CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시키거나 <context:annotation-config> 태그를 사용하면 된다.

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

n  @PreDestroy
스프링 컨테이너에서 객체()를 제거하기 전에 해야할 작업이 있다면 메소드위에 사용하는 어노테이션 이다이 어노테이션을 사용하기 위해서는 CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록하거나 <context:annotation-config> 태그를 사용하면 된다.

댓글 없음:

댓글 쓰기