JavaEE开发的颠覆者:Spring Boot实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-02 21:17:07

点击下载

作者:汪云飞

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

JavaEE开发的颠覆者:Spring Boot实战

JavaEE开发的颠覆者:Spring Boot实战试读:

前言

我有将平时工作所悟写成博客以记录的习惯,随着逐渐的积累,终于可以形成目前这样一本实战性的手册。我平时在阅读大量的Spring相关书籍的时候发现:很多书籍对知识的讲解一味求全求深,导致读者很难快速掌握某一项技术,且因为求全求深而忽略了最佳实践,让读者云里雾里,甚至半途而废。

所以本书的每个章节的基本架构都是:点睛+实战。

点睛:用最简练的语言去描述当前的技术;

实战:对当前技术进行实战意义的代码演示。

本书代码的另一个特点是:技术相关,业务不相关。在本书的实战例子中不会假设一个业务需求,然后让读者既要理解技术,又要理解假设的业务,本书的目标是让读者“学习时只关注技术,开发时只关注业务”。

本书涉及的技术比较广,尤其是第三部分:实战Spring Boot,这让我很难在一本书中对每一项技术细节都详细说明;我希望本书能为读者在相关技术应用上抛砖引玉,读者在遇到特定技术的问题时可以去学习特定技术的相关书籍。

Spring在Java EE开发中是实际意义上的标准,但我们在开发Spring的时候可能会遇到以下让人头疼的问题:(1)大量配置文件的定义;(2)与第三方软件整合的技术问题。

Spring每个新版本的推出都以减少配置作为自己的主要目标,例如:(1)推出@Component、@Service、@Repository、@Controller注解在类上声明Bean;(2)推出@Configuration、@Bean的Java配置来替代xml配置。

在脚本语言和敏捷开发大行其道的时代,Java EE的开发显得尤为笨重,让人误解Java EE开发就该如此。Spring在提升Java EE开发效率的脚步上从未停止过,而Spring Boot的推出是具有颠覆和划时代意义的。Spring Boot具有以下特征:(1)遵循“习惯优于配置”原则,使用Spring Boot只需很少的配置,大部分时候可以使用默认配置;(2)项目快速搭建,可无配置整合第三方框架;(3)可完全不使用xml配置,只使用自动配置和Java Config;(4)内嵌Servlet(如Tomcat)容器,应用可用jar包运行(java–jar);(5)运行中应用状态的监控。

虽然Spring Boot给我们带来了类似于脚本语言开发的效率,但Spring Boot里没有使用任何让你意外的技术,完全是一个单纯的基于Spring的应用。如Spring Boot的自动配置是通过Spring 4.x的@Conditional注解来实现的,所以在学习Spring Boot之前,我们需要快速学习Spring与Spring MVC的基础知识。

第一部分:点睛Spring 4.x

快速学习Spring 4.x的各个知识点,包括基础配置、常用配置以及高级配置,以便熟悉常用配置,并体会使用Java语法配置所带来的便捷。

第二部分:点睛Spring MVC 4.x

快速学习Spring MVC 4.1的各个知识点,MVC的开发是我们日常开发工作中最常打交道的,所以学习Spring MVC对Spring Boot的使用极有帮助。

第三部分:实战Spring Boot

这部分是整本书的核心部分,每个章节都会通过讲解和实战的例子来演示Spring Boot在实际项目中遇到的方方面面的情况,真正达到让Spring Boot成为Java EE开发的实际解决方案。

Spring Boot发布于2014年4月,根据知名博主Baeldung的调查,截至2014年年底,使用Spring Boot作为Spring开发方案的已有34.1%,这是多么惊人的速度。

希望读者在阅读完本书后,能够快速替代现有的开发方式,使用Spring Boot进行重构,和大量配置与整合开发说再见!

本书是我的第一本技术书籍,主要目的是让读者快速上手Spring Boot这项颠覆性的Java EE开发技术,由于作者水平有限,书中纰漏之处在所难免,敬请读者批评指正。第一部分点睛Spring 4.x第1章Spring基础

