소 백 학습 백 엔 드 개발 의 Spring 프레임 워 크 주석 대전(1)
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.