【Spring】value和ref

在《【Spring】Spring3.0.5的下载、配置与Helloworld》(点击打开链接)和《【Spring】Spring依赖注入IOC的设值注入setter》(点击打开链接)两篇文章中,我曾写过在bean之下的property中如何value和ref,可惜没有好好总结一番。Spring很多东西你可以不用懂,但是value和ref这两个东西真的很常见。

其实也没有什么大不了,基本上value就是用来赋值,ref就是用来初始化变量。

用一个java程序就能够说明这个问题。

Java程序的目录结构如下:


其中Bean.java如下,这个东西非常常见,估计已经不用解释了,经常用于数据库持久对象po层,作为一个数据库实体entity。你完全可以理解成string a;定义一个变量a,然而这个a并没有被初始化。

public class Bean {

	private String a;

	public String getA() {
		return a;
	}

	public void setA(String a) {
		this.a = a;
	}

}

至于MySpring.java如下,定义了一个没初始化Bean bean,和Bean.java一样,这里的bean的定义之所以写得这么长,不能直接Bean bean就完事。纯属是因为艹蛋的spring要求所有变量都要用这种严格的Java的规范private私有变量+getter+setter来表达。反正在eclipse也就alt+shift+s和点点鼠标的事情,我就忍了。

至于这里为啥要搞成static,这也不为啥,实际上在javaee中无须这个static,让bean里面的变量可以在静态的主函数输出啊!不然大家看不到效果啊!

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MySpring {

	/* 相当于Bean bean;定义一个Bean变量bean(更贴切的说法是,定义个Bean的实例) */
	private static Bean bean;

	public static Bean getBean() {
		return bean;
	}

	public static void setBean(Bean bean) {
		MySpring.bean = bean;
	}

	/* 主函数 */
	@SuppressWarnings("resource")// 无实意,纯属为了消除spring的警告,由于spring多用在javaee,直接用在java会被提示无法关闭流什么的
	public static void main(String[] args) {
		new ClassPathXmlApplicationContext("applicationContext.xml");// 无实意,纯属为了初始化spring,加载applicationContext.xml,实际上,spring多在javaee被web.xml加载
		System.out.println(bean.getA());
	}

}

大家可以看到上面无论Bean.java还是MySpring.java都仅仅定义了一个变量a和一个类Bean,但都没有赋值,没有初始化,也就是没有string a="呵呵";,Bean bean=new Bean();这些东西。可是,由于applicationContext.xml的存在,<bean class="Bean">指明了要对Bean.java这个java文件搞事情,其中的子节点<property name="a" value="呵呵" />则让里面的a得到了"呵呵"这个值,也搞了这么多,其实就是a="呵呵";。

至于下面的<bean class="MySpring">也是一样的道理,但是由于MySpring里面的需要被初始化的Bean是一个类class,所以你这时就不能用value来赋值,要用的ref来赋值了。虽然同为初始化,但毕竟你在普通的java中对类初始化,也需要将=换成=new XX();啊!

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	<bean class="Bean">
		<property name="a" value="呵呵" />
	</bean>
	<bean class="MySpring">
		<property name="Bean" ref="Bean" />
	</bean>
</beans>  

因此,大家看到Bean.java和MySpring.java没有一句初始化的东西,这在平时的java准给了报空指针异常,但是由于Spring的存在,让程序运行起来,运行结果如下:





好了,文章内容就这么多,其实上,我写了这么多,相当于下面这个脑残程序啊:

class Bean {
	private String a;

	public String getA() {
		return a;
	}

	public void setA(String a) {
		this.a = a;
	}
}

public class MySpring_ {

	public static void main(String[] args) {
		Bean bean = new Bean();
		bean.setA("呵呵");
		System.out.println(bean.getA());
	}

}

于是大家肯定要问搞spring干嘛。甚至上面的Bean这个类也可以直接不要了。还不如String a="呵呵"啊。你这个程序真的好呵呵啊!

在数据如此少的情况下确实如此,但是你为什么要将string a放到Bean这个类之中,要是这是个class Student你是宁愿int studeng1_no=xx;string studeng1_name=xx;int studeng2_no=xx;string studeng2_name=xx;还是将no和name放到一个student类里面呢?至于为何类为什么不全搞成public int no: public string name;呢?这也是因为现在java行业的写作标准的习惯性用 private+getter+setter的模式啊,你写成public一些框架还不认呢!你就随大流吧,不然你的程序人家不认。

好了,扯了一大堆,至于为何要用spring,你不觉得在javaee这些应用中,你搞数据库的时候,由于又要set数据库链接地址,又要set数据库用户名密码什么的,搞到java里面一半的代码都在初始化。写在xml里面不好吗?由于spring,你才能将初始化这些无聊的语句写到xml里面,让你的程序读起来更加性感好吗?

说到底,其实Spring就是不像一个什么插件做了什么事情,他只是让你的程序代码长得更加漂亮的化妆品而已。这也是为何这么多公司选择它的原因。大家约定了一个规范标准好管理啊!才管了写的代码多不多,配置spring是否蛋疼!

猜你喜欢

转载自blog.csdn.net/yongh701/article/details/78475266