当前位置:文档之家› spring注解使用

spring注解使用

spring注解使用
spring注解使用

1.使用Spring注解来注入属性

1.1.使用注解以前我们是怎样注入属性的

类的实现:

Java代码

1public class UserManagerImpl implements UserManager{

2private UserDao userDao;

3public void setUserDao(UserDao userDao){

https://www.doczj.com/doc/959445652.html,erDao=userDao;

5}

6...

7}

配置文件:

Java代码

8

class="https://www.doczj.com/doc/959445652.html,erManagerImpl"> 9

10

11

class="https://www.doczj.com/doc/959445652.html,erDaoImpl"> 12 13

1.2.引入@Autowired注解(不推荐使用,建议使用@Resource)

类的实现(对成员变量进行标注)

Java代码

14public class UserManagerImpl implements UserManager{

15@Autowired

16private UserDao userDao;

17...

18}

或者(对方法进行标注)

Java代码

19public class UserManagerImpl implements UserManager{

20private UserDao userDao;

21@Autowired

22public void setUserDao(UserDao userDao){

https://www.doczj.com/doc/959445652.html,erDao=userDao;

24}

25...

26}

配置文件

Java代码

27

class="https://www.doczj.com/doc/959445652.html,erManagerImpl"/> 28

class="https://www.doczj.com/doc/959445652.html,erDaoImpl">

29

30

@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。以上两种不同实现方式中,@Autowired的标注位置不同,它们都会在Spring在初始化userManagerImpl这个bean时,自动装配userDao这个属性,区别是:第一种实现中,Spring会直接将UserDao类型的唯一一个bean赋值给userDao这个成员变量;第二种实现中,Spring会调用setUserDao方法来将UserDao类型的唯一一个bean装配到userDao这个属性。

1.3.让@Autowired工作起来

要使@Autowired能够工作,还需要在配置文件中加入以下代码

Java代码

31

class="org.springframework.beans.factory.annotation.AutowiredAnnotationBe anPostProcessor"/>

1.4.@Qualifier

@Autowired是根据类型进行自动装配的。在上面的例子中,如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring 上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。

1.可能存在多个UserDao实例

Java代码

32@Autowired

33public void setUserDao(@Qualifier("userDao")UserDao userDao){

https://www.doczj.com/doc/959445652.html,erDao=userDao;

35}

这样,Spring会找到id为userDao的bean进行装配。

2.可能不存在UserDao实例

Java代码

36@Autowired(required=false)

37public void setUserDao(UserDao userDao){

https://www.doczj.com/doc/959445652.html,erDao=userDao;

39}

1.5.@Resource(JSR-250标准注解,推荐使用它来代替Spring专有的@Autowired注解)

Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按byName自动注入罢了。@Resource有两个属性是比较重要的,分别是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type 属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Resource装配顺序

40如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

41如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常

42如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常

43如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;

1.6.@PostConstruct(JSR-250)

在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行(注:Bean初始化包括,实例化Bean,并装配Bean的属性(依赖注入))。

它的一个典型的应用场景是,当你需要往Bean里注入一个其父类中定义的属性,而你又无法复写父类的属性或属性的setter方法时,如:

Java代码

44public class UserDaoImpl extends HibernateDaoSupport implements

UserDao{

45private SessionFactory mySessionFacotry;

46@Resource

47public void setMySessionFacotry(SessionFactory sessionFacotry){

48this.mySessionFacotry=sessionFacotry;

49}

50@PostConstruct

51public void injectSessionFactory(){

52super.setSessionFactory(mySessionFacotry);

53}

54...

55}

这里通过@PostConstruct,为UserDaoImpl的父类里定义的一个sessionFactory私有属性,注入了我们自己定义的sessionFactory(父类的setSessionFactory方法为final,不可复写),之后我们就可以通过调用super.getSessionFactory()来访问该属性了。

1.7.@PreDestroy(JSR-250)

在方法上加上注解@PreDestroy,这个方法就会在Bean初始化之后被Spring容器执行。由于我们当前还没有需要用到它的场景,这里不不去演示。其用法同@PostConstruct。1.8.使用简化配置

