on
의존성 주입 (DI) 자동 주입
의존성 주입 (DI) 자동 주입
728x90
UserController, UserServiceImpl는 기대하는 객체이다.
context-2.xml에는 namespace라는 추가적인 파일을 사용할 예정이다.
context를 체크하고,
으로 작성하는 방법이다. base-package는 사용할 파일이 있는 경로를 입력한다. com.sample이라고 작성하면 *라는 의미로 전체의 파일을 사용할 수 있다.
여러가지 class로 종류가 많다. spring Container도 많다. 클래스에 따라서 계층에 맞게 사용되도록한다.
@Controller 컨트롤러를 표현한다.
@Repository 데이터베이스를 영속화 한다.
@Service 업무로직
프론트컨트롤러가 전달, 허용하는 곳에 전달해서 관리한다.
Activates various annotations to be detected in bean classes
다양한 어노테이션을 감지하고, 해당하는 객체들이 스프링의 bean으로 등록하게 하고, 적절한 작업을 수행하게 한다.
클래스안에 포함된 다양한 어노테이션을 감지하고, 그 어노테이션을 분석하고, 적절한 처리를 수행하는 다양한 AnnonationProcessor 객체가 스프링 컨테이너에 등록된다.
AnnonationProcessor객체는 스프링 컨테이너가 스프링 빈 설정파일을 읽어서 객체가 생성하면, 생성된 객체에 포함된 어노테이션을 분석해서 의존성주입(객체조립), 객체에 대한 전처리/후처리, 트랜젝션처리 등 다양한 작업을 수행한다.
의존성도 주입하고, 스캔한 어노테이션끼리 조립도 함
의존성도 주입하고, 스캔한 어노테이션끼리 조립도 함 @Required, @Autowired, @PostConstruct, @PreDestroy, @Resource, @Transactional 등의 어노테이션이 처리대상 어노테이션이다
@Required, @Autowired,@Resource 의존성주입에 대해서 담당하는 곳
@PostConstruct, @PreDestroy 객체에 대한 전처리/후처리
@Transactional 트랜잭션처리 객체 생성 후 전처리, 후처리, 조립등을 담당한다.
지정된 패키지 및 그 하위 패키지에서 클래스를 스캔해서 자동으로 컨테이너의 객체로 등록(생성)/조립/보관하게 한다.
@Component, @Repository, @Service, @Controller, @RestController, @ControllerAdvice, @Configuration 등의
어노테이션이 부착된 클래스만 스캔한다. 그 외의 것은 스캔하지 않는다.
어노테이션이 부착된 클래스만 스캔한다. 그 외의 것은 스캔하지 않는다. @Component 어노테이션을 상속받아서 사용자 정의 어노테이션을 정의하면 사용자 정의 어노테이션이 부착된 클래스도 스캔대상이 된다.
@Repository, @Service, @Controller, @RestController, @ControllerAdvice, @Configuration 모두 @Component의 자손이다.
다양한 어노테이션이 존재하는 이유는 특정 역할의 수행하는 클래스마다 각각 다른 어노테이션을 부착하고, 해당 어노테이션이 부착된 클래스만을 대상으로 더 다양한 서비스를 제공하기 위해서다.
@Repository =DB Access , @Service 업무로직 @Controller MVC에서 컨트롤러에 위임@RestController=restApplication
@ControllerAdvice 컨트롤러 공통설정 @Configuration 자바클래스가 스프링의 환경설정파일에 붙인다.
용도에 맞게 어노테이션을 정의한다. 순수하게 객체 생성만 담당한다.
productController
product vo객체를 만들고 productServiceImpl도 만들었다.
자동식의 경우 @AutoWired라는 어노테이션을 이용해서 연결한다.
자동식의 경우 @AutoWired라는 어노테이션을 이용해서 연결한다. @Autowired
private ProductService productService;
//controller에 productService위에 autowired를 붙인다.
//internalAutowiredAnnotationProcessor
public String execute(int productNo) {
Product product = productService.getProductByNo(productNo);
System.out.println("상품 번호 :" + product.getNo());
System.out.println("상품 이름 :" + product.getName());
System.out.println("제조 회사 :" + product.getMaker());
System.out.println("상품 가격 :" + product.getPrice());
System.out.println("할인 가격 :" + product.getDiscountPrice());
return "product.jsp";
}
@Autowired 자동으로 객체조립(의존성 주입:Dependency Injection)을 수행하게 한다. 객체조립 절차 1. 스프링 컨테이너가 빈 설정 정보를 이용해서 해당 객체를 모두 생성하고, 스프링 컨테이너에 보관한다. 2. AnnotaionProcessor가 스프링 컨테이너에 등록된 모든 객체의 어노테이션 정보를 분석한다. 3. @Autowired 어노테이션을 감지하면 해당 어노테이션이 부착된 멤버변수의 타입을 알아낸다. 4. 스프링 컨테이너에 보관된 객체들 중에서 해당 타입의 객체가 있는지 확인한다. 5. 해당 타입의 객체가 발견되면 그 객체의 참조값을 멤버변수에 대입해서 객체가 조립되게 한다.
* 단, 해당타입의 객체가 존재하지 않거나, 해당 타입의 객체가 2개 이상 발견되는 경우 예외가 발생한다.
* 객체가 2개이상 존재하는 경우에는 특별한 경우이다. 2개이상 존재할 수는 있다.
동일한 타입의 객체가 2개이상 존재하는 경우, 특정 객체 하나만 조립되게 하기 @Primary 어노테이션을 2개 중에 한 클래스에 부착한다.
연결될 productServiceImpl에는
@Component
@Primary
public class ProductServiceImpl implements ProductService{
@Override
public Product getProductByNo(int no) {
return new Product(100, "애플워치", "애플", 650000, 610000);
}
}
vo, DAO, DTO에는 붙이지 않는다. 항상 새롭게 만들어야한다.
service, Controller처럼 1개만 만들고 계속 사용해야하는 경우에만 사용한다.
이제는 base-packag로 경로만 작성할 예정이다.
자동은 어노테이션이 없으면 호출되지 않는다.
1개이상 존재하지 않으면 No such BeanDefinition으로 에러가 나온다.
728x90
from http://lionpower.tistory.com/283 by ccl(A) rewrite - 2021-12-27 10:27:28