머리말
Spring구성 파일에서 구성을 위해 XML 파일을 사용하면 실제로 Spring이 해당 코드를 실행할 수 있습니다. 예:
- 그러나 Java 프로그램에는 getter 메소드 호출, 일반 메소드 호출, 클래스 또는 객체 필드 액세스 등 다른 유형의 명령문도 있을 수 있으며 Spring도 이를 제공합니다. 해당 구성 구문:
- getter 메소드 호출: PropertyPathFactoryBean 사용
- 클래스 또는 객체의 Filed 값 호출: FiledRetrievingFactoryBean 사용
- 일반 메서드 호출: MethodInvokingFactoryBean
- 을 사용하여 다른 Bean의
- Property
값
PropertyPathFactoryBean을 사용하여 주입합니다. 대상 Bean의 속성 값(실제로는 getter 메소드를 호출하여 반환된 값)을 얻은 값을 다른 Bean에 주입하거나 새 Bean을 직접 정의할 수 있습니다. 다음 구성 파일을 살펴보세요.
<bean id="person" class="com.abc.Person"> <property name="age" value="30" /> <property name="son"> <!-- 使用嵌套Bean定义属性值 --> <bean class="com.abc.service.Son"> <property name="age" value="11" /> </bean> </property> </bean> <bean id="son2" class="com.abc.service.Son"> <!-- age属性不是直接注入,而是将person中的son的age属性赋值给son2的age属性 --> <property name="age"> <!-- 注意这里使用的是PropertyPathFactoryBean --> <bean id="person.son.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean" /> </property> </bean>
Person 클래스와 Son 클래스의 속성은 더 이상 제공되지 않는 구성 파일에서 볼 수 있습니다. 주요 프로그램은 다음과 같습니다. public class Test {
public static void main(String args[]) {
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("age=" + ac.getBean("son2", Son.class).getAge());
}
}
출력 결과:
age=11
Bean 인스턴스의 속성 값을 다른 Bean에 주입할 수 있을 뿐만 아니라 해당 Bean 인스턴스의 속성 값도 주입할 수 있습니다. Bean 인스턴스로 직접 정의됩니다. 이 역시 PropertyPathFactoryBean을 통해 완료됩니다. 위 구성 파일에 다음 섹션을 추가합니다.
<bean id="son1" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"> <!-- 确定目标Bean,表明son1来自哪个Bean的组件 --> <property name="targetBeanName" value="person" /> <!-- 确定属性,表明son1来自目标Bean的哪个属性 --> <property name="propertyPath" value="son" /> </bean>
위 테스트 클래스를 실행하고 son2를 son1로 바꾸면 결과는 동일합니다.
다른 Bean의 Field 값 주입
FieldRetrievingFactoryBean 클래스를 통해 다른 Bean의 Field 값을 다른 Bean에 주입하거나 직접 새로운 Bean을 정의할 수 있습니다. 다음은 구성 부분입니다.
<bean id="son" class="com.abc.service.Son"> <property name="age"> <bean id="java.sql.connection.TRANSACTION_SERIALIZABLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" /> </property> </bean>
주 테스트 프로그램은 위에서 정의한 것과 유사하며 더 이상 여기에 제공되지 않습니다.
age=8
이 구성에서는 아들 객체의 age 값은 java.sql.Connection.TRANSACTION_SERIALIZABLE 값과 동일합니다. 위 정의에서 FieldRetrievingFactoryBean 팩토리 Bean을 정의할 때 지정된 id는 Bean 인스턴스의 고유 식별자가 아니라 지정된 Field의
표현식(뺄 값)입니다.
참고: 필드는
정적이거나 비정질일 수 있습니다. 위 구성 조각에 지정된 필드 표현식은 정적 필드 값이므로 클래스 이름을 통해 직접 액세스할 수 있습니다. Field 값이 정적이 아닌 경우 컨테이너에 이미 존재하는 Bean을 통해 액세스해야 합니다. 즉, Field 표현식의 첫 번째 구문은 컨테이너에 이미 존재하는 Bean이어야 합니다. 필드 값은 Bean 인스턴스로 정의할 수도 있습니다. 예를 들어 구성 파일에 다음 단락을 추가합니다.
<bean id="age" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> <!-- targetClass指定Field所在的目标类 --> <property name="targetClass" value="java.sql.Connection" /> <!-- targetField指定Field名 --> <property name="targetField" value="TRANSACTION_SERIALIZABLE" /> </bean>
기본 프로그램에 다음 출력을 추가합니다. System.out.println("age=" + ac.getBean("age"));
실행 결과는 위와 동일합니다.
FieldRetrievingFactoryBean을 사용하여 Field 값을 얻을 때 다음 두 속성을 지정해야 합니다:
targetClass 또는 target
Object: 필드 값의 위치는 각각 대상 피로 또는 대상 개체입니다. 가져올 Field가 정적이면 targetClass를 사용하여 대상을 지정하고, Field가 정적이 아닌 경우 targetObject를 사용하여 대상 개체를 지정합니다.
- Field가 정적 필드인 경우 더 간결하게 작성하는 방법이 있습니다:
<bean id="age" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> <!-- value指定哪个类的哪个静态域值 --> <property name="staticField" value="java.sql.Connection.TRANSACTION_SERIALIZABLE" /> </bean>
다른 Bean 메서드 반환 값 삽입
MethodInvokingFactoryBean 팩토리 Bean을 통해 대상 메소드의 반환 값을 Bean의 속성 값으로 주입할 수 있습니다. 이 팩토리 Bean은 지정된 메소드의 반환 값을 얻는 데 사용됩니다. 이는 정적 메소드이거나 인스턴스 메소드일 수 있으며 이 값은 지정된 Bean 인스턴스의 지정된 속성에 주입될 수 있거나 직접 정의될 수 있습니다. 빈 인스턴스. 예를 살펴보세요.
<bean id="valueGenerator" class="com.abc.util.ValueGenerator" /> <bean id="son1" class="com.abc.service.Son"> <property name="age"> <!-- 获取方法返回值:调用valueGenerator的getValue方法 --> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" ref="valueGenerator" /> <property name="targetMethod" value="getValue" /> </bean> </property> </bean>
다음은 ValueGenerator입니다.
public class ValueGenerator { public int getValue() { return 2; } public static int getStaticValue () { return 3;} }
테스트 프로그램은 여전히 son1의 age 값을 인쇄하고 코드는 생략되었으며 결과는 다음과 같습니다.
age=2
정적 메서드를 호출하려면 구성을 다음과 같이 수정하세요.
<bean id="son1" class="com.abc.service.Son"> <property name="age"> <!-- 获取方法返回值:调用valueGenerator的getStaticValue方法 --> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetClass" value="com.abc.util.ValueGenerator" /> <property name="targetMethod" value="getStaticValue" /> </bean> </property> </bean>
테스트 결과는 다음과 같습니다.
age=3
Java는
오버로딩을 지원하므로, ValueGenerator의 두 메소드 모두 매개변수가 없기 때문에 메소드 이름만 제공하는 것만으로는 위 구성을 통해 어떤 메소드를 성공적으로 호출할 수 있는지 판단할 수 없습니다. 메소드에 매개변수가 있는 경우 이를 구성하는 방법은 무엇입니까? 구성 파일에 다음 내용을 추가합니다.
<bean id="sysProps" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetClass" value="java.lang.System" /> <property name="targetMethod" value="getProperties" /> <bean> <bean id="javaVersion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <!-- 指向上面的sysProps Bean --> <property name="targetObject" value="sysProps" /> <property name="targetMethod" value="getProperty" /> <!-- 这里配置参数 --> <property name="arguments"> <!-- 使用list元素列出调用方法的多个参数 --> <list> <value>java.version</value> </list> </property> <bean>
위의 예는 "java.version"을 매개변수로 사용하여 java.lang.System의 getProperty 메소드를 호출하는 것과 동일합니다. 반환 값은 Bean이라는 이름을 생성합니다. javaVersion. 이는 다음과 동일합니다:
javaVersion = java.lang.System.getProperty("java.version");
이전 기사의 Field와 동일합니다. 호출할 메서드가 정적 메서드인 경우 더 간결한 메서드가 있습니다: <bean id="myBean"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<!-- 使用staticMethod属性,直接指定目标类的目标方法 -->
<property name="staticMethod" value="com.abc.util.ValueGenerator.getStaticValue" />
</bean>
위 내용은 Java Spring의 알려지지 않은 주입 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

