소 백 학습 백 엔 드 개발 의 Spring 프레임 워 크 주석 대전(1)

10427 단어 자바web
봄 첫 시도
1.IOC 용기 Bean 을 xml 형식 으로 설정 합 니 다.
Project 아래 에 resources 폴 더 를 찾 아 beans.xml(xml 파일 이름 마음대로)을 만 듭 니 다.다음 과 같이 불 러 올 bean 을 bean 노드 아래 에 삽입 합 니 다.id 와 class 클래스 를 정의 합 니 다.응용 프로그램 이 만 들 어 졌 을 때,그 는 대응 하 는 xml 파일 을 쓸 고,여기에 정 의 된 bean 을 IOC 용기 에 불 러 옵 니 다.



    
        
        
    


테스트 방식:(xml 형식 은 ClassPathXmlApplicationContext 를 사용 해 야 합 니 다)
ApplicationContext appxml = new ClassPathXmlApplicationContext("beans.xml");
Person person = appxml.getBean("person", Person.class);
System.out.println(person.toString());

2.주석 형식 으로 bean 불 러 오기
주석 1:@Configuration 은 클래스 에 작용 합 니 다.이 주석 에 표 시 된 클래스 는 beans.xml 주석 2:@Bean 이 방법 에 작용 하 는 것 으로 이해 할 수 있 습 니 다.주로 IOC 용기 에 Bean 을 등록 하 는 역할 을 합 니 다.값 은 id 반환 값 은 Bean 의 유형 입 니 다.
@Configuration
public class MainConfig {

    @Bean("springPerson")
    public Person getPerson(){
        return new Person("spring",17);
    }
}

테스트 방식:
ApplicationContext app = new AnnotationConfigApplicationContext(MainConfig.class);
Person springPerson = (Person) app.getBean("springPerson");
System.out.println(springPerson.toString());
String[] beanNamesForType = app.getBeanNamesForType(Person.class);
for (String name : beanNamesForType) {
    System.out.println(name);
}

소 백 으로서 이런 조작 주 해 를 처음 봤 는데 여기 가 무슨 작용 을 하 는 지 모르겠다.
Spring Bean 과 Configuration 업그레이드
1.ComponentScan 정의 스 캔 구성 요소 규칙
주 해 를 통 해 설정 클래스,즉 Configuration 을 정의 할 수 있 습 니 다.MVC 의 경우 저 는 보통 Controller,Service,Dao 를 정의 합 니 다.그래서 우 리 는 이러한 관련 종 류 를 많이 정의 하지만 모든 종 류 를 IOC 용기 에 불 러 와 야 하 는 것 은 아니다.Component 란 사실 Controller,Service,Dao(Repository)는 모두 Component 가 본질 적 인 차이 가 없 는 유형 으로 주석 이 표 시 될 때 그 역할 을 나타 내 고 제시 역할 을 한다.다음 디 렉 터 리 구조:
-test2 -controller OrderControlller.java -dao OrderDao.java -service OrderService.java
@Controller
public class OrderControlller {
}

@Repository
public class OrderDao {
}

@Service
public class OrderService {
}

다음 설정 클래스 정의
@Configuration
@ComponentScan(value = {"lsn01.cap02"}, includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
public class Cap01MainConfig {
}

테스트 방식 정의:
@Test
public void testComponentScan(){
    ApplicationContext app = new AnnotationConfigApplicationContext(Cap02MainConfig.class);
    String[] beanDefinitionNames = app.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames) {
        System.out.println("beanDefinitionName = "+beanDefinitionName);
    }
}

ComponentScan 주석 주요 속성,
1.value 스 캔 패키지 경로 설정String[] value() default {}2.includeFilters 는 어떤 Filter 를 포함 합 니까?type 과 classs 를 정의 하여 검색 할 수 있 는 것 을 지정 할 수 있 습 니 다.예 를 들 어:@ComponentScan.Filter(type=FilterType.ANNOTATION,classes={Controller.class})인쇄 결과:
beanDefinitionName = org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanDefinitionName = org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanDefinitionName = org.springframework.context.annotation.internalCommonAnnotationProcessor
beanDefinitionName = org.springframework.context.event.internalEventListenerProcessor
beanDefinitionName = org.springframework.context.event.internalEventListenerFactory
beanDefinitionName = cap02MainConfig
beanDefinitionName = orderControlller
beanDefinitionName = orderDao
beanDefinitionName = orderService

분명히 필터 효과 가 없 었 고 모든 구성 요 소 를 스 캔 해 들 어 왔 습 니 다.우리 에 게 필요 한 것 은Controller주 해 를 포함 하 는 클래스 일 뿐 입 니 다.useDefaultFilters=false 설정 이 기본 Filters 로 닫 혔 기 때 문 입 니 다.
beanDefinitionName = org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanDefinitionName = org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanDefinitionName = org.springframework.context.annotation.internalCommonAnnotationProcessor
beanDefinitionName = org.springframework.context.event.internalEventListenerProcessor
beanDefinitionName = org.springframework.context.event.internalEventListenerFactory
beanDefinitionName = cap02MainConfig
beanDefinitionName = orderControlller

3.excludeFilters 는 필터 주 의 를 포함 하지 않 습 니 다.이 주 해 를 사용 하면 true 로 설정 할 필요 가 없습니다.그렇지 않 으 면 구성 요 소 를 검색 하지 않 습 니 다.
excludeFilters =
                @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class}),
        useDefaultFilters = false