做Java开发的程序员都知道Spring的大名,市面上关于Spring的书籍也是汗牛充栋。本书介绍的Spring 4.x不是对Spring知识点的全面讲解,而是将工作中常用的Spring相关的知识点罗列出来,以点睛的形式(快速讲解+示例)让读者快速掌握Spring在开发中的常用知识。1.1 Spring概述1.1.1 Spring的简史

Spring的历史网上有很多介绍,下面讲下我亲历的Spring发展的过程。

第一阶段:xml配置

在Spring 1.x时代,使用Spring开发满眼都是xml配置的Bean,随着项目的扩大,我们需要把xml配置文件分放到不同的配置文件里,那时候需要频繁地在开发的类和配置文件之间切换。

第二阶段:注解配置

在Spring 2.x时代,随着JDK 1.5带来的注解支持,Spring提供了声明Bean的注解(如@Component、@Service),大大减少了配置量。这时Spring圈子里存在着一种争论:注解配置和xml配置究竟哪个更好?我们最终的选择是应用的基本配置(如数据库配置)用xml,业务配置用注解。

第三阶段:Java配置

从Spring 3.x到现在,Spring提供了Java配置的能力,使用Java配置可以让你更理解你配置的Bean。我们目前刚好处于这个时代,Spring 4.x和Spring Boot都推荐使用Java配置,所以我们在本书通篇将使用Java配置。1.1.2 Spring概述

Spring框架是一个轻量级的企业级开发的一站式解决方案。所谓解决方案就是可以基于Spring解决Java EE开发的所有问题。Spring框架主要提供了IoC容器、AOP、数据访问、Web开发、消息、测试等相关技术的支持。

Spring使用简单的POJO(Plain Old Java Object,即无任何限制的普通Java对象)来进行企业级开发。每一个被Spring管理的Java对象都称之为Bean;而Spring提供了一个IoC容器用来初始化对象,解决对象间的依赖管理和对象的使用。

1.Spring的模块

Spring是模块化的,这意味着你可以只使用你需要的Spring的模块。如图1-1所示。图1-1 Spring的模块

图1-1中的每一个最小单元,Spring都至少有一个对应的jar包。(1)核心容器(Core Container)

Spring-Core:核心工具类,Spring其他模块大量使用Spring-Core;

Spring-Beans:Spring定义Bean的支持;

Spring-Context:运行时Spring容器;

Spring-Context-Support:Spring容器对第三方包的集成支持;

Spring-Expression:使用表达式语言在运行时查询和操作对象。(2)AOP

Spring-AOP:基于代理的AOP支持;

Spring-Aspects:基于AspectJ的AOP支持。(3)消息(Messaging)

Spring-Messaging:对消息架构和协议的支持。(4)Web

Spring-Web:提供基础的Web集成的功能,在Web项目中提供Spring的容器;

Spring-Webmvc:提供基于Servlet的Spring MVC;

Spring-WebSocket:提供WebSocket功能;

Spring-Webmvc-Portlet:提供Portlet环境支持。(5)数据访问/集成(Data Access/Integration)

Spring-JDBC:提供以JDBC访问数据库的支持;

Spring-TX:提供编程式和声明式的事务支持;

Spring-ORM:提供对对象/关系映射技术的支持;

Spring-OXM:提供对对象/xml映射技术的支持;

Spring-JMS:提供对JMS的支持。

2.Spring的生态

Spring发展到现在已经不仅仅是Spring框架本身的内容,Spring目前提供了大量的基于Spring的项目,可以用来更深入地降低我们的开发难度,提高开发效率。

目前Spring的生态里主要有以下项目,我们可以根据自己项目的需要来选择使用相应的项目。

Spring Boot:使用默认开发配置来实现快速开发。

Spring XD:用来简化大数据应用开发。

Spring Cloud:为分布式系统开发提供工具集。

Spring Data:对主流的关系型和NoSQL数据库的支持。

Spring Integration:通过消息机制对企业集成模式(EIP)的支持。

Spring Batch:简化及优化大量数据的批处理操作。

Spring Security:通过认证和授权保护应用。

