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"就行了。