Spring2.1添加了一个新的context的Schema命名空间,该命名空间对注释驱动、属性

文件引入、加载期织入等功能提供了便捷的配置。我们知道注释本身是不会做任何事情的,它仅提供元数据信息。要使元数据信息真正起作用,必须让负责处理这些元数据的处理器工作起来。

AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor 就是处理这些注释元数据的处理器。但是直接在Spring配置文件中定义这些Bean显得比较笨拙。Spring为我们提供了一种方便的注册这些BeanPostProcessor的方式,这就是

Java代码

56

xmlns:xsi="https://www.doczj.com/doc/959445652.html,/2001/XMLSchema-instance"

xmlns:context="https://www.doczj.com/doc/959445652.html,/schema/context"

57xsi:schemaLocation="https://www.doczj.com/doc/959445652.html,/schema/beans 58https://www.doczj.com/doc/959445652.html,/schema/beans/spring-beans-2.5.xsd 59https://www.doczj.com/doc/959445652.html,/schema/context

60

https://www.doczj.com/doc/959445652.html,/schema/context/spring-context-2.5.xsd">

61

62

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

2.使用Spring注解完成Bean的定义

以上我们介绍了通过@Autowired或@Resource来实现在Bean中自动注入的功能,下面我们将介绍如何注解Bean,从而从XML配置文件中完全移除Bean定义的配置。

2.1.@Component(不推荐使用)、@Repository、@Service、@Controller

只需要在对应的类上加上一个@Component注解,就将该类定义为一个Bean了:

Java代码

63@Component

64public class UserDaoImpl extends HibernateDaoSupport implements

UserDao{

65...

66}

使用@Component注解定义的Bean,默认的名称(id)是小写开头的非限定类名。如这里定义的Bean名称就是userDaoImpl。你也可以指定Bean的名称:

@Component("userDao")

@Component是所有受Spring管理组件的通用形式,Spring还提供了更加细化的注解形式:@Repository、@Service、@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean。目前版本(2.5)中,这些注解与@Component的语义是一样的,完全通用,在Spring以后的版本中可能会给它们追加更多的语义。所以,我们推荐使用@Repository、@Service、@Controller来替代@Component。

2.2.使用让Bean定义注解工作起来

Java代码

67

xmlns:xsi="https://www.doczj.com/doc/959445652.html,/2001/XMLSchema-instance"

xmlns:context="https://www.doczj.com/doc/959445652.html,/schema/context"

68xsi:schemaLocation="https://www.doczj.com/doc/959445652.html,/schema/beans 69https://www.doczj.com/doc/959445652.html,/schema/beans/spring-beans-2.5.xsd 70https://www.doczj.com/doc/959445652.html,/schema/context

71

https://www.doczj.com/doc/959445652.html,/schema/context/spring-context-2.5.xsd">

72

73

这里,所有通过元素定义Bean的配置内容已经被移除,仅需要添加一行配置就解决所有问题了——Spring XML配置文件得到了极致的简化(当然配置元数据还是需要的,只不过以注释形式存在罢了)。的base-package属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。

还允许定义过滤器将基包下的某些类纳入或排除。Spring 支持以下4种类型的过滤方式:

?过滤器类型表达式范例说明

?注解org.example.SomeAnnotation将所有使用SomeAnnotation注解的类过滤出来

?类名指定org.example.SomeClass过滤指定的类

?正则表达式com\.kedacom\.spring\.annotation\.web\..*通过正则表达式过滤一些类

?AspectJ表达式org.example..*Service+通过AspectJ表达式过滤一些类

以正则表达式为例,我列举一个应用实例:

Java代码

74

base-package="com.casheen.spring.annotation">

75

expression="com\.casheen\.spring\.annotation\.web\..*"/>

76

值得注意的是配置项不但启用了对类包进行扫描以实施注释驱动Bean定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor),因此当使用后,就可以将移除了。

2.3.使用@Scope来定义Bean的作用范围

