现在的位置: 首页 > 综合 > 正文

spring学习笔记(IOC-控制反转)

2013年02月03日 ⁄ 综合 ⁄ 共 2814字 ⁄ 字号 评论关闭

Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。

和其他框架一样:spring也有一个主配置文件:applicationContext.xml。

IOC:控制反转。也有人这样叫;DI:依赖注入。

AOP:面前切面编程。

所谓控制反转:以前我们要调用某个类的方法。首先是new这个类。然后再调用这个方法。控制权在我们自己手上。反转:顾名思义就是控制权交换了角色。由spring来为我们创建对象了。而不是自己创建了。这里就用到了一个设计模式:工厂模式:实际上spring创建的对象就是由工厂来完成的。我们就能获取到该对象。

首先来看一个简单的例子:有一个person类。它有work的方法。现在我们要在客户端调用这个方法:如果不用spring的话。肯定就是直接new一个对象调用了。

现在我们让spring来为我们创建这个对象。首先要在applicationContext.xml里编写一个bean类。

	<bean id="chinese" class="com.young.person"></bean>

在客户端调用:

	ClassPathResource cpr=new ClassPathResource("applicationContext.xml");//加载配置文件
	XmlBeanFactory factory=new XmlBeanFactory(cpr);//获取类工厂对象
	Person chinese= (Person)factory.getBean("chinese");//获取类对象
	System.out.println(chinese.sayHi("张三"));//调用方法

就可以了。这样看是不是很麻烦呢。是的。这样看的确不如直接new一个对象简单。但是。如果你的项目大了。你就能省很多事了。

那我们在来一个复杂一点的。现在person类要借助工具来工作。我们再写个接口Tools工具,它有一个方法getHelp。在一个toolsA实现tools工具里的方法。

首先。我们可以在person类中写一个私有的Tools变量。然后给他加上setter方法。在work方法中直接用这个变量直接调用getHelp方法就行了。

我们还是要在applicationContext.xml文件中配置这个toolsA实现类。然后把他放到person的bean中。

	<bean id="tool" class="com.young.toolsA"></bean>
	<bean id="person" class="com.young.person">
	<property name="这是person类里的接口的变量名" ref="tool"></property>
	</bean>

如果还要调用其他的也就可以直接写好实现类。在person类中存放一个类变量。或接口也行。

然后在配置文件中配置实现类。并将其放进person类的属性值里。就能直接调用了。

这就是传说中的依赖注入。或者说控制反转。再你调用方法之前。它会自动帮你创建好对象。以上其实是依赖注入的其中一种方式:还可用构造器来注入值。例:

	public person(Tools t,Test tt){
		this.t=t;
		this.tt=tt;
	}

如果是这样配置的。那么在配置文件中也要改了。不能再用property属性了。

	<constructor-arg ref="test"></constructor-arg>
	<constructor-arg ref="tool"></constructor-arg>

前面我们用setter方法和构造器完成了依赖注入:现在我们来用静态工厂注入。

使用静态工厂必然要有一个工厂类。在工厂类写个返回对象的方法:

	public static Tools getTools(){
		System.out.println("静态工厂创建tools对象。");
		return new toolsA();
	}

然后在person类中还是有这个接口变量。并提供setter方法。其他地方不用变了。最主要的当然是配置文件了。配置文件还是要写的。在配置文件中依然要把这个工厂类加进来。但是有一点不同:

<bean id="getTool" class="com.young.factory" factory-method="getTools"></bean>

factory-method:表示在工厂类中哪个方法创建的对象。然后引用也就一样了。

	<property name="t" ref="getTool"></property>
	<property name="tt" ref="test"></property> 

同时也可用用实例工厂来完成。与静态工厂类似。

	public Tools getTools(){
		System.out.println("静态工厂创建tools对象。");
		return new toolsA();
	}

其他地方还是不变:就改配置文件,既然是实例工厂。当然要创建一个实例工厂对象了。

<bean id="factory" class="com.young.copy.factory"></bean>

再引用这个工厂对象

<bean id="gettool" factory-bean="factory" factory-method="getTools"></bean>

没有太大的区别。但是我们一般习惯用静态工厂笔较方便。

再来一个小巧:

一个项目中可以有多个配置文件。比如:applicationContext.xml或applicationContext2.xml;都能可以写。

但是在获取主配置文件的时候。就可以把这些配置文件放到数组里然后调用数组。

例如:String[] app=new String[]{"applicationContext.xml,applicationContext2.xml"};然后:

ClassPathResource cpr=new ClassPathResource(app);获取主配置文件。

还有一个;当你的配置文件中有一个类被多个地方调用。可以把它作为一个父类。直接掉用这个父类就行了。例如:

<bean id="user" class="com.vo.user"></bean>这个类被多个地方调用

可以把它作为一个父类:

	<bean abstract="true" id="userParent">
		<property name="u" ref="user"></property>
	</bean>

调用时用parent="userParent"就行了。

好吧。对于我写的这些博客。大家可能都觉得太小菜了。简直就不值一提。但对于我这样的新手。纯粹的自学。只能写出这么2的文章了。希望大家能能够踊跃拍砖。。多给我们这样新手一点建议。。和指点。。感激不尽。

抱歉!评论已关闭.