인쇄 결과:
beanDefinitionName = org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanDefinitionName = org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanDefinitionName = org.springframework.context.annotation.internalCommonAnnotationProcessor
beanDefinitionName = org.springframework.context.event.internalEventListenerProcessor
beanDefinitionName = org.springframework.context.event.internalEventListenerFactory
beanDefinitionName = cap02MainConfig

4.사용자 정의 필터
public class CustomFilter implements TypeFilter {

    public boolean match(MetadataReader metadataReader,
                         MetadataReaderFactory metadataReaderFactory) throws IOException {
        //          
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        Set annotationTypes = annotationMetadata.getAnnotationTypes();
        for (String annotationType : annotationTypes) {
            System.out.println("annotationType : "+annotationType);
        }
        //          
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        String className = classMetadata.getClassName();
        System.out.println("classMetadata className = "+className);
        //        
        Resource resource = metadataReader.getResource();
        String filename = resource.getFilename();
        System.out.println("filename = "+filename);

        //  true    ,false     
        return false;
    }
}

관련 사용자 정 의 는 위의 세 가지 정보 에 따라 속 하 는 결과 논리 로 되 돌아 갈 수 있 습 니 다.
결과 인쇄
classMetadata className = lsn01.cap02.config.CustomFilter
filename = CustomFilter.class
annotationType : org.springframework.stereotype.Controller
classMetadata className = lsn01.cap02.controller.OrderControlller
filename = OrderControlller.class
annotationType : org.springframework.stereotype.Repository
classMetadata className = lsn01.cap02.dao.OrderDao
filename = OrderDao.class
annotationType : org.springframework.stereotype.Service
classMetadata className = lsn01.cap02.service.OrderService
filename = OrderService.class
beanDefinitionName = org.springframework.context.annotation.internalConfigurationAnnotationProcessor
beanDefinitionName = org.springframework.context.annotation.internalAutowiredAnnotationProcessor
beanDefinitionName = org.springframework.context.annotation.internalCommonAnnotationProcessor
beanDefinitionName = org.springframework.context.event.internalEventListenerProcessor
beanDefinitionName = org.springframework.context.event.internalEventListenerFactory
beanDefinitionName = cap02MainConfig

1.인쇄 결 과 를 보면 가장 먼저 스 캔 한 것 은 CustomFilter 2,FilterType.ANNOTATION:주석 에 따라 FilterType.ASSIGNABLETYPE:주어진 유형 에 따라;예 를 들 어 Bookservice 형식 에 따라 FilterType.AspeCTJ:ASPECTJ 표현 식 FilterType.REGEX 사용:정규 지정 FilterType.USTOM 사용:사용자 정의 규칙 을 사용 하고 자신 이 쓴 클래스 를 사용 하여 TypeFilter 인터페이스 구현>
2.scope 정의 스 캔 규칙
scope 의 주요 역할 은 Bean 이 IOC 용기 에 있 는 생 성 규칙 prototype:다 중 인 스 턴 스 를 정의 하 는 것 입 니 다.IOC 용기 시작 은 호출 방법 으로 대상 을 만 드 는 것 이 아니 라 가 져 올 때마다 호출 방법 으로 대상 singleton:단일 인 스 턴 스(기본 값)를 만 듭 니 다.IOC 용기 시작 시 호출 방법 생 성 대상 을 IOC 용기 에 넣 은 후 제출 할 때마다 용기(map.get 대상 으로 이해)에서 request 를 가 져 옵 니 다.주로 WEB 응용 프로그램 에 대해 같은 요청 으로 인 스 턴 스 session 을 만 듭 니 다.같은 session 에서 인 스 턴 스 를 만 듭 니 다.
@Configuration
public class Cap02MainConfig {
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    @Bean
    public Person person(){
        System.out.println("     person  ");
        return new Person();
    }
}

@Test
public void testScope(){
    ApplicationContext app = new AnnotationConfigApplicationContext(Cap02MainConfig.class);
    System.out.println("IOC        ");
    Person person1 = app.getBean("person", Person.class);
    
    Person person2 = app.getBean("person", Person.class);
    System.out.println("person1 == person2 is "+(person2 == person1));
}

인쇄 결과:추가 하지 않 으 면@Scope(ConfigurableBeanFactory.SCOPEPROTOTYPE)
     person  
IOC        
person1 == person2 is true

추가@Scope(ConfigurableBeanFactory.SCOPEPROTOTYPE)
IOC        
     person  
     person  
person1 == person2 is false

결론 은 기본 적 인 상황 이 AnnotationConfigApplication Context 가 만 들 어 졌 을 때 Spring 은 모든 관련 bean 의 생 성 을 자동 으로 완 성 했 고 하나의 예 류 였 다.Scope(ConfigurableBeanFactory.SCOPEPROTOTTYPE)는 다 중 인 스 턴 스 클래스 이 며,applicationContext 가 생 성 됨 에 따라 생 성 되 는 것 이 아 닙 니 다.
3,게 으 름 로드
@Configuration
public class Cap02MainConfig {
    //@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    @Lazy
    @Bean
    public Person person(){
        System.out.println("     person  ");
        return new Person();
    }
}

@Test
public void testScope(){
    ApplicationContext app = new AnnotationConfigApplicationContext(Cap02MainConfig.class);
    System.out.println("IOC        ");
    Person person1 = app.getBean("person", Person.class);
    
    Person person2 = app.getBean("person", Person.class);
    System.out.println("person1 == person2 is "+(person2 == person1));
}

인쇄 결과:
IOC        
     person  
person1 == person2 is true

좋은 웹페이지 즐겨찾기