在使用XML定义Bean时,我们可能还需要通过bean的scope属性来定义一个Bean的作用范围,我们同样可以通过@Scope注解来完成这项工作:

Java代码

77@Scope("session")

78@Component()

79public class UserSessionBean implements Serializable{

80...

81}

概述

注释配置相对于XML配置具有很多的优势:

它可以充分利用Java的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用JPA注释配置ORM映射时,我们就不需要指定PO的属性名、类型等信息,如果关系表字段和PO属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过Java反射机制获取。

注释和Java代码位于一个文件中,而XML配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和Java代码放在一起,有助于增强程序的内聚性。而采用独立的XML配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。

因此在很多情况下,注释配置比XML配置更受欢迎,注释配置有进一步流行的趋势。Spring2.5的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分XML配置的功能。在这篇文章里,我们将向您讲述使用注释进行Bean定义和依赖注入的内容。

原来我们是怎么做的

在使用注释配置之前,先来回顾一下传统上是如何配置Bean并完成Bean之间依赖关系的建立。下面是3个类,它们分别是Office、Car和Boss,这3个类需要在Spring容器中配置为Bean:

Office仅有一个属性:

清单 1.Office.java

Java代码

1package com.baobaotao;

2public class Office{

3private String officeNo=”001”;

4

5//省略get/setter

6

7@Override

8public String toString(){

9return"officeNo:"+officeNo;

10}

11}

Car拥有两个属性:

清单 2.Car.java

Java代码

12package com.baobaotao;

13

14public class Car{

15private String brand;

16private double price;

17

18//省略get/setter

19

20@Override

21public String toString(){

22return"brand:"+brand+","+"price:"+price;

23}

24}

Boss拥有Office和Car类型的两个属性:

清单 3.Boss.java

Java代码

25package com.baobaotao;

26

27public class Boss{

28private Car car;

29private Office office;

30

31//省略get/setter

32

33@Override

34public String toString(){

35return"car:"+car+"\n"+"office:"+office;

36}

37}

我们在Spring容器中将Office和Car声明为Bean,并注入到Boss Bean中:下面是使用传统XML完成这个工作的配置文件beans.xml:

清单 4.beans.xml将以上三个类配置成Bean

Java代码

38

39

40xmlns:xsi="https://www.doczj.com/doc/959445652.html,/2001/XMLSchema-instance"

41xsi:schemaLocation="https://www.doczj.com/doc/959445652.html,/schema/beans 42https://www.doczj.com/doc/959445652.html,/schema/beans/spring-beans-2.5.xsd"> 43

44

45

46

47

48

49

50 51

52

53

54

当我们运行以下代码时,控制台将正确打出boss的信息:

清单 5.测试类:AnnoIoCTest.java

Java代码

55import org.springframework.context.ApplicationContext;

56import

org.springframework.context.support.ClassPathXmlApplicationContext;

57public class AnnoIoCTest{

58

59public static void main(String[]args){

60String[]locations={"beans.xml"};

61ApplicationContext ctx=

62new ClassPathXmlApplicationContext(locations);

63Boss boss=(Boss)ctx.getBean("boss");

64System.out.println(boss);

65}

66}

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

使用@Autowired注释

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

清单 6.使用@Autowired注释的Boss.java

Java代码

67package com.baobaotao;

68import org.springframework.beans.factory.annotation.Autowired;

69

70public class Boss{

71

72@Autowired

73private Car car;

74

75@Autowired

76private Office office;

77

78…

79}

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

清单7.让@Autowired注释工作起来

Java代码

80

81

82xmlns:xsi="https://www.doczj.com/doc/959445652.html,/2001/XMLSchema-instance"

83xsi:schemaLocation="https://www.doczj.com/doc/959445652.html,/schema/beans 84https://www.doczj.com/doc/959445652.html,/schema/beans/spring-beans-2.5.xsd"> 85

86

87

89

90

91

92

93

94

95

96

97

98

99

100

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

按照上面的配置,Spring将直接采用Java反射机制对Boss中的car和office这两个私有成员变量进行自动注入。所以对成员变量使用@Autowired后,您大可将它们的setter方法(setCar()和setOffice())从Boss中删除。

