在网上学的很吃力,可能是前面的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配置文件:
<?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:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 注入对象类型属性 --> <!-- 配置service和dao对象 --> <bean id="userDao" class="cn.ywq.ioc.UserDao"></bean> <bean id="userService" class="cn.ywq.ioc.UserService"> <!-- 注入dao对象 name属性值:service类里面属性名称 ref属性:dao配置bean标签中id值 --> <property name="userDao" ref="userDao"></property> </bean> </beans>Bean的作用域
当在Spring中配置元素时,我们可以为Bean声明一个作用域。只需配置Bean的scope属性。 Spring提供的几种作用域选项:
singleton,在每个Spring容器中,一个Bean定义总有一个对象实例(默认)prototype,允许Bean的定义可以被实例化多次(每次调用都创建一个实例)request,在一次HTTP请求中,每个Bean定义对应一个实例。session,在一个HTTP Session中,每个Bean定义对应一个实例。global-session,在一个全局HTTP Session中,每个Bean定义对应一个实例。初始化和销毁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:
<bean id = "auditorium" class = "com.springinaction.springidol.Autorium" init-methd = "turnOnLights" destroy-method = "turnOffLights"/>为Bean定义初始化和销毁方法的另一种可选的方式是让Bean实现Spring的InitializingBean和DisposableBean接口。
注入Bean属性
Spring中使用<property>元素配置Bean的属性。<property>在许多方面都与<constructor-arg>类似,只不过一个是通过构造参数来注入值,另一个是通过调用属性的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配置文件部分
<bean id = "kenny" class = "com.springinaction.springidol.Instrumentalist"> <property name = "song" value = "Jingle Bells"/> </bean>为了让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代码所示:
<bean id = "saxophone" class = "com.springinaction.springidol.Saxophone"/>修改kenny Bean的配置。使用setter注入为instrument属性设值:
<bean id = "kenny2" class = "com.springinaction.springidol.Instrumentalist"> <property name = "song" value = "Jingle Bells" /> <property name = "instrument" ref = "saxophone" />现在kenny Bean已经注入了所有的属性,并且可以准备演出了。
