Spring初学文档.docx

上传人:b****5 文档编号:28006325 上传时间:2023-07-07 格式:DOCX 页数:13 大小:19.87KB
下载 相关 举报
Spring初学文档.docx_第1页
第1页 / 共13页
Spring初学文档.docx_第2页
第2页 / 共13页
Spring初学文档.docx_第3页
第3页 / 共13页
Spring初学文档.docx_第4页
第4页 / 共13页
Spring初学文档.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Spring初学文档.docx

《Spring初学文档.docx》由会员分享,可在线阅读,更多相关《Spring初学文档.docx(13页珍藏版)》请在冰豆网上搜索。

Spring初学文档.docx

Spring初学文档

Spring2.5注释驱动

8.4.1Spring2.5注释驱动

注释语法越来越多的被业界所使用,并且注释配置相对于XML配置具有很多的优势:

它可以充分利用Java的反射机制获取类结构信息,这些信息可以有效减少配置的工作。

注释和Java代码位于一个文件中,而XML配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和Java代码放在一起,有助于增强程序的内聚性。

而采用独立的XML配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。

因此在很多情况下,注释配置比XML配置更受欢迎,注释配置有进一步流行的趋势。

Spring2.5的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分XML配置的功能。

在使用注释配置之前,先来回顾一下传统上是如何配置Bean并完成Bean之间依赖关系的建立。

代码清单1Foo.javaFoo对象有一个String类型的name属性.

package;

publicclassFoo{

privateStringname;

publicStringtoStirng(){

return"FooNameis:

"+this.name;

}

Set和get方法

}

代码清单2Bar.javaBar对象有一个String类型的add属性.

package;

publicclassBar{

privateStringadd;

publicStringtoStirng(){

return"BarAddis:

"+this.add;

}

Set和get方法

}

代码清单3Main.javaMain对象有两个属性分别是Foo和Bar

package;

publicclassMain{

privateFoofoo;

privateBarbar;

publicStringtoString(){

return"Main:

["++""++"]";

}

Set和get方法

}

代码清单4配置文件spring-config-beans.xml

代码清单5Test.javaTest类用于初始化Spring容器并获得main对象

package;

import;

import

ClassPathXmlApplicationContext;

publicclassTest{

publicstaticvoidmain(String[]args){

String[]locations={"spring-config-beans.xml"};

ApplicationContextctx=newClassPathXmlApplicationContext(locations);

Mainmain=(Main)ctx.getBean("main");

;

}

}

运行Test类控制台输出以下信息:

Main:

[FooNameis:

FooBarAddis:

Bar]

这说明Spring已经完成了Bean的创建和装配工作。

1)使用@Autowired注释

Spring2.5引入了@Autowired注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

下面我们来看一下使用@Autowired进行成员变量自动注入的代码:

代码清单6使用@Autowired注释的Main.java,此时可以将Main.java类中的set和get方法删除

package;

import;

publicclassMain{

@Autowired

privateFoofoo;

@Autowired

privateBarbar;

publicStringtoString(){

return"Main:

["++""++"]";

}

}

Spring通过一个BeanPostProcessor对@Autowired进行解析,所以要让@Autowired起作用必须事先在Spring容器中声明AutowiredAnnotationBeanPostProcessorBean

代码清单7修改配置文件

-- 该 BeanPostProcessor 将自动对标注 @Autowired 的 Bean 进行注入 -->

AutowiredAnnotationBeanPostProcessor"/>

—此时移除 main Bean 的属性注入信息 -->  

当Spring容器启动时,AutowiredAnnotationBeanPostProcessor将扫描Spring容器中所有Bean,当发现Bean中拥有@Autowired注释时就找到和其匹配(默认按类型匹配)的Bean,并将其注入。

2)使用@Qualifier注释

Spring允许我们通过@Qualifier注释指定注入Bean的名称,这样就不会产生注入错误了,请看下面代码清单:

代码清单8修改Main.java类中的foo属性注释增加注释@Qualifier("foo1")

publicclassMain{

@Autowired

@Qualifier("foo1")

privateFoofoo;

@Autowired

privateBarbar;

publicStringtoString(){

return"Main:

["++""++"]";

}

}

代码清单9在配置文件中增加id为foo2Bean定义

AutowiredAnnotationBeanPostProcessor"/>

运行Test.java控制台输出如下信息:

Main:

[FooNameis:

Foo1BarAddis:

Bar]

证明Spring容器成功将foo1注入进main类中

3)使用

annotation-config/>简化配置

Spring2.1添加了一个新的context的Schema命名空间,该命名空间对注释驱动、属性文件引入、加载期织入等功能提供了便捷的配置。

我们知道注释本身是不会做任何事情的,它仅提供元数据信息。

要使元数据信息真正起作用,必须让负责处理这些元数据的处理器工作起来。

而我们前面所介绍的AutowiredAnnotationBeanPostProcessor就是处理这些注释元数据的处理器。

但是直接在Spring配置文件中定义这些Bean显得比较笨拙。

Spring为我们提供了一种方便的注册这些BeanPostProcessor的方式,这就是

annotation-config/>。

请看下面的代码清单:

代码清单10

annotation-config/>

代码清单中将

AutowiredAnnotationBeanPostProcessor"/>

替换成为

annotation-config/>

annotationconfig/>将隐式地向Spring容器注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor以及equiredAnnotationBeanPostProcessor这4个BeanPostProcessor。

4)使用@Component

虽然我们可以通过@Autowired在Bean类中使用自动注入功能,但是Bean还是在XML文件中通过进行定义,也就是说,在XML配置文件中定义Bean,通过@Autowired为Bean的成员变量、方法入参或构造函数入参提供自动注入的功能。