当然,您也可以通过@Autowired对方法或构造函数进行标注,来看下面的代码

清单8.将@Autowired注释标注在Setter方法上

Java代码

101package com.baobaotao;

102

103public class Boss{

104private Car car;

105private Office office;

106

107@Autowired

108public void setCar(Car car){

109this.car=car;

110}

111

112@Autowired

113public void setOffice(Office office){

114this.office=office;

115}

116…

117}

这时,@Autowired将查找被标注的方法的入参类型的Bean,并调用方法自动注入这些Bean。而下面的使用方法则对构造函数进行标注:

清单9.将@Autowired注释标注在构造函数上

Java代码

118package com.baobaotao;

119

120public class Boss{

121private Car car;

122private Office office;

123

124@Autowired

125public Boss(Car car,Office office){

126this.car=car;

127this.office=office;

128}

129

130…

131}

由于Boss()构造函数有两个入参,分别是car和office,@Autowired将分别寻找和它们类型匹配的Bean,将它们作为Boss(Car car,Office office)的入参来创建Boss Bean。当候选Bean数目不为1时的应对方法

在默认情况下使用@Autowired注释进行自动注入时,Spring容器中匹配的候选Bean 数目必须有且仅有一个。当找不到一个匹配的Bean时,Spring容器将抛出BeanCreationException异常,并指出必须至少拥有一个匹配的Bean。我们可以来做一个实验:

清单10.候选Bean数目为0时

Java代码

132

133

134xmlns:xsi="https://www.doczj.com/doc/959445652.html,/2001/XMLSchema-instance"

135xsi:schemaLocation="https://www.doczj.com/doc/959445652.html,/schema/beans 136https://www.doczj.com/doc/959445652.html,/schema/beans/spring-beans-2.5.xsd"> 137

138

140

141

142

143

144

147

148

149

150

151

152

由于office Bean被注释掉了,所以Spring容器中将没有类型为Office的Bean了,而Boss的office属性标注了@Autowired,当启动Spring容器时,异常就产生了。

当不能确定Spring容器中一定拥有某个类的Bean时,可以在需要自动注入该类Bean 的地方可以使用@Autowired(required=false),这等于告诉Spring:在找不到匹配Bean时也不报错。来看一下具体的例子:

清单11.使用@Autowired(required=false)

Java代码

153package com.baobaotao;

154

155import org.springframework.beans.factory.annotation.Autowired;

156import org.springframework.beans.factory.annotation.Required;

157

Spring考试

1. (单选题)下列关于Spring配置文件的说法不正确的是 o A. Spring默认是读取/WEB-INF/配置文件 o B. Spring的配置文件可以配置在类路径下,并可以重命名,但是需要在文件中指定 o C. 把文件放到src目录下,Spring也可以读到 o D. 可以通过在中的进行指定 Spring配置文件 正确答案:C 把文件放到src目录下,需要在web。xml里设置 contextConfigLocation /WEB-INF/classes/ 可以让spring读到 2. (单选题)下列关于Spring特性中IoC描述错误的是 o A. IoC就是指程序之间的关系由程序代码直接操控 o B. 所谓“控制反转”是指控制权由应用代码转到外部容器,即控制权的转移 o C. IoC将控制创建的职责搬进了框架中,从应用代码脱离开来 o D. 使用Spring的IoC容器时只需指出组件需要的对象,在运行时Spring的IoC 容器会根据XML配置数据提供给它

