基于新信息技术的Java-EE应用开发实训教程课件:Spring注解_第1页
基于新信息技术的Java-EE应用开发实训教程课件:Spring注解_第2页
基于新信息技术的Java-EE应用开发实训教程课件:Spring注解_第3页
基于新信息技术的Java-EE应用开发实训教程课件:Spring注解_第4页
基于新信息技术的Java-EE应用开发实训教程课件:Spring注解_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.1使用注解配置IoC3.2使用AspectJ配置AOP3.3使用Spring表达式语言3.1使用注解配置IoC3.1.1使用注解定义Bean采用XML方式配置Bean的时候,Bean的定义信息和实现是分离的,若采用注解的方式则可以把两者合为一体,让Bean的定义信息直接以标注的形式定义在实现类中,从而达到零配置的目的。比如,对于如下的一个Bean类:publicclassUserDAOImplimplementsIUserDAO{@Overridepublicvoidinsert(Userp){ UserRepository.insert(p);}@OverridepublicList<User>findAll(){ returnUserRepository.findAll();}}在XML中采用如下配置:<beanid="userDAO"class="com.ssoft.anno.dao.impl.UserDAOImpl"/>换成使用标注则是:@Component("userDAO")publicclassUserDAOImplimplementsIUserDAO{…}在类的开头使用@Component标注可以被Spring容器识别,启动Spring后,会自动把它转成容器管理的Bean。除了@Component外,Spring提供了3个功能基本和@Component等效的注解,分别对DAO、Service和Controller进行注解。①@Repository用于对DAO实现类进行标注。②@Service用于对业务层标注,但是目前该功能与@Component相同。③@Constroller用于对控制层标注,但是目前该功能与@Component相同。通过在类上使用@Repository、@Service和@Constroller注解,Spring会自动创建相应的BeanDefinition对象,并注册到ApplicationContext中。这些类就成了Spring受管组件。这3个注解除了作用于不同软件层次的类外,使用方式与@Component完全相同。以上3个典型注解的示例如下:控制层(Constroller):@Controller("testAction")publicclassTestAction{publicStringexecute()throwsException{return"success";}}业务层(Service):@Service("userBO")publicclassUserBO{publicvoidinsert(Userp){}publicList<User>findAll(){returnnull;}}持久层(DAO):@Component("userDAO")publicclassUserDAOImplimplementsIUserDAO{@Override publicvoidinsert(Userp){UserRepository.insert(p);}@OverridepublicList<User>findAll(){returnUserRepository.findAll();}}3.1.2使用注解配置信息文件Spring2.5以后提供了一个Context命名空间,设有如下代码:<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"

