LazyController
(DispatcherController은 빈으로 등록했는데그거 myservlet에다가 등록했네 와 이걸 지금 앎...)

정리정리
원래 등록 되어있는 빈은
최초 시작 할 때 자동으로 생성 됨 . 사용하지도 않는데 우선 생성이 돼!  (  ===> lazy-init="false" 이게 기본임)
아니 사용하지도 않는 데 생성되고 그려... 메모리 부화되게.....
그래서 그 걸 지연시키기 위해 쓰는게    (  ===> lazy-init="true" 로 만드는거.... )
@Lazy임!  그니까... 내가 요청할 때 그때 생성되게 하는 하는 용도지
여기까지가 기본 !!


그런데 !! 예외가 있음

만약  lazy 시킬 페이지가 다른 페이지에서 false(디폴트)를 참조되고 있다면

(쉽게말해서 다른페이지랑  연결되어 있는데 거기서는 최초 실행 시 빈을 생성하게 하는 페이지인거지 !!)
lazy가 먹질 않음!! 이건 어찌보면 당연한거... 

 

이건 콘솔창을 봐야 함!

 

lazy 설정 전 

LazyController 생성자가 찍힘

서버 처음 시작하면 자동으로 생성이 됨

근데 Lazy 넣어주면

/*
  프로젝트 최초 실.행. 시. 스프링이 관리하는 빈(스프링 컨테이너에 등록된 빈)은 하나가 생성된다(싱글톤)  ---요게 기본
  해당 빈을 사용할 때가 아닌 프로젝트 실행 시 생성되서  아 어쩐지 빈에서 문제있으면 시작하자마자 에러뜨더라.....
  그치만 사용하지도 않는데 생성해서 메모리를 잡아버리네
  그래서 요청할 때 생성하게 만드는 게 Lazy-init 속성을 추가 하는 것!
  default : 최초실행 시 생성
  true :  요청 시 생성
 ※단,lazy-init="true" 로 설정해도 해당 빈이 lazy-init="false" 인 빈에서 참조 된다면 
	 의존성 관계(DI)로 인해 프로젝트 최초 실행시에 생성되게 된다.
  
   2. 어노테이션으로 빈을 생성하는 경우
	@Lazy 어노테이션 사용.디폴트는 value=true 이다 
 */

@Controller
@Lazy
public class LazyController {

	public LazyController() {
		System.out.println("LazyController 생성자");
	}
	
	@RequestMapping("/Lazyloading/Lazy.do")
	public String exec(Model model) {
		//데이터 저장
		model.addAttribute("message","요청 시 LazyController가 생성됩니다.");
		//뷰정보 반환
		return "annotation06/Annotation";
	}		
}

 

처음 서버 시작할 때 안뜸

 

페이지 요청 시( 저기 저 lazy 버튼 누를 때 ) 그제야 생성됨 ! 확인 끝!

 

 


여기서 한 번 더  어노테이션들 정리 


<context:component-scan base-package= "최상위 패키지명" /> 
최상위 패키지부터 하위 패키안에 있는 모든 컴포넌트(자바 클래스)를 자동으로 생성해준다 
 즉 설정파일(xml)에 빈을 등록할 필요 없다. (겁나 왔다갔다 할 필요가 없음 !!)
 단, class앞에 @Controller,@Component,@Service,@Repository등이 붙은 클래스만 생성해 준다.
 각 클래스의 성격에 따라 적절한 어노테이션을 붙이자 

==> 후려쳐서 

<bean:> 요 딴거 안만들어도 되고 해당 페이지에 적절한 @어노테션만 쓰면

<context:component-scan base-package= "최상위 패키지명" />  얘가 @어노 붙은 애들을 몽땅 다  처리해 준다는 것 ! 


 @Controller : 사용자 요청을 처리하는 클래스 
 @Service : 서비스 역할을 하는 클래스(비지니스 로직을 갖고있는 클래스) 
 @Repository: 저장소와 관련된 로직을 갖고 있는 클래스(DAO계열 클래스) 
 @Configuration: 빈 설정파일이 아닌 자바코드로 빈을 컨테이너에 등록할때
 @Component:기타 클래스 
 -스프링 2.5 버전에서 등장.이전 버전의 스프링에서는 모든 빈들은 XML 파일에 설정해야함.
 -최상위 패키지 안의 클래스들을 스캔하고 위 어노테이션이 붙은 클래스들의 인스턴스를 생성 
 -@Autowired 와 @Resource 같은 어노테이션을 사용할 수 있다 . 즉 컨테이너에 빈이 등록되야
  주입이 가능하다


<아래 주석 혹은 use-default-filters="false"시 사용자 요청처리와 관련된 모든 클래스를 빈으로 등록해야 생성된다 
모든 어노테이션(@Controller,@Service, @Repository, @Component)의 자동 생성을 막는다
단,@Controller어노테이션은 제외 
<context:component-scan  base-package="com.kosmo.springapp" use-default-filters="false">
         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

+ Recent posts