正确答案:A IOC是来完成相互依赖的对象的创建、协调工作。 3. (单选题)下列关于Spring的装配模式(default-autowire)描述不正确的是 o A. Spring中,至少有两种装配模式,按“类型”和“名字” o B. Spring中默认是按名字进行装配的 o C. 可以用default-autowire=”byType”配置按类型装配 o D. 一旦在一个Spring配置文件中配置了default-autowire=”byType”,其它的配置文件也是按此种装配方式进行装配 正确答案:D 在标签中指定default-autowire属性,那么对于子标签 如果没有单独的设置autowire属性,那么将采用父标签 的default-autowire属性的模式,如果单独设置了autowire 属性,则采用自己的模式 4. (单选题)下列选项关于Spring的核心机制——依赖注入的描述正确的是 o A. 所谓依赖注入就是明确地定义组件接口,独立开发各个组件,然后根据组件间的依赖关系组装运行的设计开发模式 o B. Spring不负责管理bean之间的关系 o C. 节点有可选的子节点,用于注入bean的属性 o D. 在Spring的配置文件中,使用来创建Bean的实例 正确答案:B Spring通过一个配置文件描述Bean及Bean之间的依赖关系,利用java语言的反射功能实例化Bean并建立Bean之间的依赖关系。spring的ioc容器在完成这些底层工作的基础上,还提供了bean实例缓存,生命周期管理,bean实例代理,事件发布,资源装载等高级服务 5.

springMVC详解以及注解说明

springMVC详解以及注解说明 基于注释(Annotation)的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,提供了完全基于注释配置Bean、装配Bean 的功能,您可以使用基于注释的Spring IoC 替换原来基于XML 的配置。本文通过实例详细讲述了Spring 2.5 基于注释IoC 功能的使用。 概述 注释配置相对于XML 配置具有很多的优势: ? 它可以充分利用Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用JPA 注释配置ORM 映射时,我们就不需要指定PO 的属性名、类型等信息,如果关系表字段和PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过Java 反射机制获取。 ? 注释和Java 代码位于一个文件中,而XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和Java 代码放在一起,有助于增强程序的内聚性。而采用独立的XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。 因此在很多情况下,注释配置比XML 配置更受欢迎,注释配置有进一步流行的趋势。Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分XML 配置的功能。在这篇文章里,我们将向您讲述使用注释进行Bean 定义和依赖注入的内容。 Spring2.5的注释 Spring 2.5 提供了AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 和RequiredAnnotationBeanPostProcessor这四个主要的关于Annotation 的BeanPostProcessor。 我们可以使用 来方便地、一次性的声明者四个BeanPostProcessor。 1.Autowired... 提供对Spring 特有的Autowired 和Qualifier 注释。

SpringMVC配置的基本步骤

Springmvc框架配置步骤 小弟是个新手,有不对的地方请tell me,一起研究探讨。谢谢。 1062140832@https://www.doczj.com/doc/959445652.html, 配置springmvc框架其实不是很难,要现有一个总体的认识,确定要分几步,每一步主要是干什么,不要太盲目。 以为web.xml是项目的入口,所以所有的配置文件,都必须引入到wem.xml中,不然,配置了等于没用。所以,要先从入口入手。 配置web.xml 1、首先引入springmvc-servlet.xml文件 springMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/mvc/springmvc-servlet.xml 1 2、将spring加载到web.xml中 org.springframework.web.context.ContextLoaderListener 3、配置上下文路径 contextConfigLocation /WEB-INF/spring/spring.xml,/WEB-INF/spring/spring-*.xml 说明:如果有很多的关于spring的配置文件,建议分开写,比如事务一个文件(spring-transaction.xml),springmvc-hibernate.xml一个配置文件,这样方便读写。

spring的@Transactional注解详细用法

spring的@Transactional注解详细用法 各位读友大家好!你有你的木棉,我有我的文章,为了你的木棉,应读我的文章!若为比翼双飞鸟,定是人间有情人!若读此篇优秀文,必成天上比翼鸟! spring的@Transactional注解详细用法Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API 提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用提供比其他事务API如JTA更简单的编程式事务管理API与spring数据访问抽象的完美集成事务管理方式spring支持编程式事务管理和声明式事务管理两种方式。编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。显然声明式事务管理要优于编程式事务管理,这正是spring

SpringMVC深入总结

