경제학도의 개발공간
[20180424]Spring_Annotation 본문
반응형
*의존성 자동 주입
*Annotation :
클래스 , 필드 , 메서드 과 같은 프로그램 요소에
다양한 종류의 정보를 주는 방법
장점 : 코드량 감소
단점 : 가독성은 떨어진다
1. xml 기술
2. annotation 기술
EX)
-Java : @override
-Servlet : @WebServlet()
Spring 4대 Annotation
@Contoller, @Service, @Repository, @Component 이 4가지 어노테이션은 모두 빈에 자동으로 등록하기 위해서 선언하는 어노테이션 입니다. 매번 어떨 때 써야 맞는건지 고민 하신다면 아래의 표를 참고해 보시기 바랍니다.
@Controller | Presentation Layer에서 Contoller를 명시하기 위해서 사용 |
@Service | Business Layer에서 Service를 명시하기 위해서 사용 |
@Repository | Persistence Layer에서 DAO를 명시하기 위해서 사용 |
@Component | 그 외에 자동으로 스캔해서 등록하고 싶은 것들을 위해 사용 |
해당 4가지 Annotation은 <context:component-scan base-package="~~~"> 을 사용함으로써 자동으로 객체 생성 가능
@Autowired > Type기반
목적 : 의존관계를 자동설정할 때 사용하며 [타입을 이용]하여 의존하는 객체를 삽입해 준다.
그러므로 IOC Container안에 해당 타입의 빈객체가 존재하지 않거나 또는 2개 이상 존재할 경우
스프링은 예외를 발생시키게 된다. ()
설정 위치 : 생성자, 필드, 메소드(굳이 setter메소드가 아니어도 된다)
추가설정 :
1. import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
2. IOC 컨테이너 안에 bean 객체로 생성 [AutowiredAnnotationBeanPostProcessor] 되어 있어야 @Autowired 동작한다 .
3. 매번 Annotation적용을 위해 필요한 bean 등록하는 작업은 너무 힘들다.
4. <context:annotation-config> => annotation에 필요한 bean들이 자동으로 등록된다(단점 : 사용하지 않는 것도 등록 된다.
1. import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
2. IOC 컨테이너 안에 bean 객체로 생성 [AutowiredAnnotationBeanPostProcessor] 되어 있어야 @Autowired 동작한다 .
3. 매번 Annotation적용을 위해 필요한 bean 등록하는 작업은 너무 힘들다.
4. <context:annotation-config> => annotation에 필요한 bean들이 자동으로 등록된다(단점 : 사용하지 않는 것도 등록 된다.
옵션 : required -
@Autowired어노테이션을 적용한 프로퍼티에 대해 굳이 설정할 필요가 없는 경우에
false값을 주며 이때 해당 프로퍼티가 존재하지 않더라도 스프링은 예외를 발생시키지 않는다. 디폴트값은 true
Autowired가 적용되지 않는 경우
(By Type)
1. injection 되는 같은 타입의 bean IOC컨테이너 없는 경우 (exception 발생)
2. injection 되는 [타입] 여러개가 있는 경우 (exception 발생)
<bean id="xx" class="DI_Annotation_01.Recorder"></bean>
<bean id="yy" class="DI_Annotation_01.Recorder"></bean>
3.예외적으로 같은 타입의 bean 이 여러개 있다 하더라도
public void RecordMethod(Recorder rec) > parameter 이름이
bean id 값 하고 같으면 알아서 injection
원칙적인 방법은 아니고 > @Resource 를 사용
2. injection 되는 [타입] 여러개가 있는 경우 (exception 발생)
<bean id="xx" class="DI_Annotation_01.Recorder"></bean>
<bean id="yy" class="DI_Annotation_01.Recorder"></bean>
3.예외적으로 같은 타입의 bean 이 여러개 있다 하더라도
public void RecordMethod(Recorder rec) > parameter 이름이
bean id 값 하고 같으면 알아서 injection
원칙적인 방법은 아니고 > @Resource 를 사용
@Qualifier
목적 : @Autowired의 목적에서 동일 타입의 빈객체가 존재시 특정빈을 삽입할 수 있게 설정한다.
설정위치 : @Autowired 어노테이션과 함께 사용된다.
추가설정 : 동일타입의 빈객체 설정에서 <qualifier value="[alias명]" />를 추가하여 준다.
옵션 : name - alias명
@Required
목적 : 필수 [프로퍼티]를 지정
설정 위치 : setter메소드
추가설정 : RequiredAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다.
해당 설정 대신에<context:annotation-config> 태그를 사용해도 된다.
class User{
private String name;
@Required > 반드시 setter 에 값을 주입하겠다
public setName(String name){
this.name = name;
}
}
=> ApplicationContext.xml 에서
<context:annotation-config>
<bean id="user" class="DI_Annotation_03.User">
아래 부분이 있어야 @Required 어노테이션 만족
<property name="name" value="kglim"></property>
</bean>
@Resource
목적 : 어플리케이션에서 필요로 하는 자원을 자동 연결(의존하는 빈 객체 전달)할 때 사용
@Autowired 와 같은 기능을 하며 @Autowired와 차이점은 @Autowired는 타입으로(by type), @Resource는 이름으로(by name)으로 연결시켜준다는 것이다.
Resource를 쓰는 경우는 여러 객체가 만들어 질 때 다른 생성자를 사용하는 경우이다.
설정위치 : 프로퍼티, setter메소드
추가설정 : CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다.
해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.
옵션 : name
객체의 생성과 조립(삽입) -> Spring 통해서 작업
-> xml 을 통해서 필요한 bean의 생성과 injection 처리ㄴ
-> xml 없이도 지금와 동일한 작업이 가능
=> 자바코드 이용한 설정(자바코드 + Annotation )
=> xml (x)
선택사항 : xml 사용 또는 xml 설정없이 사용가능 (편리성에 따라서)
->xml문법 대신 자바코드를 이용해서 빈객체를 생성하고 프로퍼티 설정 가능
기존
ApplicationContext context =
new GenericXmlApplicationContext("classpath:ApplicationContext04.xml");
현재
new AnnotationConfigApplicationContext()
사용 어노테이션은
1. @Configuration :해당 클래스가 스프링의 설정으로 사용됨을 지정
ex)
@Configuration
public class configcontext {}
2. @Bean
ex)
@Configuration
public class configcontext {
@Bean
public User user(){
return new User();
}
xml 에서 아래코드과 같은 형태를 위 코드처럼 함수(method) 의 형태로 설계
<bean id="user" class="DI.User">
}
result :
> 어노테이션과 [메서드 이름]을 이용해서 스프링 컨테이너가 사용할 빈 객체 설정
> 메서드가 리턴하는 객체를 빈객체로 사용하겠다
class MemberRegisterService{
private MemberDao memberdao;
public MemberRegisterService(MemberDao memberdao){
this.memberdao = memberdao;
}
}
1. xml 설정
<bean id="memberRegSvc" class="MemberRegisterService">
<constructor-arg ref="memberdao">
</bean>
<bean id="memberdao" class="MemberDao" />
2. @Configuration
@bean
두개의 어노테이션을 이용해서 (java 코드 기반의 작업)
@Configuration
class Configcontext{
@bean
public MemberRegisterService memberRegSvc(){
return new MemberRegisterService(memberdao());
}
@bean
public MemberDao memberdao(){
return new MemberDao();
}
}
-------------------------------------------------------------
옵션 :
<bean id="m" class="board"></bean>
=> 자바코드
@bean
public board m(){
return new board();
}
옵션_1
@bean(name="hello")
public board m(){
return new board();
}
반응형
'BackEnd > Spring' 카테고리의 다른 글
[20180503]Mybatis WIth Spring (1) | 2018.05.03 |
---|---|
[20180503]Mybatis (0) | 2018.05.03 |
[20180425]AOP(Aspect Oriented Programming) (0) | 2018.05.02 |
[20180501]HandlerInterceptor (0) | 2018.05.01 |
[20180426] Spring MVC (0) | 2018.04.30 |