이 글은 주로 Java 주석 메커니즘의 Spring 자동 어셈블리 구현 원리를 자세히 소개합니다. 관심 있는 친구들이 참고할 수 있습니다.
Java에서 주석의 사용은 주로 SpringMVC(Spring Boot 등)에서 이루어집니다. , 주석은 실제로 런타임에 이 표시가 있는 멤버에 대해 동적으로 작업할 수 있게 해주는 마크업 언어와 동일합니다. 참고: 스프링 프레임워크는 기본적으로 자동 어셈블리를 지원하지 않습니다. 자동 어셈블리를 사용하려면 스프링 구성 파일에서
autowiring 속성에는 6개의 선택적 값이 있으며 각각 다른 의미를 나타냅니다.
byName ->Spring 환경에서 대상 객체를 얻을 때 대상 객체의 속성은 이름을 기반으로 전체 Spring 환경에서 검색됩니다< ; bean> 태그의 id 속성 값입니다. 동일한 경우 이 개체를 가져와 연결을 구현합니다. 전체 Spring 환경: 모든 Spring 구성 파일에서 검색을 의미하며 ID는 반복될 수 없습니다.
byType -> Spring 환경에서 대상 객체를 가져올 때 대상 객체의 속성은 유형에 따라 전체 Spring 환경에서
단점: 동일한 유형의 Bean 객체가 여러 개 있으면 오류가 발생합니다. 속성이 단일 데이터 유형인 경우 속성이 배열이거나 여러 개의 연관된 객체가 발견되면 오류가 발생합니다. 컬렉션(일반) 유형인 경우 관련 개체가 여러 개 발견되면 예외가 발생하지 않습니다.
constructor ->생성자 메소드를 사용하여 객체 주입을 완료하는 것은 실제로 생성자 메소드의 매개변수 유형을 기반으로 하는 객체 검색이며, 이는 byType을 사용하는 것과 동일합니다.
autoDetect ->자동 선택: 개체에 매개변수 없는 생성자가 없으면 생성자의 자동 어셈블리 방법이 생성 주입을 위해 자동으로 선택됩니다. 개체에 매개 변수가 없는 생성자가 포함된 경우 byType 자동 어셈블리 메서드가 setter 주입을 위해 자동으로 선택됩니다. Tno -& gt;는 자동 조립 기능을 지원하지 않습니다.
Default -& GT는 기본적으로 이전 레벨 라벨의 자동 조립 값을 나타냅니다. 구성 파일이 여러 개인 경우 각 구성 파일의 자동 조립 방법은 독립적입니다.
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은 이를 사용하여 작업 요소 코드를 실행합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!