클래스와 연관이 있고 import를 어노테이션과 연관이 있는 클래스 불러온다. 스프링의 3분의1은 어노테이션을 사용한다.
어노테이션은 한개이상 겹쳐서 나올 수가 있다.
@Required
@Autowired
- 1) 환경설정에 관한 어노테이션 => xml에서 사용
- 2) 자바코딩의 간결화 => 코드대신에 사용이 가능
1) 시스템 복잡성이 아니라면 어노테이션 사용은 적합하게 쓰이면 코드가 간결해지고 유지보수가 용이해진다.
2) 대형 시스템엔 계층 구조가 잘 파악되기 위해서는 xml 사용이 필수이다.
(어노테이션과 연관있는 클래스를 빈즈로 등록->xml)
1) 어노테이션 은 메타정보가 소스코드에 들어가므로 파악하기 어렵다.
(재 컴파일이 필요하다.)
2) 소스코드가 같이 제공되지 않으면 사용에 제약이 따른다.
(어노테이션과 클래스를 같이 사용해야한다.)
xml에서 @Required, @Autowired, @Resource를 사용하기위해서는 아래와 같은 빈즈클래스를 미리 등록시켜줘야 한다.
@Required
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />
@Autowired
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
@Resource
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
컴포넌트 스캔은 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능이다.
@Component
- 애노테이션으로 스캔 대상을 지정하여 자동적으로 그 패키지에 들어가 있는 모든 클래스 중에서 @Component가 붙어있는 클래스를 자동으로 빈즈로 등록시켜주는 어노테이션이다.
- 스프링이 검색해서 빈으로 등록할 수 있으려면 클래스에 @Component 어노테이션을 붙여야한다.
1)네임스페이스를 이용
2)component-scan 태그를 이용해서 빈즈객체를 자동으로 등록한다.
어노테이션 및 특정 패키지에 들어가 있는 모든 클래스의 빈즈객체를 자동으로 등록시켜주는(옵션)이다.
ex)
com.spring.anno5 -> Camera, Camera2, Camera3
com.spring.sub -> HomeController, HomeController2
base-package="com.spring.*" (위에 5개만 자동으로 등록한다.)
base-package="com.spring.sub" (sub의 2개만 등록한다.)
특정이름으로 가져오기
@Component -> 클래스 이름으로 등록, @Component("특정이름") -> 특정이름으로 가져오기
@Configuration
<기존의 방식>
인터페이스 -> 클래스, 클래스+클래스 => xml로 작성(의존객체를 가져옴)
ex)<bean id="mybean" class="anno6.MyBeanImpl" />
<xml을 대신한 java>
.java에 @Configuration을 지정하여 xml환경설정 파일 대신에 빈클래스를 등록 시켜서 환경설정을 해주는 역할을 한다.@Bean
<bean>
태그를 이용해서 빈즈를 등록시켜주는 것과 동일하게 대신 등록시켜주는 어노테이션이다.
🎈Main.javapublic class Main { public static void main(String[] args) { // TODO Auto-generated method stub //2. xml파일 역할의 자바환경설정파일을 메모리에 올려줄 수 있는 클래스를 통해서 객체를 생성 AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(AppConfig.class);//환경설정클래스명.class //MyBean bean=context.getBean(MyBean.class); MyBean bean=context.getBean("getBeanName",MyBean.class); System.out.println("bean => "+bean); System.out.println("bean.getBeanName() => "+bean.getBeanName()); //5. context도 종료 context.close();//메모리에 올려놓은 모든 빈즈객체들을 모두 메모리에서 해제 } }
2가지 옵션
context객체명.getBean(객체를 얻어올 클래스명.class)
context객체명.getBean("빈즈클래스 구분id", 객체를 얻어올 클래스명.class)
@Override
메서드명이 오버라이딩이 된 메서드인지 확인해주는 기능을 가진 어노테이션이다.
@Required
이 메서드를 반드시 호출해야되는데 만약에 호출하지 않으면 에러를 유발시킨다, 멤버변수와 관련된 에러메세지를 출력시켜준다.
xml에서 @Required를 사용하기 위해서 빈즈클래스 등록@Required <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />
@Autowired
스프링 빈에 의존하는 다른 빈을 자동으로 주입하고 싶을 때 사용한다.
ex) 같은기능(<bean> autowire="byType"/>
)🎈app2.xml <bean id="moniter" class="anno2.SystemMoniter" /> <!-- <bean id="sender" class="anno2.SmsSender" /> --> 🎈SystemMoniter.java @Autowired public void setSender(SmsSender sender) { this.sender = sender; System.out.println("setSender() 호출됨 => "+sender);//sender.toString }
@Autowired 특징
1 생성자, 멤버변수(=속성), 메서드에 지정이 가능하다.
2 @Autowired메서드를 호출하면서 매개변수가 의존성객체를 자동으로 얻어서 넣어준다.(멤버변수에)
3 Setter Method외에 다른 메서드에서 동일하게 적용이 된다.
4 해당하는 빈즈객체가 없거나 두 개이상 존재시 에러를 유발한다.
✔두 개이상 존재시 에러가 발생한 경우 : @키워드(속성명=속성값,,,속성명2=속성값2,,,)
Autowired(required=true)
무조건 가져와서 옵션을 부여하지만, 가져올 빈 객체가 없으면 에러가 유발된다.
✨멤버변수에 @Autowired을 준다면
간소화하여 자동으로 주입한다.🎈app2.xml <bean id="moniter" class="anno2.SystemMoniter" /> <bean id="sender" class="anno2.SmsSender" /> 🎈SystemMoniter.java @Autowired private SmsSender sender; ,,, /* @Autowired(required=false) public void setSender(SmsSender sender) { this.sender = sender; System.out.println("setSender() 호출됨 => "+sender);//sender.toString } */
@inject
@Inject는 @Autowired와 유사하게 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다.
pom.xml에 기술해서 다운로드 후 사용가능
🎈pom.xml에 추가<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>
@Autowired , @Inject의 차이점
- @Autowired =>xml 파일에 빈즈클래스 등록 (O)
- @Inject =>xml 파일에 빈즈클래스 등록 (X)
@Resource
같은 클래스 자료형이 여러개 있을때 각각의 객체를 구분하기 위해서 사용한다.
주입하려고 하는 객체의 이름(id)이 일치하는 객체를 자동으로 주입한다.
형식)
형식) @Resource(name="빈즈의 구분자id")
- 멤버변수에 적용->setXXX 메서드 생략가능하다.
- 자동으로 연결할 의존객체를 얻어올때 사용
🎈HomeController
- @Resource 을 사용하기위해서 다운로드
🎈pom.xml에 추가<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>
🎈app2.xml에 추가
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
@Resource와 @Autowired
- @Resource - byName(이름으로 찾아서 자동으로 객체를 넣어주는 개념)
- @Autowired - byType(같은 자료형을 찾아서 자동으로 객체를 넣어주는 개념)
공통점 : 자동으로 객체를 넣어준다. (멤버변수)
차이점 : byName vs byType
@PostConstruct
빈즉객체 생성전에 초기화 작업을 하고자할때(=생성자) 먼저 실행을 시킨다.
- 물건 사기전에 돈을 지불(=선불)
@PreDestroy
객체가 생성된 후에 작업을 한다.
- 메모리 작업해제, p91 close와 비슷하다.
- 물건을 받고 나중에 돈을 지불(후불)
@PostConstruct와 @PreDestroy