能否也通过注释定义Bean,从XML配置文件中完全移除Bean定义的配置呢?

答案是肯定的,我们通过Spring2.5提供的@Component注释就可以达到这个目标。

请看下面的代码清单:

代码清单11Foo.java

@Component

publicclassFoo{

privateStringname="Foo'sname.";

publicStringtoStirng(){

return"FooNameis:

"+this.name;

}

}

在类的开始位置使用@Component注释,标明此类是一个Bean

代码清单12Main.java

@Component("main")

publicclassMain{

@Autowired

privateFoofoo;

@Autowired

privateBarbar;

……

@Component有一个可选的入参,用于指定Bean的名称,在Main中,我们就将Bean名称定义为“main”。

在使用@Component注释后,Spring容器必须启用类扫描机制以启用注释驱动Bean定义和注释驱动Bean的自动注入的策略。

Spring2.5对context命名空间进行了扩展,提供了这一功能。

代码清单13Spring配置文件中只保留以下配置信息

component-scanbase-package=""/>

这里,所有通过元素定义Bean的配置内容已经被移除,仅需要添加一行

component-scan/>配置就解决所有问题了——SpringXML配置文件得到了极致的简化(当然配置元数据还是需要的,只不过以注释形式存在罢了)。

component-scan/>的base-package属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。

8.4.2Spring2.5基于注解驱动的MVC

Spring2.5也为SpringMVC引入了注释驱动功能。

现在我们无须让Controller继承任何接口,无需在XML配置文件中定义请求和Controller的映射关系,仅仅使用注释就可以让一个POJO具有Controller的绝大部分功能——SpringMVC框架的易用性得到了进一步的增强。

1) 基于注解的Controller

由于SpringMVC的Controller必须事先是一个Bean,所以@Controller注解是不可缺少的。

请看下面的代码清单

代码清单1

@Controller//将这个类标注为Controller

publicclassFooController{

@Autowired

privateFooServicefooService;

@RequestMapping("/list.do")//URL请求映射

publicString[]list(){

String[]list=fooService.getAll();

;

returnlist;

}

@RequestMapping("/del.do")//URL请求映射

publicvoiddel(HttpServletRequestrequest,HttpServletResponseresponse){

fooService.doDel(request.getParameter("id"));

}

}

标注为一个控制器,而不需继承或者实现任何类和接口,就使FooController.java拥有了控制器的功能。

代码清单1中使用了两个链接分别访问了不同的方法,在实际应用中我们也许有另外一种需求一个控制器只接受一个URL请求,而控制器中不同的方法来处理URL请求中携带的不同的参数,请看下面的代码清单。

2) 一个Controller对应一个URL,由请求参数决定请求处理方法

代码清单2

@Controller

@RequestMapping("/doFoo.do")//指定控制器对应URL请求

publicclassFooController{

@Autowired

privateFooServicefooService;

//list方法对应URL/doFoo.do?

mode=list

@RequestMapping(params="mode=list")

publicString[]list(){

String[]list=fooService.getAll();

;

returnlist;

}

//del方法对应URL/doFoo.do?

mode=del

@RequestMapping(params="mode=del")

publicvoiddel(HttpServletRequestrequest,

HttpServletResponseresponse){

fooService.doDel(request.getParameter("id"));

}

}

代码清单2中满足了针对不同粒度程序设计的需要。

我们还可以让请求处理方法处理特定的HTTP请求如POST类型的,请看下面的代码清单。

3) 让请求处理方法处理特定的HTTP请求方法

代码清单3

@Controller

@RequestMapping("/doFoo.do")//指定控制器对应URL请求

publicclassFooController{

//只针对POST请求

@RequestMapping(params="mode=submit",

method=RequestMethod.POST)

publicStringsubmit(HttpServletRequestrequest,

HttpServletResponseresponse){

"调用submit方法.");

return"success";

}

}

方法submit只处理类型为POST的URL请求

4) 处理方法入参绑定URL参数

代码清单4

@Controller

@RequestMapping("/doFoo.do")//指定控制器对应URL请求

publicclassFooController{

@Autowired

privateFooServicefooService;

//del方法对应URL/doFoo.do?

mode=del&id=10

@RequestMapping(params="mode=del")

publicStringdel(intid){

fooService.doDel(id);

return"success";

}

}

当我们发送/doFoo.do?

mode=del&id=10的URL请求时,

Spring不但让del()方法处理这个请求,而且还将id请求参数在类型转换后绑定到del()方法的id入参上。

而del()方法的返回类型是String,它将被解析为逻辑视图的名称。

也就是说Spring在如何给处理方法入参自动赋值以及如何将处理方法返回值转化为ModelAndView中的过程中存在一套潜在的规则,不熟悉这个规则就不可能很好地开发基于注解的请求处理方法,因此了解这个潜在规则无疑成为理解SpringMVC框架基于注解功能的核心问题。

代码清单4还可以写成下面这种形式

代码清单5

@Controller

@RequestMapping("/doFoo.do")//指定控制器对应URL请求

publicclassFooController{

@Autowired

privateFooServicefooService;

//del方法对应URL/doFoo.do?

mode=del&id=10

@RequestMapping(params="mode=del")

publicStringdel(@RequestParam("id")intid){

fooService.doDel(id);

return"success";

}

}

代码清单5中对del()请求处理方法的id入参标注了@RequestParam("id")注释,所以它将和id的URL参数绑定。

我的其它Spring文章,也许会对您有帮助

Spring的任务调度和邮件发送

Spring应用的单元测试

Spring的数据库支持

Spring的MVC框架

Spring的IoC容器

Spring对AOP的支持

Spring2.5注释驱动与基于注释的MVC

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1