Spring 에서 Bean 을 만 드 는 6 가지 방법 에 대한 상세 한 설명
본 고 는 Spring 응용 에서 Bean 을 만 드 는 여러 가지 방식 을 설명 했다.자동 생 성,수 동 생 성 주입 방식 을 포함 하고 실제 개발 에서 업무 장면 에 따라 적당 한 방안 을 선택 할 수 있다.
방식 1:
Spring XML 방식 으로 설정 합 니 다.이 방식 은 순수 Spring 응용 에 사용 되 며 간단 한 애플 리 케 이 션 에 적 용 됩 니 다.응용 이 복잡 해 지면 XML 프로필 이 팽창 하여 대상 관리 에 불리 합 니 다.
<bean id="xxxx" class="xxxx.xxxx"/>
방식 2:@Component,@Service,@Controler,@Repository 주석 사용 하기
이 몇 개의 주 해 는 모두 같은 기능 입 니 다.주 해 된 종 류 는 Spring 용기 에 하나의 대상 을 만 들 것 입 니 다.
@Component
public class User{
}
Spring Boot 응용 에 사용 할 때 주 해 된 종 류 는 시작 클래스 의 루트 경로 나 하위 경로 에 있어 야 합 니 다.그렇지 않 으 면 유효 하지 않 습 니 다.없 으 면@Componentscan 으로 스 캔 경 로 를 표시 할 수 있 습 니 다.
spring xml 에 도 관련 태그 가 있 습 니 다
@ComponentScan(value={"com.microblog.blog","com.microblog.common"})
public class MicroblogBlogApplication {
public static void main(String args[]){
SpringApplication.run(MicroblogBlogApplication.class,args);
}
}
방식 3:@Bean 주 해 를 사용 합 니 다.이 방식 은 Spring Boot 응용 프로그램 에 사 용 됩 니 다.
@Configuration 표 지 는 Spring Boot 설정 클래스 입 니 다.이 클래스 에@Bean 주석 이 존재 하 는 지 스 캔 합 니 다.예 를 들 어 다음 코드 는 User 대상 을 만 들 고 용기 에 넣 습 니 다.
@ConditionalOnBean 은 어떤 Bean 이 존재 하 는 지 판단 할 때 만 User Bean 을 만 듭 니 다.
여기 서 만 든 Bean 이름 은 기본적으로 방법의 이름 user 입 니 다.@Bean("xxxx")정의 도 가능 합 니 다.
@Configuration
public class UserConfiguration{
@Bean
@ConditionalOnBean(Location.class)
public User user(){
return new User();
}
}
Spring boot 는 우리 에 게 더 많은 유사 한 주 해 를 제공 했다.방식 2 와 마찬가지 로 스 캔 경로 에 문제 가 있 을 수 있 습 니 다.상기 해결 방식 을 제외 하고 Spring boot starter 를 사용 하 는 해결 방식 도 있 습 니 다.
resources 에서 다음 파일 을 만 듭 니 다.META-INF/spring.factories.
Spring Boot 는 시작 할 때 이 파일 을 검색 합 니 다.설정 류 UserConfiguration 을 어디서 가 져 옵 니까?
spring.factories.
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.log.config.UserConfiguration
만약 성공 하지 못 한다 면,이 의존 도 를 도입 하 십시오.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
이 방식 도 SpringBoot-starter 를 만 드 는 방식 입 니 다.방식 4:
주석@Import 를 사용 하면 대상 을 만 들 고 용기 에 주입 합 니 다.
@Import(User.class)
public class MicroblogUserWebApplication {
public static void main(String args[]) {
SpringApplication.run(MicroblogUserWebApplication.class, args);
}
}
방식 5:ImportSelector 또는 ImportBeanDefinitionRegistrar 인 터 페 이 스 를 사용 하여@Import 와 결합 하여 구현 합 니 다.
Spring Boot 제3자 구성 요 소 를 사용 할 때 관련 서 비 스 를 사용 할 수 있 도록@EnableXXX 를 자주 볼 수 있 습 니 다.여 기 는 하나의 예 로 이 루어 집 니 다.
테스트 클래스 생 성
@Slf4j
public class House {
public void run(){
log.info("House run ....");
}
}
@Slf4j
public class User {
public void run(){
log.info("User run ....");
}
}
@Slf4j
public class Student {
public void run(){
log.info("Student run ....");
}
}
ImportSelector 인터페이스 구현selectImports 방법의 반환 값 은 Bean 을 만 들 클래스 이름 입 니 다.사용자 클래스 를 만 듭 니 다.
@Slf4j
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
log.info("MyImportSelector selectImports ...");
return new String[]{
User.class.getName()};
}
}
ImportBeanDefinitionRegistrar 인터페이스 구현beanDefinition Registry.registerBeanDefinition 은 Bean 을 만 들 클래스 이름 을 설정 하 는 데 사 용 됩 니 다.이곳 에 하우스 클래스 를 만 듭 니 다.
@Slf4j
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
log.info("MyImportBeanDefinitionRegistrar registerBeanDefinitions .....");
BeanDefinition beanDefinition = new RootBeanDefinition(House.class.getName());
beanDefinitionRegistry.registerBeanDefinition(House.class.getName(),beanDefinition);
}
}
설정 클래스 만 들 기Student 클래스 를 만 듭 니 다.
@Configuration
public class ImportAutoconfiguration {
@Bean
public Student student(){
return new Student();
}
}
EnableImportSelector 주석 만 들 기EnableImportSelector 주석 에@Import 를 사용 하여 상기 세 가지 종 류 를 도입 합 니 다.
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
@Import({MyImportSelector.class,ImportAutoconfiguration.class,MyImportBeanDefinitionRegistrar.class})
public @interface EnableImportSelector {
String value();
}
테스트
@EnableImportSelector(value = "xxx")
@SpringBootApplication
public class ImportDemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(ImportDemoApplication.class, args);
User user = context.getBean(User.class);
user.run();
Student student = context.getBean(Student.class);
student.run();
House house = context.getBean(House.class);
house.run();
}
}
출력,보 실 수 있 습 니 다.세 가지 User Student House 가 모두 만 들 어 졌 습 니 다.모두 Spring 용기 에서 얻 을 수 있 습 니 다.
2019-06-20 17:53:39.528 INFO 27255 --- [ main] com.springboot.importselector.pojo.User : User run ....
2019-06-20 17:53:39.530 INFO 27255 --- [ main] c.s.importselector.pojo.Student : Student run ....
2019-06-20 17:53:39.531 INFO 27255 --- [ main] c.springboot.importselector.pojo.House : House run ....
방식빈 용 기 를 수 동 으로 주입 하고 일부 장면 에서 코드 동적 주입 이 필요 하 며 상기 방식 은 모두 적용 되 지 않 습 니 다.이 때 는 대상 을 만들어 수 동 으로 주입 해 야 합 니 다.
Default Listable BeanFactory 를 통 해 주입 합 니 다.
registerSingleton(String beanName,Object object);
new 를 수 동 으로 사용 하여 Location 대상 을 만 들 었 습 니 다.용기 에 주입 한다.
@Component
public class LocationRegister implements BeanFactoryAware {
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
DefaultListableBeanFactory listableBeanFactory = (DefaultListableBeanFactory)beanFactory;
Location location = new Location();
listableBeanFactory.registerSingleton("location1",location);
}
}
이러한 방식 의 응용 장면 은 인 터 페 이 스 를 위 한 동적 에이전트 대상 을 만 들 고 SPRING 용기 에 등록 하 는 것 이다.예 를 들 어 MyBatis 의 Mapper 인터페이스,Mapper 는 클래스 가 구현 되 지 않 았 습 니 다.시작 할 때 동적 프 록 시 대상 을 만 들 고 이 대상 을 용기 에 등록 합 니 다.사용 할 때@Autowired 주입 만 하면 사용 할 수 있 습 니 다.인터페이스 호출 방법 은 프 록 시 에 의 해 차단 되 고 관련 SqlSession 실행 과 관련 된 SQL 업무 논 리 를 호출 합 니 다.
그 계승 체 계 를 살 펴 볼 수 있다.
Default Listable BeanFactory 는 Configurable Listable BeanFactory 의 실현 클래스 입 니 다.빈 팩 토리 기능 확장 입 니 다.
테스트 코드 는 위 와 같 습 니 다.
Location location = context.getBean(Location.class);
location.run();
본 논문 의 관련 코드 는인 스 턴 스 코드테스트 클래스에 있다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.