>Java >java지도 시간 >Java 주석 메커니즘으로 구현된 Spring 자동 어셈블리의 원리에 대한 자세한 설명

Java 주석 메커니즘으로 구현된 Spring 자동 어셈블리의 원리에 대한 자세한 설명

黄舟
黄舟원래의
2017-10-18 10:06:162341검색

이 글은 주로 Java 주석 메커니즘의 Spring 자동 어셈블리 구현 원리를 자세히 소개합니다. 관심 있는 친구들이 참고할 수 있습니다.

Java에서 주석의 사용은 주로 SpringMVC(Spring Boot 등)에서 이루어집니다. , 주석은 실제로 런타임에 이 표시가 있는 멤버에 대해 동적으로 작업할 수 있게 해주는 마크업 언어와 동일합니다. 참고: 스프링 프레임워크는 기본적으로 자동 어셈블리를 지원하지 않습니다. 자동 어셈블리를 사용하려면 스프링 구성 파일에서 60e23eb984d18edbb092da6b8f295aba 태그의 autowire 속성을 수정해야 합니다.

autowiring 속성에는 6개의 선택적 값이 있으며 각각 다른 의미를 나타냅니다.

byName ->Spring 환경에서 대상 객체를 얻을 때 대상 객체의 속성은 이름을 기반으로 전체 Spring 환경에서 검색됩니다< ; bean> 태그의 id 속성 값입니다. 동일한 경우 이 개체를 가져와 연결을 구현합니다. 전체 Spring 환경: 모든 Spring 구성 파일에서 검색을 의미하며 ID는 반복될 수 없습니다.

byType -> Spring 환경에서 대상 객체를 가져올 때 대상 객체의 속성은 유형에 따라 전체 Spring 환경에서 60e23eb984d18edbb092da6b8f295aba 태그의 클래스 속성 값을 검색합니다. 동일한 것이 있으면 이 객체를 얻고 연관을 구현하십시오.

단점: 동일한 유형의 Bean 객체가 여러 개 있으면 오류가 발생합니다. 속성이 단일 데이터 유형인 경우 속성이 배열이거나 여러 개의 연관된 객체가 발견되면 오류가 발생합니다. 컬렉션(일반) 유형인 경우 관련 개체가 여러 개 발견되면 예외가 발생하지 않습니다.

constructor ->생성자 메소드를 사용하여 객체 주입을 완료하는 것은 실제로 생성자 메소드의 매개변수 유형을 기반으로 하는 객체 검색이며, 이는 byType을 사용하는 것과 동일합니다.

autoDetect ->자동 선택: 개체에 매개변수 없는 생성자가 없으면 생성자의 자동 어셈블리 방법이 생성 주입을 위해 자동으로 선택됩니다. 개체에 매개 변수가 없는 생성자가 포함된 경우 byType 자동 어셈블리 메서드가 setter 주입을 위해 자동으로 선택됩니다. Tno -& gt;는 자동 조립 기능을 지원하지 않습니다.

Default -& GT는 기본적으로 이전 레벨 라벨의 자동 조립 값을 나타냅니다. 구성 파일이 여러 개인 경우 각 구성 파일의 자동 조립 방법은 독립적입니다.

Annotation을 사용하려면 Annotation 선언, Annotation을 사용하는 요소, Annotation된 요소를 작동하는 코드의 세 가지 조건이 필요합니다. 첫 번째 단계는 주석 선언입니다. 사용자 정의 주석 작성 코드는 다음과 같습니다.


package annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AttachAnnotation {
  String paramValue() default "河北省"; // 参数名为"paramValue" 默认值为"河北省"
}

사용자 정의 주석 요소를 사용하면 코드는 다음과 같습니다.


package annotation;

/**
 * @author 路人宅
 */
public class AttachEmlement {

  // 普通
  public void AttachDefault(String name){
    System.out.println("归属:" + name);
  }
  
  // 使用注解并传入参数
  @AttachAnnotation(paramValue="河北省")
  public void AttachAnnotation(String name){
    System.out.println("归属:" + name);
  }
  
  // 使用注解并使用默认参数
  @AttachAnnotation
  public void AttachAnnotationDefault(String name){
    System.out.println("归属:" + name);
  }
}

주요 기능, 특정 코드를 실행합니다. 다음과 같이:


package annotation;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class AnnotionOperator {
 public static void main(String[] args) throws IllegalAccessException,
  IllegalArgumentException, InvocationTargetException,
  ClassNotFoundException {
 AttachEmlement element = new AttachEmlement(); // 初始化一个实例,用于方法调用
 Method[] methods = AttachEmlement.class.getDeclaredMethods(); // 获得所有方法

 for (Method method : methods) {
  AttachAnnotation annotationTmp = null;
  if ((annotationTmp = method.getAnnotation(AttachAnnotation.class)) != null)
  method.invoke(element, annotationTmp.paramValue());
  else
  method.invoke(element, "河南省");
 }
 }
}

실행 결과:

소유자: 허난성
소유자: 허베이성

소유자: 허베이성


Spring에는 두 가지 작동 방법이 있습니다. 자동 어셈블리를 촉진합니다: org.springframework.web.context.support.SpringBeanAutowiringSupport 클래스를 상속하거나 @Component/@Controller 및 기타 주석을 추가하고 Spring 구성 파일에 context:comComponent-scan 요소 구성을 선언합니다.

1) 상속 메서드는 자동 배선을 구현합니다. Spring3.1.1 소스 코드를 보면 SpringBeanAutowiringSupport 클래스에서 다음 코드를 찾을 수 있습니다.


/**
 * This constructor performs injection on this instance,
 * based on the current web application context.
 * Intended for use as a base class.
 * @see #processInjectionBasedOnCurrentContext
 */
public SpringBeanAutowiringSupport() {
 processInjectionBasedOnCurrentContext(this);
}

Analytic: Java는 매개 변수 없이 기본 상위 클래스를 호출합니다. 인스턴스화 및 생성 중에 생성자가 생성되며 Spring은 이를 사용하여 작업 요소 코드를 실행합니다.

2) 주석 방법은 위의 이론과 유사합니다. 주석 자동 어셈블리가 setter*의 주입을 완료할 필요가 없다는 점은 주목할 가치가 있습니다. Spring3.1.1 소스 코드 주석 호출 순서를 확인하세요.

org.springframework .web.context.support.SpringBeanAutowiringSupport #SpringBeanAutowiringSupport=>

org.springframework.web.context.support.SpringBeanAutowiringSupport#processInjectionBasedOnCurrentContext=>

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#processInjection=>
org. springframework.beans.factory .annotation.InjectionMetadata#Injection, 다음과 같이 주입 메소드의 소스 코드를 확인하세요.



/**
 * Either this or {@link #getResourceToInject} needs to be overridden.
 */
protected void inject(Object target, String requestingBeanName, PropertyValues pvs) throws Throwable {
 if (this.isField) {
 Field field = (Field) this.member;
 ReflectionUtils.makeAccessible(field);
 field.set(target, getResourceToInject(target, requestingBeanName));
 }
 else {
 if (checkPropertySkipping(pvs)) {
  return;
 }
 try {
  Method method = (Method) this.member;
  ReflectionUtils.makeAccessible(method);
  method.invoke(target, getResourceToInject(target, requestingBeanName));
 }
 catch (InvocationTargetException ex) {
  throw ex.getTargetException();
 }
 }
}

Analytic: 위의 소스 코드를 통해 Reflection 메커니즘을 통해 Spring 자동 어셈블리가 구현됩니다.

위 내용은 Java 주석 메커니즘으로 구현된 Spring 자동 어셈블리의 원리에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.