>  기사  >  Java  >  Java Spring의 알려지지 않은 주입 방법에 대한 자세한 설명

Java Spring의 알려지지 않은 주입 방법에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-24 10:51:251629검색

머리말

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를 사용하여 대상 개체를 지정합니다.

  • targetField: 대상 클래스를 지정하거나 대상 객체 Name의 필드

  • 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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