Spring구성 파일에서 구성을 위해 XML 파일을 사용하면 실제로 Spring이 해당 코드를 실행할 수 있습니다. 예:
값
<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>
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
(뺄 값)입니다.
참고: 필드는
정적이거나 비정질일 수 있습니다. 위 구성 조각에 지정된 필드 표현식은 정적 필드 값이므로 클래스 이름을 통해 직접 액세스할 수 있습니다. 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를 사용하여 대상 개체를 지정합니다.
<bean id="age" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> <!-- value指定哪个类的哪个静态域值 --> <property name="staticField" value="java.sql.Connection.TRANSACTION_SERIALIZABLE" /> </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;} }
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와 동일합니다. 호출할 메서드가 정적 메서드인 경우 더 간결한 메서드가 있습니다: 위 내용은 Java Spring의 알려지지 않은 주입 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!<bean id="myBean"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<!-- 使用staticMethod属性,直接指定目标类的目标方法 -->
<property name="staticMethod" value="com.abc.util.ValueGenerator.getStaticValue" />
</bean>