Spring 에서 Bean 을 만 드 는 6 가지 방법 에 대한 상세 한 설명

8160 단어 springBean
머리말
본 고 는 Spring 응용 에서 Bean 을 만 드 는 여러 가지 방식 을 설명 했다.자동 생 성,수 동 생 성 주입 방식 을 포함 하고 실제 개발 에서 업무 장면 에 따라 적당 한 방안 을 선택 할 수 있다.
방식 1:
Spring XML 방식 으로 설정 합 니 다.이 방식 은 순수 Spring 응용 에 사용 되 며 간단 한 애플 리 케 이 션 에 적 용 됩 니 다.응용 이 복잡 해 지면 XML 프로필 이 팽창 하여 대상 관리 에 불리 합 니 다.<bean id="xxxx" class="xxxx.xxxx"/>방식 2:
@Component,@Service,@Controler,@Repository 주석 사용 하기
이 몇 개의 주 해 는 모두 같은 기능 입 니 다.주 해 된 종 류 는 Spring 용기 에 하나의 대상 을 만 들 것 입 니 다.
  • @Component:일반적인 Bean 류
  • 에 중심 을 두 었 습 니 다.
  • @Service:이 종 류 를 업무 논리 에 사용 하도록 표시 합 니 다
  • @Controler:Spring MVC 라 는 컨트롤 러 클래스 를 표시 합 니 다
  • @Repository:표지 이 종 류 는 하나의 실체 류 로 속성 과 Setter,Getter
  • 만 있 습 니 다.
    
    @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();
    본 논문 의 관련 코드 는인 스 턴 스 코드테스트 클래스에 있다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기