Spring HATEOAS:基于HATEOAS原则简化REST服务开发。

Spring Social:与社交网络API(如Facebook、新浪微博等)的集成。

Spring AMQP:对基于AMQP的消息的支持。

Spring Mobile:提供对手机设备检测的功能,给不同的设备返回不同的页面的支持。

Spring for Android:主要提供在Android上消费RESTful API的功能。

Spring Web Flow:基于Spring MVC提供基于向导流程式的Web应用开发。

Spring Web Services:提供了基于协议有限的SOAP/Web服务。

Spring LDAP:简化使用LDAP开发。

Spring Session:提供一个API及实现来管理用户会话信息。1.2 Spring项目快速搭建

讲到项目的搭建,也许有些读者使用的是通过开发工具新建项目,然后将项目所要依赖的第三方jar包复制到下面的类路径下。

我们现在要和这种项目搭建的方式说拜拜了,因为上述搭建方式没有第三方类库的依赖关系,在导入一个特定的jar包时,可能此jar包还依赖于其他的jar包,其他的jar包又依赖于更多的jar包,这也是我们平常遇到的ClassNotFound错误的主要原因。

为了解决上述问题,我们急需引入一个项目构建工具。目前主流的项目构建工具有:Ant、Maven、Gradle等。本书中我们使用Maven作为项目构建工具。1.2.1 Maven简介

Apache Maven是一个软件项目管理工具。基于项目对象模型(Project Object Model,POM)的概念,Maven可用来管理项目的依赖、编译、文档等信息。

使用Maven管理项目时,项目依赖的jar包将不在包含在项目内,而是集中放置在用户目录下的.m2文件夹下。1.2.2 Maven安装

1.下载Maven 根据操作系统下载正确的Maven版本,并解压到任意目录。

Maven下载地址:https://maven.apache.org/download.cgi。

2.配置Maven 在系统属性→高级→环境变量中分别配置M2_HOME和Path,如图1-2所示。图1-2 配置M2_HOME和Path

3.测试安装

在控制台输入“mvn–v”,获得如图1-3所示信息表示安装成功。图1-3 安装成功1.2.3 Maven的pom.xml

Maven是基于项目对象模型的概念运作的,所以Maven的项目都有一个pom.xml用来管理项目的依赖以及项目的编译等功能。

在我们的项目中,我们主要关注下面的元素。

1.dependencies元素

,此元素包含多个项目依赖需要使用的

2.dependency元素

内部通过groupId、artifactId以及version确定唯一的依赖,有人称这三个为坐标,代码如下。

groupId:组织的唯一标识。

artifactId:项目的唯一标识。

version:项目的版本。 org.springframework spring-webmvc 4.1.5.RELEASE

3.变量定义

变量定义:可定义变量在dependency中引用,代码如下。 4.1.5.RELEASE org.springframework spring-webmvc ${springframework.version}

4.编译插件

Maven提供了编译插件,可在编译插件中涉及Java的编译级别,代码如下。 org.apache.maven.plugins maven-compiler-plugin 2.3.2 1.7 1.7

5.Maven运作方式

Maven会自动根据dependency中的依赖配置,直接通过互联网在Maven中心库下载相关依赖包到.m2目录下,.m2目录下是你本地Maven库。

如果你不知道你所依赖jar包的dependency怎么写的话,推荐到http://mvnrepository.com网站检索。

若Maven中心库中没有你需要的jar包(如Oracle),你需要通过下面的Maven命令打到本地Maven库后应用即可,如安装Oracle驱动到本地库:mvn install:install-file -DgroupId=com.oracle "-DartifactId=ojdbc14" "-Dversion=10.2.0.2.0" "-Dpackaging=jar" "-Dfile=D:\ojdbc14.jar" 1.2.4 Spring项目的搭建

1.基于Spring Tool Suite搭建