一、前言: 大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了。Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀。 官方的下载网址是:https://www.doczj.com/doc/959445652.html,/download(本文使用是的Spring 3.0.5版本) Struts2也是比较优秀的MVC构架,优点非常多比如良好的结构。但这里想说的是缺点,Struts2由于采用了值栈、OGNL表达式、struts2标签库等,会导致应用的性能下降。Struts2的多层拦截器、多实例action性能都很好。可以参考我写的一篇关于Spring MVC与Struts2与Servlet比较的文章https://www.doczj.com/doc/959445652.html,/admin/blogs/698217 Spring3 MVC的优点: 1、Spring3 MVC的学习难度小于Struts2,Struts2用不上的多余功能太多。呵呵,当然这不是决定因素。 2、Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分) 3、Spring3 MVC的灵活是你无法想像的,Spring的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制。 Struts2的众多优点:略... (呵呵,是不是不公平?) 众多文章开篇时总要吹些牛,吸引一下读者的眼球,把读者的胃口调起来,这样大家才有兴趣接着往后看。本文也没能例外。不过保证你看了之后不会后悔定有收获。

spring使用基于注解的AOP事务管理

spring使用基于注解的AOP事务管理 16.6 AOP事务管理 AOP事务管理利用了Spring AOP的基础设施,在大多数情况下,Spring AOP会创建一个JDK代理以拦截方法调用。你可以使用装载时编织以在装载期编织切面,这样就不需要代理了(如果你记不清什么是装载时编织,请参看第6章)。你有两种方式来配置Spring AOP 事务管理,基于注解的配置以及XML配置。 16.6.1 使用基于注解的AOP事务管理 你可以借助于AOP的自动代理,通过注解将事务性行为引入到现有的bean中。让我们以代码清单16-21开始吧,它展示了类DeclarativeTxBankService。 代码清单16-21 DeclarativeTxBankService实现 请注意@Transactional属性,为了让Spring的事务管理基础设施可以利用该属性创建恰当的切入点和通知,我们需要使用AOP的自动代理和注解驱动的事务支持。代码清单16-22展示了与该注解相对应的XML配置。 代码清单16-22 基于注解的事务管理的配置文件

该XML配置文件展示了标准的bankService bean声明,紧跟其后的是 标签。 标签使用@Transactional注解创建恰当的事务管理切面。接下来由通知匹配的bean。 1.探索tx:annotation-driven标签 标签是注解驱动的事务管理支持的核心。表16-3列出了 标签的所有属性。 表16-3 标签的属性 属性说明 transactionManager 指定到现有的PlatformTransaction Manager bean的引用,通知会使用该引用 mode 指定Spring事务管理框架创建通知bean的方式。 可用的值有proxy和aspectj。前者是默认值, 表示通知对象是个JDK代理;后者表示 Spring AOP会使用AspectJ创建代理 order 指定创建的切面的顺序。只要目标对象有多个通知就可以使用该属性 proxy-target-class 该属性如果为true就表示你想要代理目标类而不是bean所实现的所有接口

基于注解的Spring AOP的配置和使用

基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。 AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 我们现在做的一些非业务,如:日志、事务、安全等都会写在业务代码中(也即是说,这些非业务类横切于业务类),但这些代码往往是重复,复制——粘贴式的代码会给程序的维护带来不便,AOP就实现了把这些业务需求与系统需求分开来做。这种解决的方式也称代理机制。 先来了解一下AOP的相关概念,《Spring参考手册》中定义了以下几个AOP的重要概念,结合以上代码分析如下: ?切面(Aspect):官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”,在本例中,“切面”就是类TestAspect所关注的具体行为,例如,AServiceImpl.barA()的调用就是切面TestAspect所关注的行为之一。“切面”在ApplicationContext 中来配置。 ?连接点(Joinpoint):程序执行过程中的某一行为,例如,UserService.get 的调用或者UserService.delete抛出异常等行为。 ?通知(Advice):“切面”对于某个“连接点”所产生的动作,例如,TestAspect 中对com.spring.service包下所有类的方法进行日志记录的动作就是一个Advice。其中,一个“切面”可以包含多个“Advice”,例如ServiceAspect。?切入点(Pointcut):匹配连接点的断言,在AOP中通知和一个切入点表达式关联。例如,TestAspect中的所有通知所关注的连接点,都由切入点表达式execution(* com.spring.service.*.*(..))来决定。 ?目标对象(Target Object):被一个或者多个切面所通知的对象。例如,AServcieImpl和BServiceImpl,当然在实际运行时,Spring AOP采用代理实现,实际AOP操作的是TargetObject的代理对象。 ?AOP代理(AOP Proxy):在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。默认情况下,TargetObject实现了接口时,则采用JDK动态代理,例如,AServiceImpl;反之,采用CGLIB代理,例如,BServiceImpl。 强制使用CGLIB代理需要将 的 proxy-target-class属性设为true。 通知(Advice)类型: ?前置通知(Before advice):在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。ApplicationContext中在 里面使用元素进行声明。例如,TestAspect中的doBefore方法。

