在网上学的很吃力,可能是前面的Java没学好吧,遂在图书馆找了本《Spring in action》看看,刚开始看,感觉还行。
通过面向POJO编程、依赖注入、AOP和模板技术四个方面来简化Java开发的复杂性。
Tips:
POJO,Plain Ordinary Java Object的缩写,但是它通指没有使用Entity Beans的普通java对象,可以把POJO作为支持业务逻辑的协助类。POJO实质上可以理解为简单的实体类,
顾名思义POJO类的作用是方便程序员使用数据库中的数据表,对于广大的程序员,可以很方便的将POJO类当做对象来进行使用,当然也是可以方便的调用其get,set方法。
AOP,Aspect Oirented Programming的缩写,即面向切面编程,特质与依赖注入相似,帮助应用对象解耦。借助于AOP,可以将遍布应用的关注点(例如事务和安全)从他们所应用的对象中解耦出来。
Spring自带两种容器的实现,Bean工厂(bean factoried,由org.springframework.beans.factory.BeanFactory定义)是最简单的容器,提供基本的DI支持和应用上下文(application context,由org.springframmework.context.ApplicationContext接口定义)基于BeanFactory之上构建,并提供面向应用的服务。
注:Bean工厂对于大多数应用来说往往太低级,因此应用上下文更收欢迎。
应用上下文的类型,下面是三种最常见的类型
1、ClassPathXmlApplicationContext——从类的路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当做类资源。
2、FileSystemXmlApplicationContext——读取文件系统下的XML配置文件并加载上下文定义。
3、XmlWebApplicationContext——读取Web应用下的XML配置文件并装载上下文定义。
装配,创建应用对象之间协作关系的行为,也是依赖注入的本质。
声明Bean
Spring 容器提供了两种配置Bean的方式。传统上,Spring使用一个或多个XML文件作为配置文件,而Spring3.0中提供了基于Java注解的配置方式(先不了解)。
Spring的核心框架自带了10个命名空间配置包括aop(声明切面)、beans(声明bean和装配bean)、context(为配置Spring应用上下文提供了配置元素)、jee、jms、lang、mvc、oxm(支持Spring的对象到XML的映射)、tx(声明式事务配置)、util(提供工具类元素)。
以下为一个典型的SpringXMl配置文件:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="cn.ywq.ioc.UserDao">bean>
<bean id="userService" class="cn.ywq.ioc.UserService">
<property name="userDao" ref="userDao">property>
bean>
beans>
Bean的作用域
当在Spring中配置元素时,我们可以为Bean声明一个作用域。只需配置Bean的scope属性。
Spring提供的几种作用域选项:
初始化和销毁Bean
为Bean定义初始化好销毁操作,只需要使用init-method和destroy-method参数来配置元素。
代码实例,我们设想一个叫Auditorium的Java类,它代表表演大厅。这个要实现两件非常重要的事情:在表演前开灯和在表演结束后关灯。
为支持这两项活动,Auditoium类需要编写turnOnLights()和turnOffLights()方法:
public class Auditorium{
public void turnOnLights(){
...
}
public void tuenOffLights(){
...
}
}
这两个方法的实现细节并不是特别重要,重要的是在开始前必须调用turnOnLights()方法,在结束后调用turnOffLights()方法。为实现需求,我们可以使用init-method和destroy-method属性来声明Auditorium Bean:
"auditorium"
class = "com.springinaction.springidol.Autorium"
init-methd = "turnOnLights"
destroy-method = "turnOffLights"/>
为Bean定义初始化和销毁方法的另一种可选的方式是让Bean实现Spring的InitializingBean和DisposableBean接口。
注入Bean属性
Spring中使用
元素配置Bean的属性。
在许多方面都与
类似,只不过一个是通过构造参数来注入值,另一个是通过调用属性的setter方法来注入值。
Instrumentalist类
package com.springinaction.springidol;
public class Instrumentalist implements Performer{
public Instrumentalist(){
}
public void perform() throws PerformanceException{
System.out.print("Playing"+song+":");
instrument.play();
}
private String song;
public void setSong(String song){ //注入歌曲
this.song = song;
}
public Stirng getSong(){
return song;
}
public String screamSong(){
return song;
}
private Instrument instrument;
public void setInstrument(Instrument instrument){ //注入乐器
this.instrument = instrument;
}
}
以上代码可以看出Instrumentalist有两个属性:song和instrument。song属性持有演奏家的歌曲名字,而且会在perform()方法中被用到。
Instrument接口
package com.springinaction.springidol;
public interface Instrument{
public void play();
}
XML配置文件部分
id = "kenny"
class = "com.springinaction.springidol.Instrumentalist">
<property name = "song" value = "Jingle Bells"/>
为了让kenny顺利演出,还要让这个乐器实现Instrument接口。
Tip:依赖注入不仅仅只是装配硬编码的值,它真正的价值子在于把相互协作的对象装配在一起,而不需要这些对象自己负责装配。
sax0phone实现了Instrument接口
package com.springinaction.springidol;
public class Saxophone implements Instrument{
public Saxophone(){
}
public void play(){
System.out.println("TOOT TOOT TOOT...");
}
}
在kenny演奏萨克斯之前,我们必须在Spring中将它声明为一个Bean。如以下XML代码所示:
id = "saxophone"
class = "com.springinaction.springidol.Saxophone"/>
修改kenny Bean的配置。使用setter注入为instrument属性设值:
id = "kenny2"
class = "com.springinaction.springidol.Instrumentalist">
<property name = "song" value = "Jingle Bells" />
<property name = "instrument" ref = "saxophone" />
现在kenny Bean已经注入了所有的属性,并且可以准备演出了。