xmlns:p="/schema/p"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd"><!--自动扫描--><context:component-scanbase-package="com.ssoft.anno"/></beans>增加了Context命名空间之后,就可以通过<context>标记指定需要扫描的包。启动Spring容器后,Spring会根据该包中的注解信息自动产生容器管理的Bean。<context>标记还可以使用resource-pattern属性,对指定的基包下面的子包进行选取,比如:<!--自动扫描--><context:component-scanbase-package="com.ssoft.anno"resource-pattern="bo/*.class"/>上述配置表示只对com.ssoft.anno.bo中的类进行扫描。对于更复杂的需要,可以通过<context>的过滤子标签<context:include-filter>和<context:exclude-filter>按需要进行选择,例如:<context:component-scanbase-package="com.ssoft.anno"><context:include-filtertype="aspectj"expression="com.ssoft.anno.dao.*.*"/><context:exclude-filtertype="aspectj"expression="com.ssoft.anno.entity.*.*"/></context:component-scan><context:include-filter>表示需要包含的目标类,<context:exclude-filter>表示需要排除的目标类。在这两个过滤标签中,type属性表示采用什么样的类型过滤,expression则是过滤的表达式,Spring3.X版本中支持5种类型表达式,如表3-1所示。3.1.3使用注解实现依赖注入使用注解标注Bean后可被容器管理,同样,也可以使用标注实现依赖注入。(1)使用@Autowired实现自动注入。使用了该标注后,@Autowired默认会按照类型匹配的模式,在容器中查找匹配的Bean进行注入,比如:@Service("userBO")publicclassUserBO{@AutowiredIUserDAOuserDAO;…………}在UserBO中定义了一个userDAO的属性,Spring会自动在容器内查找名称为userDAO的Bean,然后把它注入UserBO。@Autowired标注有一个required属性,默认为true,表示容器中必须要有一个Bean的名称和它所标注的属性名称一致,如果找不到则会抛出异常。如果设置为false,则即使找不到也不会抛出异常。(2)使用@Qualifier标注指定注入Bean的名称,Spring会在容器中查找指定名称的Bean进行注入,比如:@Service("userBO")publicclassUserBO{@Qualifier("userDAO")IUserDAOuserDAO;…………}以上两种方式是Spring本身提供的注解,此外,Java本身也提供了两个注解完成类似@Autowired的功能,一个是@Resource,另一个是@Inject。@Resource按名称匹配注入Bean,而@Inject则按照类型匹配进行注入,比如:@Service("userBO")publicclassUserBO{@Resource(name="userDAO")IUserDAOuserDAO;…………}两种类型标注都可以实现依赖注入,这样大大减少了XML的配置工作量,但是,只有JDK1.5以上的版本才可以使用标注。Spring陆续提供了十多个注解,但是这些注解的作用只是为了在某些情况下可以简化XML配置,并非要取代XML配置方式,实际应用中可以根据具体的需要选择采用XML配置的方式或者标注的方式。3.2使用AspectJ配置AOP3.2.1使用前准备Spring2.X版本开始支持在它的AOP框架中使用以AspectJ注解编写的POJO切面。在使用AspectJ之前首先必须保证JDK的版本是5.0以上,此外还需要导入Spring中asm模块以及AspectJ相关的jar包。3.2.2配置AOP以下是一个简单例子:@Component@AspectpublicclassPreAspect{@Before("execution(*com.ssoft.anno.service.*.*(..))")publicvoidbeforeAdvice(){System.out.println("Hello~~!");}}本例中使用了3个标注对象,一个是@Component,表明该类的实例会被Spring管理;一个是@Aspect,表明通过该类定义了一个切面;最后一个是@Before,这个注解有两层含义,第一是定义了通知的类型,第二是通过AspectJ表达式定义了一个切点。@Before定义在beforeAdvice方法前,beforeAdvice方法就是需要做的横切逻辑。以上整个类的描述如果使用XML配置来定义则等同于以下配置:<!--使用aop配置--><beanid="preAspect"class="com.ssoft.anno.aspect.PreAspect"/><aop:configproxy-target-class="true"><!--配置切面--><aop:aspectref="preAspect"><!--配置切点--><aop:pointcutexpression="execution(*com.ssoft.anno.service.*.*(..))"id="pt1"/><aop:beforemethod="beforeAdvice"pointcut-ref="pt1"/></aop:aspect></aop:config>要给这个应用程序启用AspectJ注解,只要在Bean配置文件中定义一个空的XML元素<aop:aspectj-autoproxy>就行了。此外,必须将AOPSchema定义添加到<beans>根元素中。当SpringIoC容器侦测到Bean配置文件中的<aop:aspectj-autoproxy>元素时,会自动为与AspectJ切面匹配的Bean创建代理。beans.xml配置的代码如下:<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xmlns:p="/schema/p"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd

/schema/context/schema/context/spring-context-3.0.xsd/schema/aop/schema/aop/spring-aop-3.0.xsd"><!--自动扫描--><context:component-scanbase-package="com.ssoft.anno"/><!--AOP--><aop:aspectj-autoproxy/></beans>注意粗体字部分添加了Spring对AOP的支持。Spring的AOP注解中使用了大量的AspectJ函数表达式定义函数切点。3.2.3AspectJ基础@AspectJ使用AspectJ专门的切点表达式描述切面,但由于Spring本身只支持方法级别的连接点,所以在Spring中只支持部分的AspectJ的语法。本章节只学习Spring支持的切点语法。AspectJ的切点函数是函数名(函数参数)的形式。在AspectJ中有很多切点表达式函数,但目前Spring仅支持9种常用的语法,它们用不同的方式描述目标类的连接点。根据描述对象的不同,AspectJ表达式函数大致可分为以下4类:①方法切点函数:通过描述目标类方法信息定义连接点。②方法参数切点函数:通过描述目标类方法参数信息定义连接点。③目标类切点函数:通过描述目标类类型信息定义连接点。④代理类切点函数:通过描述代理类信息定义连接点。AspectJ支持的通配符如下:*:匹配任何数量字符。..:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包,而在方法参数模式中匹配任何数量参数。+:匹配指定类型的子类型,仅能作为后缀放在类型模式后边。切点函数之间还可以使用逻辑运算符进行连接。AspectJ使用且(&&)、或(||)、非(!)来组合切入点表达式。在XML中使用“&&”时需要用转义字符“&&”来代替,这样很不方便,所以SpringASP提供了and、or、not来代替&&、||、!。3.2.4AspectJ注解类在AspectJ注解中,切面只是一个带有@Aspect注解的Java类。通知是标注有某种通知注解的简单的Java方法。AspectJ支持6种类型的通知注解:@Before、@After、@AfterReturning、@AfterThrowing、@Around和@DeclareParents,这些注解只能用于方法类。以下是每种注解类对应的通知。(1)前置通知:该通知处理将会在目标方法调用前被织入,使用org.aspectj.lang.annotation包下的@Before注解声明。使用方式:@Before(value="切入点表达式或命名切入点",argNames="参数列表参数名")其中,value指定切入点表达式或命名切入点,可省略;argNames指定参数列表参数名,可以用多个“,”分隔,可省略。例如:@Aspect@ComponentpublicclassPreAspect1{@Before(value="within(com.ssoft.anno.service.UserBO)&&args(u)",argNames="u")publicvoidtest(Useru){System.out.println(u); }}(2)后置返回通知:该通知处理将会在目标方法正常完成后被织入,使用org.aspectj.lang.annotation包下的@AfterReturning注解声明。使用方式:@AfterReturning(value="切入点表达式或命名切入点",pointcut="切入点表达式或命名切入点",argNames="参数列表参数名",returning="返回值对应参数名")其中,value指定切入点表达式或命名切入点;pointcut同样是指定切入点表达式或命名切入点,如果该属性值存在则覆盖value属性值(pointcut具有高优先级);argNames指定参数列表参数名,可以用多个“,”分隔,可省略;returning将目标对象返回值返回给通知的方法。(3)后置返回异常通知:该通知处理在一个方法抛出异常后执行,使用org.aspectj.lang.annotation包下的@AfterThrowing注解声明。使用方式:@AfterThrowing(value="切入点表达式或命名切入点",pointcut="切入点表达式或命名切入点",argNames="参数列表参数名",throwing="异常对应参数名")其中,value指定切入点表达式或命名切入点;pointcut同样是指定切入点表达式或命名切入点,如果该属性值存在则覆盖value属性值(pointcut具有高优先级);argNames同“前置通知”;throwing抛出的异常将传递到通知方法中。(4)后置最终通知:该通知在一个方法结束后执行(无论正常返回还是异常返回都会执行该通知),使用org.aspectj.lang.annotation包下的@After注解声明。使用方式:@After(value="切入点表达式或命名切入点",argNames="参数列表参数名")其中,value指定切入点表达式或命名切入点;argNames同“前置通知”。(5)环绕通知:Around增强处理既可以在执行目标方法之前织入增强处理,也可以在执行目标方法之后织入增强动作。同时,Around增强处理还可以决定目标方法在什么时候执行、如何执行甚至可以完全阻止目标方法的执行。Around增强处理可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值。当定义一个Around增强处理方法时,该方法的第一个形参必须是ProceedingJoinPoint类型,并只有调用ProceedingJoinPoint的proceed()方法才会执行目标方法。环绕通知使用org.aspectj.lang.annotation包下的@Around注解声明。使用方式:@Around(value="切入点表达式或命名切入点",argNames="参数列表参数名")其中,value指定切入点表达式或命名切入点;argNames同“前置通知”。3.3使用Spring表达式语言3.3.1简介Spring表达式语言(SpEL)从3.X开始支持,它是一种能够支持运行时查询和操作对象图的强大的表达式,其表达式语法类似于统一表达式语言。一般,表达式语言会用最简单的形式完成最主要的工作,以减少开发者的工作量。SpEL支持如下表达式:(1)基本表达式:字面量表达式、逻辑与算术运算表达式、字符串连接及截取表达式、三目运算、正则表达式、括号优先级表达式。(2)类相关表达式:类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用。(3)集合相关表达式:内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持多维内联数组初始化,不支持内联字典定义。(4)其他表达式:模板表达式。3.3.2基本用法在使用SpEL之前需要准备org.springframework.expression-3.X.RELEASE.jar包,在使用SpEL表达式的时候一般分为4个步骤,首先构造一个解析器,其次解析器解析字符串表达式,随后构造上下文,最后根据上下文得到表达式运算后的值。比如以下简单基本算数表达式://创建解析器ExpressionParserp=newSpelExpressionParser();//创建解析表达式Expressione=p.parseExpression("(1+2)*100-60");//获取结果Objecto=e.getValue();System.out.println(o);以下是SpEL的基本语言参考:文字表达式:支持的文字表达类型有字符串、日期、数值(整型、实型和十六进制)、布尔类型和空。其中字符表达式可用单引号表示,如'Helloworld'。若表达式中含有单引号或双引号字符,则可使用转义字符/。Properties,Arrays,Lists,Maps,Indexers:引用对象属性,只需使用一个句点来表示一个嵌套的属性值,例如:ExpressionParserep=newSpelExpressionParser(); Useru=newUser("Tom");Userm=newUser("Merry");//创建上下文变量EvaluationContextctx=newStandardEvaluationContext();//设置一个名叫u的变量ctx.setVariable("u",u);ctx.setVariable("arrs",newString[]{"Tom","Mike","Tony"});//测试集合List<String>list=newArrayList<String>();list.addAll(Arrays.asList("China","American","England"));ctx.setVariable("list",list);//测试MapMap<String,User>maps=newHashMap<String,User>();maps.put("Tom",u);maps.put("Merry",m);ctx.setVariable("us",maps);System.out.println(ep.parseExpression("#").getValue(ctx));System.out.println(ep.parseExpression("#arrs[0]").getValue(ctx));System.out.println(ep.parseExpression("#list[0]").getValue(ctx));System.out.println(ep.parseExpression("#us['Tom'].name").getValue(ctx));此处创建了一个上下文环境StandardEvaluationContext的实例。通过setVariable方法设置变量,如setVariable("u",u),然后在SpEL表达式中使用#符号引用该变量,然后通过“.”符号引用该变量属性。方法:采用典型的Java编程语法来调用,支持可变参数。关系操作符:支持使用标准的操作符号,即等于号、不等于号、小于号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论