Spring注解详解

Spring注解详解 目录 一、注解说明 (2) 1.使用简化配置 (2) 2.使用Bean定义注解 (2) 3.Spring支持以下4种类型的过滤方式: (2) 二、注解介绍 (2) 1.@Controller (3) 2.@Service (3) 3.@Autowired (4) 4.@RequestMapping (4) 5.@RequestParam (5) 6.@ModelAttribute (6) 7.@Cacheable和@CacheFlush (7) 8.@Resource (7) 9.@PostConstruct和@PreDestroy (8) 10.@Repository (8) 11.@Component(不推荐使用) (8) 12.@Scope (8) 13.@SessionAttributes (9) 14.@InitBinder (9) 15.@Required (9) 16.@Qualifier (10)

一、注解说明 1.使用简化配置 将隐式地向Spring容器注册以下4个BeanPostProcessor: AutowiredAnnotationBeanPostProcessor CommonAnnotationBeanPostProcessor PersistenceAnnotationBeanPostProcessor RequiredAnnotationBeanPostProcessor 2.使用Bean定义注解 如果要使注解工作,则必须配置component-scan,实际上不需要再配置annotation-config。base-package属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。还允许定义过滤器将基包下的某些类纳入或排除。 3.Spring支持以下4种类型的过滤方式: 1)注解org.example.SomeAnnotation将所有使用SomeAnnotation注解的类过滤出来 2)类名指定org.example.SomeClass过滤指定的类 3)正则表达式com.kedacom.spring.annotation.web..*通过正则表达式过滤一些类 4)AspectJ表达式org.example..*Service+通过AspectJ表达式过滤一些类 二、注解介绍 注解种类: 1)@Controller 2)@Service 3)@Autowired 4)@RequestMapping 5)@RequestParam 6)@ModelAttribute

2.Spring-mvc框架结构及执行流程

Spring mvc架构及执行流程一、请求处理流程图 二、执行流程说明 三、组件说明

说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc 的三大组件。 需要用户编写的组件有handler、view 四、Spring MVC配置 1、组件扫描器:使用组件扫描器省去在spring容器配置每个controller类,使用 自动扫描标记@controller的配置如下:

2、RequestMappingHandlerMapping:注解处理器映射器,对类中标记@RequestMapping 的方法进行映射,根据RequestMapping定义的url匹配RequestMapping标记的方 法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装 注解描述: @RequestMapping:定义请求url到处理器功能方法的映射 3、RequestMappingHandlerAdapter:注解式处理器适配器,对标记@RequestMapping 的方法进行适配。 从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用 4、:spring mvc 使用自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在spring-mvc.xml 配置文件总使用替代注解处理器和适配器的配置。 5、视图解析器 InternalResourceViewResolver:支持JSP视图解析 viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl 的相关jar 包。此属性可以不设置,默认为JstlView。 prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为:

spring配置和注解开发原理