클래스 로더는 통합 클래스 파일 형식, 동적로드, 부모 위임 모델 및 플랫폼 독립적 인 바이트 코드를 통해 다른 플랫폼에서 Java 프로그램의 일관성과 호환성을 보장하고 플랫폼 독립성을 달성합니다.

Java 컴파일러가 생성 한 코드는 플랫폼 독립적이지만 궁극적으로 실행되는 코드는 플랫폼 별입니다. 1. Java 소스 코드는 플랫폼 독립적 인 바이트 코드로 컴파일됩니다. 2. JVM은 바이트 코드를 특정 플랫폼의 기계 코드로 변환하여 크로스 플랫폼 작동을 보장하지만 성능이 다를 수 있습니다.

멀티 스레딩은 프로그램 대응 성과 리소스 활용을 향상시키고 복잡한 동시 작업을 처리 할 수 있기 때문에 현대 프로그래밍에서 중요합니다. JVM은 스레드 매핑, 스케줄링 메커니즘 및 동기화 잠금 메커니즘을 통해 다양한 운영 체제에서 멀티 스레드의 일관성과 효율성을 보장합니다.

Java의 플랫폼 독립성은 작성된 코드가 수정없이 JVM이 설치된 모든 플랫폼에서 실행될 수 있음을 의미합니다. 1) Java 소스 코드는 바이트 코드로 컴파일됩니다. 2) 바이트 코드는 JVM에 의해 해석되고 실행됩니다.

javaapplicationscanindeedencounterplatform-specificissuesdespitetejvm'sabstraction.ressistinclude : 1) nativecodeandlibraries, 2) OperatingSystemDifferences, 3) jvmimplementationvariations, 및 4) 어려운 의존성, 개발자, 1)

클라우드 컴퓨팅은 Java의 플랫폼 독립성을 크게 향상시킵니다. 1) Java Code는 바이트 코드로 컴파일되어 다른 운영 체제에서 JVM에 의해 실행되어 크로스 플랫폼 작동을 보장합니다. 2) Docker 및 Kubernetes를 사용하여 Java 응용 프로그램을 배포하여 휴대 성 및 확장 성을 향상시킵니다.

Java'SplatformIndencealLowsDeveloperstowStowRiteCodeOntOnitOniNanyDeviceOroswithajvm. ThisIsachieAdthroughCompilingTobyTecode, thejvMIngretSorcompileStruntime.thistureatureDificallyNatlyBoostedjava'SADOPTIONDUOCROSS-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PLAT-PPLATION

Docker와 같은 컨테이너화 기술은 Java의 플랫폼 독립성을 대체하기보다는 향상됩니다. 1) 환경 간 일관성을 보장, 2) 특정 JVM 버전을 포함한 종속성 관리, 3) 배포 프로세스를 단순화하여 Java 응용 프로그램을보다 적응 가능하고 관리 할 수 있도록합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구