Spring Tool Suite(简称STS)是Spring官方推出的基于Eclipse的开发工具,集成了M2E(Maven Integration for Eclipse)、Spring IDE等插件。若习惯于用Eclipse开发项目的话,STS则是开发Spring项目的不二之选。若你当前使用的是常规的Eclipse,请安装M2E插件。STS下载地址:https://spring.io/tools/sts/all。(1)新建Maven项目,如图1-4所示。图1-4 新建Maven项目(2)输出本Maven项目的坐标值,如图1-5所示。(3)在STS中生成如图1-6所示结构的项目。图1-5 输出坐标值图1-6 项目的结构(4)修改pom.xml。增加Spring的依赖,添加编译插件,将编译级别设置为1.7。 4.0.0 com.wisely highlight_spring4 0.0.1-SNAPSHOT 1.7 org.springframework spring-context 4.1.6.RELEASE org.apache.maven.plugins maven-compiler-plugin 2.3.2 ${java.version} ${java.version} (5)更新项目。单击项目右键→Maven→Update Project→highlight-spring4→Maven Dependencies→Spring→expression-4.1.6RELEASE.jar,如图1-7所示。图1-7 更新项目(6)依赖树查看,如图1-8所示。图1-8 依赖树查看

2.基于IntelliJ IDEA搭建

IntelliJ IDEA是Java最优秀的开发工具:功能全面、提示智能、开发不卡顿、新技术支持快。

IntelliJ IDEA分为社区版和商业版,社区版免费,商业版功能强大。商业版提供30天的试用。

IntelliJ IDEA下载地址:https://www.jetbrains.com/idea/download/。(1)新建Maven项目。单击File→New→Project→Maven,如图1-9所示。(2)输入Maven项目坐标值,如图1-10所示。(3)选择存储路径,如图1-11所示。图1-9 新建Maven项目图1-10 输入坐标值图1-11 选择存储路径(4)修改pom.xml文件,使用上例的pom.xml文件内容,IDEA会开启自动导入Maven依赖包功能,如图1-12所示。图1-12 开启自动导入Maven功能(5)依赖树查看,如图1-13所示。图1-13 依赖树查看

3.基于NetBeans搭建

NetBeans是Oracle官方推出的Java开发工具,下载地址如下:https://netbeans.org/downloads/。(1)新建Maven项目,如图1-14所示。图1-14 新建Maven项目(2)输入Maven坐标,如图1-15所示。图1-15 输入Maven坐标(3)更新pom.xml,如图1-16所示。图1-16 更新pom.xml(4)依赖树查看,如图1-17所示。图1-17 依赖树查看1.3 Spring基础配置

Spring框架本身有四大原则:

1)使用POJO进行轻量级和最小侵入式开发。

2)通过依赖注入和基于接口编程实现松耦合。

3)通过AOP和默认习惯进行声明式编程。

4)使用AOP和模板(template)减少模式化代码。

Spring所有功能的设计和实现都是基于此四大原则的。1.3.1 依赖注入

1.点睛

我们经常说的控制翻转(Inversion of Control-IOC)和依赖注入(dependency injection-DI)在Spring环境下是等同的概念,控制翻转是通过依赖注入实现的。所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系,而不是通过对象本身负责自己的创建和解决自己的依赖。

依赖注入的主要目的是为了解耦,体现了一种“组合”的理念。如果你希望你的类具备某项功能的时候,是继承自一个具有此功能的父类好呢?还是组合另外一个具有这个功能的类好呢?答案是不言而喻的,继承一个父类,子类将与父类耦合,组合另外一个类则使耦合度大大降低。

Spring IoC容器(ApplicationContext)负责创建Bean,并通过容器将功能类Bean注入到你需要的Bean中。Spring提供使用xml、注解、Java配置、groovy配置实现Bean的创建和注入。

无论是xml配置、注解配置还是Java配置,都被称为配置元数据,所谓元数据即描述数据的数据。元数据本身不具备任何可执行的能力,只能通过外界代码来对这些元数据行解析后进行一些有意义操作。Spring容器解析这些配置元数据进行Bean初始化、配置和管理依赖。

声明Bean的注解:● @Component组件,没有明确的角色。● @Service在业务逻辑层(service层)使用。● @Repository在数据访问层(dao层)使用。● @Controller在展现层(MVC→Spring MVC)使用。

