相信大部分从事过 Java 开发的人都听说过 Spring 框架,Spring 框架是一个构建企业级应用程序的轻量级的一站式解决方案。而且,Spring 框架是模块化的,允许你只使用那些
你需要的部分,而无需引入其所有部分。你可以在任何框架之上去使用 IOC 容器。Spring 框架支持声明式事务管理,通过RMI或 Web 服务远程访问你的逻辑,并支持多种选择以持久化你的数据。它还提供了一个全能的 MVC 框架,使你能够将 AOP 透明地集成到你的软件中。Spring 的设计还是非侵入性的,也就是说你的领域逻辑代码一般对框架本身无依赖性。
本系列博文假定你对 Spring 框架有一定的了解,而不是从零开始,关于 Java 和 Spring 框架的一些基础知识,请读者自行解决。
准备工作:
1、本博文系列 IDE 均采用 Eclipse Mars (即 4.5.2 版) Java EE;
2、jar 依赖管理采用 gradle,对应的gradle版本为2.1,对应的 Eclipse 插件为 Buildship;
3、JDK 版本至少为 7;
4、Tomcat 版本至少为 8;
JDK、Eclipse 和 Tomcat 的安装不在本博文讲解范围,请读者自行解决。下面从如何安装 gradle 插件 Buildship 开始讲起。
首先,假设你的电脑能正常上网,并假设上面提到的各种软件或工具的安装路径如下:
JDK - C:\Java\jdk1.8
JRE - C:\Java\jre8
gradle - C:\Java\gradle-2.1
Eclipse - C:\Java\eclipse
Tomcat - C:\Java\Tomcat 8.0
第二,启动 Eclipse 集成开发环境,然后点击菜单 Help -> Eclipse Marketplace...,稍等片刻后在弹出截面中的 Find: 文本输入框中输入 Buildship 然后点击查找按钮(输入框里的那个小放大镜图标)进行搜索,如下图所示:
然后点击上图中第一个 Install 按钮,并根据向导一路走下去,以完成插件的安装。
第三,安装完成后,我们最好确认一下插件是否安装成功,点击菜单Help -> About Eclipse,将弹出如下对话框:
左边起,如果出现如第四个绿色的“G”字样的图标,就表示安装成功了。
到现在为止,我们的准备工作一切就绪,下面我们将尝试创建我们的第一个 gradle 项目:
点击 File -> New -> Project...,将弹出如下对话框:
在上述对话框中选择如上图中所示那个 Gradle -> Gradle Project 向导,接着点击 Next > 按钮进入下一步
欢迎页面,不用理会它继续点击 Next 按钮进入下一步,如下图所示:
此时在 Project Name 中填入项目名称,我们输入 spring_recipes_001 作为我们的项目名称,接着Next 进入下一步,如下图所示:
此时,我们选择自己安装好的本地 gradle 路径,如上图中所示。
最后按 Finish 按钮即可完成创建,完成后的项目结构如下图所示:
为我们的项目添加 Spring 框架相关的 jar 包,双击打开上图中的 build.gradle 配置文件,并在 dependencies 配置节中加入一行(Spring 版本以 3.2.17.RELEASE 为例):
compile 'org.springframework:spring-context:3.2.17.RELEASE'
加入后的内容大致如下所示:
dependencies {
compile'org.slf4j:slf4j-api:1.7.5'
compile'org.springframework:spring-context:3.2.17.RELEASE'
testCompile'junit:junit:4.11'
}
加入并保存后,右击我们的项目,然后选择Gradle -> Refresh Gradle Project,接着 gradle 会帮助我们完成我们需要的 spring jar 包的导入工作,jar 包的依赖问题也不用我们担心,一切都由 gradle 自动完成,如果一切正常的话,此时我们的项目结构应该大致如下:
实例化 Spring IOC容器
你必须实例化Spring IOC 容器,读取其配置来创建 bean 实例。Spring提供两种 IOC 容器实现类型:最基本的一种是 BeanFactory亦即 Bean工厂;另一种更高级的是Application Context亦即应用程序上下文。但是这两种 IOC容器类型的 Bean配置文件是相同的。
Bean工厂对应的接口是BeanFactory;应用程序上下文对应的接口是 ApplicationContext。而ApplicationContext接口是与 BeanFactory兼容的子接口。
ApplicationContext仅仅是一个接口,你必须实例化这个接口的实现。默认有ClassPathXmlApplicationContext实现,它从 classpath 中装入一个 XML 配置文件,并构建一个应用程序上下文,例如:
ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”);
另外Spring 还提供了其他多种 ApplicationContext 实现,包括用于从文件系统或者URL 装入 XML 配置文件的 FileSystemXmlApplicationContext实现,以及仅用于 Web和入口应用程序的XmlWebApplicationContext与 XmlPortletApplicationContext实现。
从 IOC容器中得到 Bean
为了从bean 工厂或者应用程序上下文中得到已经声明的 bean,我们只需要调用getBean()方法并传递一个唯一的 bean名称即可。getBean()方法返回的类型为 java.lang.Object,所以在使用之前必须将其转换为实际的类型,就像这样:
SequenceGenerator generator = (SequenceGenerator) context.getBean(“sequenceGenerator”);
示例
首先,创建 Bean 类,在项目的源码目录src/main/java 下新建一个名为“sesametech.springrecipes.s001”的包,然后在该包下创建名为 SequenceGenerator 的类:
packagesesametech.springrecipes.s001;
public class SequenceGenerator {
private String prefix;
private String suffix;
private int initial;
private int counter;
public SequenceGenerator() {
}
publicSequenceGenerator(Stringprefix, Stringsuffix,intinitial) {
this.prefix =prefix;
this.suffix =suffix;
this.initial =initial;
}
public synchronized String getSequence(){
StringBufferbuffer = new StringBuffer();
buffer.append(prefix);
buffer.append(initial +counter++);
buffer.append(suffix);
return buffer.toString();
}
getter & setter …
}
其次,创建 Bean 配置文件,在项目的源码目录src/main/java 下新建一个名为“beans.xml”的XML 文件,并加入 Spring 专有的 Schema 声明:
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
……
</beans>
每个 bean 都应该提供一个唯一的id 或者 name 属性,以及一个完全限定类名,用于给Spring IOC 容器对其进行实例化。而对于每个简单类型的 bean 属性,你可以通过设值方法为其配置一个属性,对于这种配置属性的方式是通过使用<property> 元素,并在其中 name 特性中指定属性名称,然后在其下指定一个<value> 元素。这种方式要求 bean 必须包含一个对应的设值方法(即setter 方法)。对于本示例的配置如下:
<bean
id="sequenceGenerator"
name="sequenceGenerator"
class="sesametech.springrecipes.s001.SequenceGenerator">
<propertyname="prefix">
<value>30</value>
</property>
<propertyname="suffix">
<value>A</value>
</property>
<propertyname="initial">
<value>100000</value>
</property>
</bean>
第三,创建测试类,在项目的源码目录“sesametech.springrecipes.s001”的包下创建名为 SequenceGeneratorTest 的测试类:
packagesesametech.springrecipes.s001;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
public class SequenceGeneratorTest{
@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContextcontext = newClassPathXmlApplicationContext("beans.xml");
SequenceGeneratorgenerator = (SequenceGenerator)context.getBean("sequenceGenerator");
System.out.println(generator.getSequence());
System.out.println(generator.getSequence());
}
}
最后,运行这个测试类,如果一切正常,你应该可以看到如下可能不太感兴趣的信息:
30100000A
30100000A
上面的方式是通过设值方式配置bean 属性。你还可以通过构造方法来配置 bean 属性,这种方式是通过使用<construct-arg> 元素来配置的,这个元素没有 name 属性,因为构造方法参数是基于位置的,对于本示例的配置如下:
<bean
id="sequenceGenerator"
name="sequenceGenerator"
class="sesametech.springrecipes.s001.SequenceGenerator">
<constructor-arg>
<value>40</value>
</constructor-arg>
<constructor-arg>
<value>B</value>
</constructor-arg>
<constructor-arg>
<value>200000</value>
</constructor-arg>
</bean>
以上两种 bean 属性的配置方式稍显繁琐,Spring提供了更加简化的配置方式。
对于通过设值的方式,可以简化成如下简写形式:
<bean
id="sequenceGenerator"
name="sequenceGenerator"
class="sesametech.springrecipes.s001.SequenceGenerator">
<propertyname="prefix"value="50"/>
<propertyname="suffix"value="C"/>
<propertyname="initial"value="300000"/>
</bean>
对于通过构造方法的配置方式,可以简化成如下形式:
<bean
id="sequenceGenerator"
name="sequenceGenerator"
class="sesametech.springrecipes.s001.SequenceGenerator">
<constructor-argvalue="60"/>
<constructor-argvalue="D"/>
<constructor-argvalue="400000"/>
</bean>
最后,Spring 从2.0 版本开始,提供了另一种更加便利的简写形式,它使用 p schema 就像使用<bean> 元素中的属性一样来定义 bean 属性。增加p schema 声明后的内容如下粗体所示:
<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-3.2.xsd">
<bean
id="sequenceGenerator"
name="sequenceGenerator"
class="sesametech.springrecipes.s001.SequenceGenerator"
p:prefix="70"p:suffix="E"p:initial="500000"/>
</beans>
好了,今天就写到这里吧,如果我的文章能够对你有所帮助,将是对我极大的鼓舞,欢迎拍砖~