`

Spring为某个属性注入值或为某个方法的返回值

 
阅读更多

项目中用到需要初始化一些数据,Spring提供了filed的值注入和method的返回值注入。


一、Field值的注入                                                                                           

     filed值注入需要使用org.springframework.beans.factory.config.FieldRetrievingFactoryBean来获取类的静态变量。

例如,我们通常在接口中定义常量:

package com.wy.inject;

/**
 * 
 * @author wy
 *
 */
public interface Fruit {
	public String APPLE = "苹果";
	public String ORANGE = "桔子";
}

 下面利用FieldRetrievingFactoryBean获取CarBandType接口中定义的常量,并注入到某个bean的属性中:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/context 
	   					   http://www.springframework.org/schema/context/spring-context-3.1.xsd  
	   					   http://www.springframework.org/schema/beans 
	   					   http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
	   					   http://www.springframework.org/schema/task 
	   					   http://www.springframework.org/schema/task/spring-task-3.1.xsd">
	<!-- 1、通过注入属性 
	<bean id="appleBean" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
		<property name="staticField" value="com.wy.inject.Fruit.APPLE" />
	</bean>
	<bean id="apple" class="com.wy.inject.Apple">
		<property name="name" ref="appleBean" />
	</bean>-->

 Spring还允许用户用常量的全限定名作为FieldRetrievingFactoryBean的id,其效果和通过配置staticField属性是一样的:

<!-- 2、通过全限量名称
	<bean id="com.wy.inject.Fruit.APPLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
	</bean>
	<bean id="apple" class="com.wy.inject.Apple">
		<property name="name" ref="com.wy.inject.Fruit.APPLE" />
	</bean> -->

 当然,也可以直接将FieldRetrievingFactoryBean以内置bean的方式对属性进行赋值,这样在配置上更紧凑一些:

<!-- 3、通过内置Bean的方式 
	<bean id="apple" class="com.wy.inject.Apple">
		<property name="name">
			<bean id="com.wy.inject.Fruit.APPLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/>
		</property>
	</bean>-->

 

二、Method返回值的注入
Method返回值的注入需要使用MethodInvokingFactoryBean来完成。

在xml配置中,需要设定targetObject和targetMethod来指定目标bean和方法。如果使用静态方法,则需要指定targetClass和targetMethod。

1、非静态方法配置文件如下:

<!-- 1、Method返回值的注入
	<bean id="apple" class="com.wy.inject.Apple">
		<property name="name">
			<bean
				class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
				<property name="targetObject">
					<ref local="cons" />
				</property>
				<property name="targetMethod">
					<value>getAPPLE</value>
				</property>
			</bean>
		</property>
	</bean>
	<bean id="cons" class="com.wy.inject.Cons" /> -->

 2、静态方法的配置

<!-- 2、静态方法返回值的注入 -->
	<bean id="banna" class="com.wy.inject.Banna">
	  <property name="name">
	    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
	      <property name="targetClass">
	        <value>com.wy.inject.Cons</value>
	      </property>
	      <property name="targetMethod">
	        <!-- getBann必须是静态方法 -->
	        <value>getBann</value>
	      </property>
	    </bean>
	  </property>
	</bean>

 涉及到的类:

Apple.java

package com.wy.inject;

/**
 * 
 * @author wy
 * 
 */

public class Apple {
	String name = null;
	String price = null;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPrice() {
		return price;
	}

	public void setPrice(String price) {
		this.price = price;
	}

}

 Cons.java

package com.wy.inject;

/**
 * 
 * @author wy
 * 
 */
public class Cons {
	public String APPLE = "苹果";
	public String ORANGE = "桔子";
	public static String Bann = "香蕉";

	public String getAPPLE() {
		return APPLE;
	}

	public void setAPPLE(String aPPLE) {
		APPLE = aPPLE;
	}

	public String getORANGE() {
		return ORANGE;
	}

	public void setORANGE(String oRANGE) {
		ORANGE = oRANGE;
	}
	
	
	
	public static String getBann() {
		return Bann;
	}

	public static void setBann(String bann) {
		Bann = bann;
	}

}

 Banna.java

package com.wy.inject;

/**
 * 
 * @author wy
 *
 */
public class Banna {
	String name = null;
	String price = null;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPrice() {
		return price;
	}

	public void setPrice(String price) {
		this.price = price;
	}
}

 三、测试例子

package com.wy.inject;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class InjectTest {
	public Apple apple = null;
	public Banna banna = null;
	public InjectTest() {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
//		apple = (Apple)context.getBean("apple");
		banna = (Banna)context.getBean("banna");
	}
	
	public void name(){
//		System.out.println("Fruit name=" + apple.getName());
		System.out.println("Fruit name=" + banna.getName());
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new InjectTest().name();
	}

}

 

  • 大小: 14.1 KB
分享到:
评论

相关推荐

    Spring之条件注解@Conditional(Demo)

    如果系统中存在`ConditionalClass`,或者`my.service.impl`属性值为"2",那么对应的`MyService`实现会被注入到Spring上下文中。 `myservice`子文件夹可能包含了这些配置类的实现代码,以及`MyService`、`...

    Spring的BeanFactory的接口注解

    在Spring框架中,`BeanFactory`是工厂模式的一种实现,它负责管理容器中的Bean的生命周期与依赖注入。了解`BeanFactory`及其相关接口的功能对于掌握Spring的核心原理至关重要。 #### 二、`BeanFactory`接口的关键...

    MyBatis 需要注意的地方junit注解

    @RunWith 指定测试类使用的某个运行器参数SpringJUnit4ClassRunner.class @Parameters 指定参数类的参数数据集合 @Rule 允许灵活添加或重新定义测试类中的每个测试方法的行为 @FixMethodOrder 指定测试方法的执行...

    springmybatis

    其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...

    junit基于标注的测试

    测试方法应为无参数、无返回值的public方法。如果测试失败,JUnit会报告失败的原因。`@Test`还可以与其他注解结合,例如`@Expected`用于指定预期的异常,或者`@Timeout`限制测试方法的最大运行时间。 三、`@Ignore`...

    Java面试框架高频问题2019

    - **初始化**:调用bean的初始化方法,如`@PostConstruct`或`init-method`属性指定的方法。 - **运行时**:bean处于可用状态。 - **销毁**:调用bean的销毁方法,如`@PreDestroy`或`destroy-method`属性指定的方法。...

    Spring中常用注解的详细介绍

    9. **@Autowired(required=false)**:如果某个依赖不是必须的,可以设置required属性为false,这样即使找不到匹配的Bean,也不会抛出异常。 10. **@PostConstruct**和**@PreDestroy**:这两个注解分别标记在初始化...

    Java框架面试题总结

    - **引入**:添加新的方法或属性到已有类的过程。 - **织入**:将切面和连接点结合起来的过程。 **6. Spring中有五种不同的通知** - **Before通知**:在连接点之前执行。 - **After通知**:无论方法正常执行还是抛...

    学软件编程需必学的英语)第二学年Java方向

    6. **Abstract抽象**:表示类或方法不提供具体的实现。 7. **Default默认**:默认的行为或设置。 8. **Redirect重定向**:将客户端重定向到另一个URL。 9. **Global全球(全局)**:全局变量或配置。 10. **Method...

    mybatis入门教程(二)

    - **Result Type**:XML 映射文件中 statement 的 resultType 必须与 Mapper 接口中方法的返回值类型相匹配。 #### 输入输出映射 - **输入映射**:`parameterType` 属性用于指定输入参数的类型。支持简单类型、...

    ajax动态获取数据库中的数据方法

    url属性指定了请求的路径,通常这个路径会映射到后端的某个Controller的处理方法。在请求完成后的回调函数中,处理了从服务器返回的JSON数据,并将其插入到HTML元素中。 在后端代码部分,主要使用了SpringMVC框架来...

    struts2源代码

    Action处理用户的请求,并通过返回值决定后续流程,如跳转到某个结果页面。 2. **ActionContext**:它持有请求、响应、session、应用上下文等信息,在整个请求处理过程中扮演着桥梁的角色,使得Action可以在不同上...

    原始的

    - **Spring框架**: Primedical可能使用Spring进行业务逻辑处理和依赖注入,Spring Boot简化了Spring的使用。 - **数据库交互**: 可能使用JDBC或ORM框架如Hibernate进行数据库操作,处理医疗数据。 - **RESTful ...

    1000道 互联网Java工程师面试题 485页

    - **SEQUENTIAL**:序号节点,无论是否为持久或临时节点,都会在其后面加上一个递增的序号。 - **PERSISTENT_SEQUENTIAL** 和 **EPHEMERAL_SEQUENTIAL**:结合以上特点的节点。 #### 5、Zookeeper Watcher机制—...

    JAVA核心知识点整理(有效)

    2.2.3. 本地方法区(线程私有) ................................................................................................................ 23 2.2.4. 堆(Heap-线程共享)-运行时数据区 .....................

Global site tag (gtag.js) - Google Analytics