注入Bean的注解,一般情况下通用。● @Autowired:Spring提供的注解。● @Inject:JSR-330提供的注解。● @Resource:JSR-250提供的注解。

@Autowired、@Inject、@Resource可注解在set方法上或者属性上,笔者习惯注解在属性上,优点是代码更少、层次更清晰。

在本节演示基于注解的Bean的初始化和依赖注入,Spring容器类选用AnnotationConfigApplicationContext。

2.示例(1)编写功能类的Bean。package com.wisely.highlight_spring4.ch1.di; import org.springframework.stereotype.Service; @Service //1 public class FunctionService { public String sayHello(String word){ return "Hello " + word +" !"; } }

代码解释

①使用@Service注解声明当前FunctionService类是Spring管理的一个Bean。其中,使用@Component、@Service、@Repository和@Controller是等效的,可根据需要选用。(2)使用功能类的Bean。package com.wisely.highlight_spring4.ch1.di; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service //1 public class UseFunctionService { @Autowired //2 FunctionService functionService; public String SayHello(String word){ return functionService.sayHello(word); } }

代码解释

①使用@Service注解声明当前UseFunctionService类是Spring管理的一个Bean。

②使用@Autowired将FunctionService的实体Bean注入到UseFunctionService中,让UseFunctionService具备FunctionService的功能,此处使用JSR-330的@Inject注解或者JSR-250的@Resource注解是等效的。(3)配置类。package com.wisely.highlight_spring4.ch1.di; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration //1 @ComponentScan("com.wisely.highlight_spring4.ch1.di") //2 public class DiConfig { }

代码解释

①@Configuration声明当前类是一个配置类,在后面1.3.2节的Java配置中有更详细的说明;

②使用@ComponentScan,自动扫描包名下所有使用@Service、@Component、@Repository和@Controller的类,并注册为Bean。(4)运行。package com.wisely.highlight_spring4.ch1.di; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DiConfig.class); //1 UseFunctionService useFunctionService = context.getBean(UseFunctionService.class); //2 System.out.println(useFunctionService.SayHello("di")); context.close(); } }

代码解释

①使用AnnotationConfigApplicationContext作为Spring容器,接受输入一个配置类作为参数;

②获得声明配置的UseFunctionService的Bean。

结果如图1-18所示。图1-18 运行结果1.3.2 Java配置

1.点睛

Java配置是Spring 4.x推荐的配置方式,可以完全替代xml配置;Java配置也是Spring Boot推荐的配置方式。

Java配置是通过@Configuration和@Bean来实现的。● @Configuration声明当前类是一个配置类,相当于一个Spring配

置的xml文件。● @Bean注解在方法上,声明当前方法的返回值为一个Bean。

本书通篇使用Java配置和注解混合配置。何时使用Java配置或者注解配置呢?我们主要的原则是:全局配置使用Java配置(如数据库相关配置、MVC相关配置),业务Bean的配置使用注解配置(@Service、@Component、@Repository、@Controlle)。

本节只演示简单的Java配置,全书各个章节都会有大量的Java配置的内容。

2.示例(1)编写功能类的Bean。package com.wisely.highlight_spring4.ch1.javaconfig; //1 public class FunctionService { public String sayHello(String word){ return "Hello " + word +" !"; } }

代码解释

①此处没有使用@Service声明Bean。(2)使用功能类的Bean。package com.wisely.highlight_spring4.ch1.javaconfig; import com.wisely.highlight_spring4.ch1.javaconfig.FunctionService; //1 public class UseFunctionService { //2 FunctionService functionService; public void setFunctionService(FunctionService functionService) { this.functionService = functionService; } public String SayHello(String word){ return functionService.sayHello(word); } }

代码解释

①此处没有使用@Service声明Bean。

②此处没有使用@Autowired注解注入Bean。(3)配置类。package com.wisely.highlight_spring4.ch1.javaconfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration //1 public class JavaConfig { @Bean //2 public FunctionService functionService(){ return new FunctionService(); } @Bean public UseFunctionService useFunctionService(){ UseFunctionService useFunctionService = new UseFunctionService(); useFunctionService.setFunctionService(functionService());//3 return useFunctionService; } // @Bean // public UseFunctionService useFunctionService(FunctionService functionService){ //4 // UseFunctionService useFunctionService = new UseFunctionService(); // useFunctionService.setFunctionService(functionService); // return useFunctionService; // } }

