【史上最低】MyEclipse个人开发者专享7折!在线订购>>
Spring是一个应用比较广泛的框架集,本教程将重点介绍依赖注入,这是Spring渗透到所有Spring的核心功能之一。本教程还演示了MyEclipse如何在Spring应用程序开发过程中帮助您。您将学习到:
持续时间:20-30分钟
还没有MyEclipse?立即下载
简而言之,依赖注入是在需要引用时有一个框架管理和分配对象引用的想法。这消除了开发人员在需要时调用属性设置器或JNDI查找来获取对对象的引用。简而言之,依赖注入是在需要引用时有一个框架管理和分配对象引用的想法。这消除了开发人员在需要时调用属性设置器或JNDI查找来获取对对象的引用。如果系统被明确定义,例如使用XML或注释,那么Spring运行时知道何时需要依赖,并确保它被适当地提供。通过删除"object bookkeeping",开发人员可以更容易地专注于应用程序的业务逻辑。
本教程中使用的应用程序是 Spring in Action 书中的Knight示例。项目的内容稍作修改来删除编译警告,并帮助澄清示例。您可以下载一个ZIP版本的 MyEclipse Spring project 示例,并导入到您的MyEclipse工作区。
1. 选择File>Import,展开General,然后选择Existing Projects进入Workspace,单击Next。
2. 选择Select archive file选项,然后浏览下载压缩文件,单击Finish。
导入示例项目
项目将显示在资源管理器中。
项目导入到工作区
由于此项目是使用旧版本的MyEclipse创建的,因此将打开项目迁移向导。 按照向导中的步骤迁移项目。
导入项目后,您可以使用MyEclipse的一些高级软件开发功能来更好地了解如何构建这个Spring应用程序。
源代码的UML类图允许您查看类是如何互相关联的。您刚刚导入的示例项目已经在名为Knight.umr的src/java文件夹的根目录中包含这个UMR(UML模型存储库)文件。双击该文件打开图表。
Knight应用程序的UML类图
该图表提供了knights、quests、exceptions和应用程序中涉及的其他类之间的即时可视化关联。虽然这个应用程序很小,但您可以轻松地逆向设计一个更大的应用程序来了解它的外观。在这种情况下,从Package Explorer中选择这些类,并将其下载到一个新的类图上来获得此结果。
能非常好的查看一个UML类图,但是它并不能整个说明,特别是对于一个Spring应用程序来讲。为此,MyEclipse Spring Explorer视图可以帮助可视化应用程序获取不同beans之间的关系。
Spring Explorer是通过一个或多个Spring bean配置文件显示您的Spring应用程序中配置的所有bean。这些配置文件没有明确定义的命名约定(如struts-config.xml,faces-config.xml等),应用程序可以包含任意数量的bean配置文件。因此,MyEclipse允许您配置代表您的bean配置的XML文件列表。此信息可以在MyEclipse> Spring> Beans下的项目属性中找到。
1. 右键单击Knight项目,选择Properties。
2. 展开Project Facets>Spring,然后选择Beans。这是现有的bean配置文件的列表,单击Cancel。
Spring beans属性
3. 通过选择Window>Show View>Other打开Spring Explorer视图,展开MyEclipse Java Enterprise,然后选择Spring Explorer。该项目出现在Spring Explorer视图中。
Spring Explorer视图中的项目bean
4. 双击bean配置文件—— applicationContext.xml ,然后在编辑器的底部单击Beans Graph标签。
Bean依赖图
从Spring beans的图表中可以看出,Knight引用了一个minstrel和 knightTarget ,而Knight embarks又向其提出了一个请求。应用程序以拦截器的形式使用Aspect Oriented Programming (AOP)来实现minstrel。
在通过"before"方法拦截器进行操作之前,minstrel将"sing"(实际记录)关于Knight所采取的操作。在实际操作发生之前,这种类型的"before"拦截器是一种执行操作的方法(例如在控制台上写下关于Knight将要做什么的描述)。要实现这一点,您可以指示Spring将这个拦截器编入bean定义中的其他类操作。
MyEclipse可以帮助您快速浏览您的Spring应用程序。 在这种情况下,假设您想查看这个minstrel是如何实现的。您可以在图中双击minstrel bean,在Spring bean配置文件中跳转到该定义,然后使用CTRL + Click,可以直接跳转到minstrel implementation。
1. 在图中双击minstrel bean,Spring bean配置文件打开minstrel bean。
Minstrel bean中的bean配置文件
2. 按住CTRL,然后单击MinstrelAdvice类来打开它的资源,这个类记录knight的操作。
MinstrelAdvice类源文件
3. 在资源管理器中,展开Knight project>src/java>com.springinaction.chapter01.knight,然后双击KnightApp.java。
4. 单击运行图标下拉箭头,然后选择Run As>Java Application。控制台视图中显示以下输出:
[DEBUG] 10:51:03 KnightApp - Running KnightApp
[DEBUG] 10:51:04 KnightOfTheRoundTable - Brave Bedivere did embarkOnQuest
[DEBUG] 10:51:04 KnightApp - KnightApp Finished
您可以看到默认的minstrel implementation输出“Brave Bedivere did embarkOnQuest”行。假设你想要一个不同的minstrel implementation,但不想要重新编译整个 MinstrelAdvice 类。这根本不是问题,您只需要编写一个新的minstrel implementation,然后使用Spring将其插入即可。
1. 右键单击com.springinaction.chapter01.knight包,然后选择New>Class。
2. 在Name字段中输入BetterMinstrelAdvice,然后单击Finish。
3. 复制以下代码,并替换默认的类代码,按CTRL + S保存。
package com.springinaction.chapter01.knight;
import java.lang.reflect.Method;
import org.apache.log4j.Logger;
import org.springframework.aop.MethodBeforeAdvice;
public class BetterMinstrelAdvice implements MethodBeforeAdvice
{
public void before(Method method, Object[] args, Object target)
throws Throwable
{
Knight knight = (Knight) target;
Logger song = Logger.getLogger(target.getClass());
song.debug("La la
lee la, our fair knight " + knight.getName() + " has
performed " + method.getName() + " with such grace!");
}
}
要将此新实现插入到新的Spring应用程序中,您需要在bean配置文件中创建一个新的bean定义,并将Knight的minstrel拦截器替换为新的更好的Minstrel拦截器。
4. 打开applicationContext.xml,单击Overview标签,然后单击New Bean。
5. 在Bean Id字段中键入betterMinstrel,然后单击Bean Class字段旁边的Browse。
6. 在搜索字段中输入better,选择BetterMinstrelAdvice,然后单击OK。
Selecting the bean class for the new bean
7. 单击Finish来创建新的bean,然后按CTRL + S保存bean配置文件。 新的bean出现在Spring Explorer视图中。
Creating a new bean
8. 在Spring Explorer中,展开Knight Bean> Interceptor Names> List,然后双击minstrel。 minstrel值在配置源中突出显示。
Selecting the interceptor property value of the Knight bean
9. 用minMinstrel替换minstrel值,然后按CTRL + S进行保存。
10. 再次运行KnightApp类以查看更改的结果。控制台视图中显示以下输出:
[DEBUG] 11:38:57 KnightApp - Running KnightApp
[DEBUG] 11:38:57 KnightOfTheRoundTable - La la lee la, our fair knight Bedivere has performed embarkOnQuest with such grace!
[DEBUG] 11:38:57 KnightApp - KnightApp Finished
您可以真正看到Spring在您的项目中允许的模块化的价值,在正在测试中立即插拔应用程序部分是最明显的用途之一。考虑到一个Web应用程序,您可以编写模拟DAO实现,并在运行所有测试用例之前将其插入,而无需更改任何内容。您可以通过Spring将测试类连接到测试DAO类,而不是需要活动数据库连接的实际类。
另一个例子是切换应用程序的整个实现细节(如缓存,数据访问等),而不会破坏应用程序或花费时间重构应用程序本身的类和引用。