7.17 주 총화

최근 바 쁜 프로젝트 에서 OData 서비스 개발 은 지식 비축 의 부족, 프로젝트 의 특수 한 복잡성 으로 전체적으로 골 치 아 프 게 하고 있다.시간 을 내 서 자신 이 만 든 이 물건 을 돌 이 켜 보고 정리 할 수 있다.오늘 의 여유 로 운 주말 저녁, 이번 주 에 알 게 된 Spring 의 확장 인터페이스 에 관 한 다른 작은 것들 을 정리 해 보 자. 야옹 야옹 ~ ~ ~
디 렉 터 리:
  • Spring 확장 인터페이스
  • 작은 장난감
  • 1. 스프링 확장 인터페이스
    Spring 의 전체 프레임 워 크 는 '개폐 원칙', 즉 '확장 개방, 수정 폐쇄' 를 엄 격 히 따른다.개인 적 으로 Spring 프레임 워 크 의 핵심 중 하 나 는 IOC, 즉 'Bean Container' 이다. 전체 'Bean Container' 의 생명 주 기 는 크게 로드 (XML 또는 Anotation), 초기 화 (해당 Bean 초기 화), runtime (runtime 에서 Bean 제공), 소각 이다. 즉, 어떤 상황 에서 도 Spring 은 이 절차 에 따라 내 려 온 것 이다.해당 하 는 클래스, 인터페이스, 방법 을 제공 하지 않 고 이 과정 을 바 꾸 려 면 가장 많은 인 터 페 이 스 를 제공 하여 이 과정 을 풍부 화 시 켜 야 한다. 즉, '확장 개발' 이다.이 인 터 페 이 스 는 다음 을 포함한다.
  • BeanFactoryPostProcessor
  • InstantiationAwareBeanPostProcessor
  • BeanNameAware
  • BeanFactoryAware
  • BeanPostProcessor
  • InitializingBean
  • DiposibleBean
  • FactoryBean
  • Bean 수명 주기 에 해당 하 는 인터페이스 호출
  • 빈 컨테이너 전체 확장
  • BeanFactoryPostProcessor
  • public interface BeanFactoryPostProcessor {
    
        void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
    
    }
    

    인터페이스 정의 에서 알 수 있 듯 이 그것 은 단지 한 가지 방법 밖 에 없다.
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
    

    매개 변수 유형 은 ConfigurableListableBeanFactory 이 고 근원 을 추적 하 며 이 인터페이스의 정 의 는 다음 과 같다.
    public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
    
        void ignoreDependencyType(Class> type);
    
        void ignoreDependencyInterface(Class> ifc);
    
        void registerResolvableDependency(Class> dependencyType, Object autowiredValue);
    
        boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)throws NoSuchBeanDefinitionException;
    
        BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    
        Iterator getBeanNamesIterator();
    
        void clearMetadataCache();
    
        void freezeConfiguration();
    
        boolean isConfigurationFrozen();
    
        void preInstantiateSingletons() throws BeansException;
    
    }
    

    그 중 에 한 가지 방법 이 있어 요.
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    

    해당 Bean Name 을 입력 하면 해당 Bean Definition 을 받 을 수 있 습 니 다. 이 는 Bean 의 메타 정보 설명 에 대응 합 니 다.BeanDefinition 에 대한 인터페이스 설명:
    
    public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
    
        String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
    
        String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
    
        int ROLE_APPLICATION = 0;
    
        int ROLE_SUPPORT = 1;
    
        int ROLE_INFRASTRUCTURE = 2;
    
        String getParentName();
    
        void setParentName(String parentName);
    
        String getBeanClassName();
    
        void setBeanClassName(String beanClassName);
    
        String getFactoryBeanName();
    
        void setFactoryBeanName(String factoryBeanName);
    
        String getFactoryMethodName();
    
        void setFactoryMethodName(String factoryMethodName);
    
        String getScope();
    
        void setScope(String scope);
    
        boolean isLazyInit();
    
        void setLazyInit(boolean lazyInit);
    
        String[] getDependsOn();
    
        void setDependsOn(String... dependsOn);
    
        boolean isAutowireCandidate();
    
        void setAutowireCandidate(boolean autowireCandidate);
    
        boolean isPrimary();
    
        void setPrimary(boolean primary);
    
        ConstructorArgumentValues getConstructorArgumentValues();
    
        MutablePropertyValues getPropertyValues();
    
        boolean isSingleton();
    
        boolean isPrototype();
    
        boolean isAbstract();
    
        int getRole();
    
        String getDescription();
    
        String getResourceDescription();
    
        BeanDefinition getOriginatingBeanDefinition();
    
    }
    

    그 중 에 몇 가지 비교적 자주 사용 하 는 방법 이 있다.
    void setFactoryBeanName(String factoryBeanName);
    void setBeanClassName(String beanClassName);
    void setScope(String scope);
    void setLazyInit(boolean lazyInit);
    

    그리고 그 에 상응하는 Get 방법 도 있 습 니 다.즉, runtime 에서 상기 인 터 페 이 스 를 통 해 Bean 의 메타 설명 정 보 를 동적 으로 수정 할 수 있 습 니 다: name, isLazy Init, scope
    그래서 우 리 는 최초 로 탐색 한 곳 으로 돌아 가 인터페이스 확장 BeanFactoryPostProcessor: 이 인 터 페 이 스 를 실현 하 는 postProcessBeanFactory 을 통 해 필요 에 따라 Spring 이 시 작 될 때 해당 Bean 의 메타 설명 정 보 를 동적 으로 수정 합 니 다.
  • BeanFactoryAware

  • 이 인터페이스의 상세 한 설명 은 다음 과 같다.
    public interface BeanFactoryAware extends Aware {
    
        void setBeanFactory(BeanFactory beanFactory) throws BeansException;
    
    }
    

    방법 은 딱 하나 야.
    void setBeanFactory(BeanFactory beanFactory) throws BeansException;
    

    이 인 터 페 이 스 를 실행 할 수 있 습 니 다. runtime 에서 이 BeanFactory 를 얻 을 수 있 습 니 다.
    빈 에 대한 확장
  • InstantiationAwareBeanPostProcessor

  • 이 인터페이스의 정 의 는 다음 과 같다.
    public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
    
        Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException;
    
        boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;
    
        PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;
    
    }
    

    그 중 에는 세 가지 방법 이 포함 되 어 있다.
        Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException;
    
        boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;
    
        PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;
    

    이 세 가지 방법의 작용 시 기 는 빈 의 실례 화 단계 이다.그 전에 저도 '실례 화' 와 '초기 화' 의 차 이 를 잘 몰 랐 습 니 다. 나중에 자 료 를 찾 아 보 니 대체적으로 이 렇 습 니 다. 실례 화 - 실례 화 과정 은 Bean 을 만 드 는 과정 입 니 다. 즉, Bean 의 구조 함 수 를 호출 하고 단일 사례 의 Bean 을 단일 사례 풀 에 넣 는 것 입 니 다.초기 화 - 초기 화 과정 은 값 을 부여 하 는 과정 입 니 다. 즉, Bean 의 setter 를 호출 하여 Bean 의 속성 을 설정 합 니 다.
  • BeanNameAware

  • 이 인터페이스의 상세 한 설명 은 다음 과 같다.
    
    public interface BeanNameAware extends Aware {
    
        void setBeanName(String name);
    
    }
    

    이 인 터 페 이 스 는 매우 간단 하 다. 단지 한 가지 방법 만 있다.
    void setBeanName(String name);
    

    실제 개발 에서 이 인 터 페 이 스 를 구현 하여 "Bean Container" 에 불 러 온 Bean 을 동적 으로 가 져 올 수 있 습 니 다 Name
  • BeanPostProcessor

  • 이 인터페이스의 상세 한 설명 은 다음 과 같다.
    
    public interface BeanPostProcessor {
    
        Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    
        Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
    
    }
    

    그 중 에는 두 가지 방법 이 포함 되 어 있다.
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
    

    이 두 가지 방법 은 Bean 초기 화 전후 에 작용 하 는 것 입 니 다. 저 희 는 Bean Name 에 따라 해당 하 는 Bean 을 선별 하고 구체 적 인 업무 수 요 를 결합 하여 일부 Bean 에 대해 맞 춤 형 예비 처 리 를 할 수 있 습 니 다.
  • InitializingBean

  • 그 인터페이스의 상세 한 설명 은 다음 과 같다.
    
    public interface InitializingBean {
    
        void afterPropertiesSet() throws Exception;
    
    }
    

    이 인 터 페 이 스 는 방법 이 하나 밖 에 없다.
    void afterPropertiesSet() throws Exception;
    

    이 인 터 페 이 스 는 한 Bean 의 모든 Properties 초기 화가 완 료 된 후에 작 동 하 는 것 이 분명 하 다.이 방법 은 어떠한 매개 변수 도 없 으 며 구체 적 인 업무 수요 에 따라 정의 처리 할 수 있다.
    확장: Spring 이 XML 설정 Bean 에 대한 규범 에서 하나의 속성 init-method 을 제공 하여 이 방법 과 같 습 니 다.이 속성의 구체 적 인 용법 은 대체로 다음 과 같다.
    
    
        
        
            
        
        
        
            
        
    
    
  • DisposableBean

  • 이 인터페이스의 구체 적 인 설명 은 다음 과 같다.
    
    public interface DisposableBean {
    
        void destroy() throws Exception;
    
    }
    

    그 중 에 방법 이 하나 밖 에 없어 요.
    void destroy() throws Exception;
    

    이 방법 은 어떤 빈 이 끝 날 때 (빈 컨테이너 가 폐 기 될 때) 작용 한다.
  • FactoryBean

  • 이 인터페이스의 상세 한 설명 은 다음 과 같다.
    public interface FactoryBean {
    
        T getObject() throws Exception;
    
        Class> getObjectType();
    
        boolean isSingleton();
    
    }
    

    이 중 세 가지 방법 이 있 습 니 다. 실현 방법 getObject 은 사용자 정의 Bean 을 불 러 올 수 있 습 니 다.
    Bean 수명 주기 에 해당 하 는 인터페이스 호출:
    Spring Bean 의 생명주기
    2. 작은 물건
    그동안 스프링 시스템 BeanFactoryApplicationContext 에 대해 잘 모 르 고 있 었 는데 이번에 자 료 를 좀 찾 아 봤 더 니 점차 정리 되 었 다.
  • BeanFactory: IOC 용기 행위 에 대한 가장 기본 적 인 규범 인터페이스 입 니 다. 예 를 들 어 getBean () 과 관련 된 BeanFactory 의 구체 적 인 실현 은 흔히 볼 수 있 지만 이 종 류 는 이미 버 려 졌 습 니 다.
  • ApplicationContext: BeanFactory 를 계승 하면 BeanFactory 의 기능 을 가 질 뿐만 아니 라 국제 화 message 처리 도 지원 한다. 예 를 들 어 MessageSource 인터페이스, 사건 감청 과 관련 된 ApplicationContext 의 구체 적 인 실현, 흔 한 XmlBeanFactory, XmlWebApplicationContext, ClassPathXmlApplicationContext, FileSystemApplicationContext.

  • 응용 프로그램 Context 확장: 응용 프로그램 Context 를 가 져 오 는 몇 가지 방법:
  • 위 에 열거 한 몇 가지 묘 사 를 통 해 얻 을 수 있다. 예 를 들 어
  • pplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); 
    
  • Spring 에서 제공 하 는 도구 류 를 통 해 applicationContext 대상 을 얻 습 니 다. 예 를 들 어
  • ApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc); 
    
  • 추상 류 ApplicationObject Support Spring 초기 화 를 계승 할 때 이 추상 류 의 setApplicationContext (ApplicationContext context) 방법 으로 ApplicationContext 대상 을 주입 합 니 다
  • 추상 적 인 웹 애플 리 케 이 션 Object Support 설명 을 계승 합 니 다. 위의 방법 과 같이 getWebApplication Context () 를 호출 하여 웹 애플 리 케 이 션 Context
  • 를 가 져 옵 니 다.
  • 인터페이스 애플 리 케 이 션 ContextAware
  • 실현
  • Spring 을 통 해 제공 되 는 ContextLoader
  • WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
    

    마지막 으로 servlet 에 의존 하지 않 고 주입 할 필요 가 없 는 방식 을 제공 합 니 다.단, 서버 가 시 작 될 때 Spring 용기 가 초기 화 될 때 다음 과 같은 방법 으로 Spring 용 기 를 가 져 올 수 없 음 을 주의해 야 합 니 다.
    참고 문장
  • Spring 8: 자주 사용 하 는 Spring Bean 확장 인터페이스
  • Spring Bean 의 생명주기 (매우 상세)
  • Spring 은 코드 에서 bean 을 가 져 오 는 몇 가지 방식
  • 좋은 웹페이지 즐겨찾기