代码解释

①使用@Configuration注解表明当前类是一个配置类,这意味着这个类里可能有0个或者多个@Bean注解,此处没有使用包扫描,是因为所有的Bean都在此类中定义了。

②使用@Bean注解声明当前方法FunctionService的返回值是一个Bean,Bean的名称是方法名。

③注入FunctionService的Bean时候直接调用functionService()。

④另外一种注入的方式,直接将FunctionService作为参数给useFunctionService(),这也是Spring容器提供的极好的功能。在Spring容器中,只要容器中存在某个Bean,就可以在另外一个Bean的声明方法的参数中写入。(4)运行。package com.wisely.highlight_spring4.ch1.javaconfig; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class); UseFunctionService useFunctionService = context.getBean(UseFunctionService.class); System.out.println(useFunctionService.SayHello("java config")); context.close(); } }

结果如图1-19所示。图1-19 运行结果1.3.3 AOP

1.点睛

AOP:面向切面编程,相对于OOP面向对象编程。

Spring的AOP的存在目的是为了解耦。AOP可以让一组类共享相同的行为。在OOP中只能通过继承类和实现接口,来使代码的耦合度增强,且类继承只能为单继承,阻碍更多行为添加到一组类上,AOP弥补了OOP的不足。

Spring支持AspectJ的注解式切面编程。(1)使用@Aspect声明是一个切面。(2)使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。(3)其中@After、@Before、@Around参数的拦截规则为切点(PointCut),为了使切点复用,可使用@PointCut专门定义拦截规则,然后在@After、@Before、@Around的参数中调用。(4)其中符合条件的每一个被拦截处为连接点(JoinPoint)。

本节示例将演示基于注解拦截和基于方法规则拦截两种方式,演示一种模拟记录操作的日志系统的实现。其中注解式拦截能够很好地控制要拦截的粒度和获得更丰富的信息,Spring本身在事务处理(@Transcational)和数据缓存(@Cacheable等)上面都使用此种形式的拦截。

2.示例(1)添加spring aop支持及AspectJ依赖。 org.springframework spring-aop 4.1.6.RELEASE org.aspectj aspectjrt 1.8.5 org.aspectj aspectjweaver 1.8.5 (2)编写拦截规则的注解。package com.wisely.highlight_spring4.ch1.aop; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Action { String name(); }

代码解释

这里讲下注解,注解本身是没有功能的,就和xml一样。注解和xml都是一种元数据,元数据即解释数据的数据,这就是所谓配置。

注解的功能来自用这个注解的地方。(3)编写使用注解的被拦截类。package com.wisely.highlight_spring4.ch1.aop; import org.springframework.stereotype.Service; @Service public class DemoAnnotationService { @Action(name="注解式拦截的add操作") public void add(){} } (4)编写使用方法规则被拦截类。package com.wisely.highlight_spring4.ch1.aop; import org.springframework.stereotype.Service; @Service public class DemoMethodService { public void add(){} } (5)编写切面。package com.wisely.highlight_spring4.ch1.aop; import java.lang.reflect.Method; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; @Aspect //1 @Component //2 public class LogAspect { @Pointcut("@annotation(com.wisely.highlight_spring4.ch1.aop.Action)") //3 public void annotationPointCut(){}; @After("annotationPointCut()") //4 public void after(JoinPoint joinPoint) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); Action action = method.getAnnotation(Action.class); System.out.println("注解式拦截 " + action.name()); //5 } @Before("execution(* com.wisely.highlight_spring4.ch1.aop.DemoMethodService.*(..))") //6 public void before(JoinPoint joinPoint){ MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); System.out.println("方法规则式拦截,"+method.getName()); } }

代码解释

①通过@Aspect注解声明一个切面。

②通过@Component让此切面成为Spring容器管理的Bean。