1、Spring是一个开源、轻量级框架(轻量级是指依赖的东西少) 2、Spring核心控制反转(IoC)和面向切面(AOP)。 ——AOP:面向切面编程,扩展功能时不用修改源代码 ——IOC:创建对象不再是自己new出来,而是交给spring容器管理 3、Spring希望为企业应用提供一站式(one-stopshop)的解决方案。 一站式:从web层到访问数据库层都有相应解决方案。 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 对象的创建交给spring管理(基于配置的方式实现、基于注解的方式实现) IOC底层原理:Xml配置、dom4j解析xml、工厂设计模式、反射 工厂模式:将对象的创建交给工厂,使用时调用工厂方法来获取。A需要B时,不是直接创建B,而是通过C的方法来获取,C的方法用来创建B。 注解方式原理:

Spring整合web框架原理 1、把加载配置文件和创建对象的过程,在服务器启动的时候完成。 2、用监听器实现 Spring注解: ————注解是代码里面的特殊标签,使用注解可以完成一定功能; 注解写法@注解名(属性名称=属性值);注解可以用在类上、方法上、属性上。 注解使用: 1、在对应类上加上注解,标明该类的创建交给spring来管理。

2、开启注解扫描功能,要指明扫描哪些包。 3、如果要为属性注入,则在属性上使用@autowired注解 AOP概念: 面向切面编程,扩展功能而不用修改源代码,采用横向抽取机制,取代了传统的纵向继承。 传统的纵向继承,耦合度太高 AOP底层使用动态代理实现:a. 如果是有接口的情况,使用动态代理创建接口实现类代理对象,b.如果没有接口,使用动态代理创建类的子类的代理对象。

Java Spring各种依赖注入注解的区别

Spring对于Bean的依赖注入,支持多种注解方式: 直观上看起来,@Autowired是Spring提供的注解,其他几个都是JDK本身内建的注解,Spring 对这些注解也进行了支持。但是使用起来这三者到底有什么区别呢?笔者经过方法的测试,发现一些有意思的特性。 区别总结如下: 一、@Autowired有个required属性,可以配置为false,这种情况下如果没有找到对应的bean 是不会抛异常的。@Inject和@Resource没有提供对应的配置,所以必须找到否则会抛异常。 二、@Autowired和@Inject基本是一样的,因为两者都是使用AutowiredAnnotationBeanPostProcessor来处理依赖注入。但是@Resource是个例外,它使用的是CommonAnnotationBeanPostProcessor来处理依赖注入。当然,两者都是BeanPostProcessor。

TIPS Qualified name VS Bean name 在Spring设计中,Qualified name并不等同于Bean name,后者必须是唯一的,但是前者类似于tag或者group的作用,对特定的bean进行分类。可以达到getByTag(group)的效果。对于XML配置的bean,可以通过id属性指定bean name(如果没有指定,默认使用类名首字母小写),通过标签指定qualifier name: 如果是通过注解方式,那么可以通过@Qualifier注解指定qualifier name,通过@Named或者@Component(@Service,@Repository等)的value值指定bean name:

spring MVC配置详解

牧涛 --<-<-<@态度决定一切→_→。。。 ?博客园 ?首页 ?新闻 ?新随笔 ?联系 ?管理 ?订阅 随笔- 171 文章- 3 评论- 79 spring MVC配置详解 现在主流的Web MVC框架除了Struts这个主力外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理。 一、Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar、spring-webmvc.jar、commons-logging.jar、cglib -nodep-2.1_3.jar Hibernate 3.6.8:hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、a ntlr-2.7.6.jar、commons-collections-3.1、dom4j-1.6.1.jar、javassist-3.12.0.G A.jar、jta-1.1.jar、slf4j-api-1.6.1.jar、slf4j-nop-1.6.4.jar、相应数据库的驱动jar 包 SpringMVC是一个基于DispatcherServlet(分发器)的MVC框架,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet负责转发每一个Request请求给相应的Handler,Handler处理以后再返回相应的视图(View)和模型(Model),返回的视图和模型都可以不指定,即可以只返回Model或只返回View或都不返回。 DispatcherServlet是继承自HttpServlet的,既然SpringMVC是基于DispatcherSe rvlet的,那么我们先来配置一下DispatcherServlet,好让它能够管理我们希望它管理的内容。HttpServlet是在web.xml文件中声明的。 spring org.springframework.web.servlet.DispatcherServlet< /servlet-class>