③通过@PointCut注解声明切点。

④通过@After注解声明一个建言,并使用@PointCut定义的切点。

⑤通过反射可获得注解上的属性,然后做日志记录相关的操作,下面的相同。

⑥通过@Before注解声明一个建言,此建言直接使用拦截规则作为参数。(6)配置类。package com.wisely.highlight_spring4.ch1.aop; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; @Configuration @ComponentScan("com.wisely.highlight_spring4.ch1.aop") @EnableAspectJAutoProxy //1 public class AopConfig { }

代码解释

①使用@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持。(7)运行。package com.wisely.highlight_spring4.ch1.aop; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class); //1 DemoAnnotationService demoAnnotationService = context.getBean(DemoAnnotationService.class); DemoMethodService demoMethodService = context.getBean(DemoMethodService.class); demoAnnotationService.add(); demoMethodService.add(); context.close(); } }

结果如图1-20所示。图1-20 运行结果第2章Spring常用配置2.1 Bean的Scope2.1.1 点睛

Scope描述的是Spring容器如何新建Bean的实例的。Spring的Scope有以下几种,通过@Scope注解来实现。(1)Singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例。(2)Prototype:每次调用新建一个Bean的实例。(3)Request:Web项目中,给每一个http request新建一个Bean实例。(4)Session:Web项目中,给每一个http session新建一个Bean实例。(5)GlobalSession:这个只在portal应用中有用,给每一个global http session新建一个Bean实例。

另外,在Spring Batch中还有一个Scope是使用@StepScope,我们将在批处理一节介绍这个Scope。

本例简单演示默认的singleton和Prototype,分别从Spring容器中获得2次Bean,判断Bean的实例是否相等。2.1.2 示例(1)编写Singleton的Bean。package com.wisely.highlight_spring4.ch2.scope; import org.springframework.stereotype.Service; @Service //1 public class DemoSingletonService { }

代码解释

①默认为Singleton,相当于@Scope(“singleton”)。(2)编写Prototype的Bean。package com.wisely.highlight_spring4.ch2.scope; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; @Service @Scope("prototype")//1 public class DemoPrototypeService { }

代码解释

①声明Scope为Prototype。(3)配置类。package com.wisely.highlight_spring4.ch2.scope; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan("com.wisely.highlight_spring4.ch2.scope") public class ScopeConfig { } (4)运行。package com.wisely.highlight_spring4.ch2.scope; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ScopeConfig.class); DemoSingletonService s1 = context.getBean(DemoSingletonService.class); DemoSingletonService s2 = context.getBean(DemoSingletonService.class); DemoPrototypeService p1 = context.getBean(DemoPrototypeService.class); DemoPrototypeService p2 = context.getBean(DemoPrototypeService.class); System.out.println("s1与s2是否相等:"+s1.equals(s2)); System.out.println("p1与p2是否相等:"+p1.equals(p2)); context.close(); } }

结果如图2-1所示。图2-1 运行结果2.2 Spring EL和资源调用2.2.1 点睛

Spring EL-Spring表达式语言,支持在xml和注解中使用表达式,类似于JSP的EL表达式语言。

Spring开发中经常涉及调用各种资源的情况,包含普通文件、网址、配置文件、系统环境变量等,我们可以使用Spring的表达式语言实现资源的注入。

Spring主要在注解@Value的参数中使用表达式。

本节演示实现以下几种情况:(1)注入普通字符;(2)注入操作系统属性;(3)注入表达式运算结果;(4)注入其他Bean的属性;(5)注入文件内容;(6)注入网址内容;(7)注入属性文件。2.2.2 示例(1)准备,增加commons-io可简化文件相关操作,本例中使用commons-io将file转换成字符串: commons-io commons-io 2.3

在com.wisely.highlight_spring4.ch2.el包下新建test.txt,内容随意。

在com.wisely.highlight_spring4.ch2.el包下新建test.properties,内容如下:book.author=wangyunfei book.name=spring boot (2)需被注入的Bean。package com.wisely.highlight_spring4.ch2.el; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service public class DemoService {

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载