
Java工程师,努力学习中(前端+后端)
1.点睛在2.4节学到,通过活动的profile,我们可以获得不同的Bean。Spring4提供了一个更通用的基于条件的Bean的创建,即使用@Conditional注解。@Conditional根据满足某一个特定条件创建一个特定的Bean。比方说,当某一个jar包在一个类路径下的时候,自动配置一个或多个Bean;或者只有某个Bean被创建才会创建另外一个Bean。总的来说,就是根据特定条件来控制Bean的创建行为,这样我们可以利用这个特性进行一些自动的配置。在Spring Boot中将会大量应用到条件注解,更多内容见6.1节。下面的示例将以不同的操作系统作为条件,我们将通过实现Condition接口,并重写其matches方法来构造判断条件。若在Windows系统下运行程序,则输出列表命令为dir;若在Linux操作系统下运行程序,则输出列表命令为ls。2.示例(1)判断条件定义①判断Windows的条件②判断Linux的条件(2)不同系统下Bean的类①接口②Windows下所要创建的Bean的类③Linux下所要创建的Bean的类(3)配置类通过@Conditional注解,符合Windows条件则实例化windowsListService通过@Conditional注解,符合Linux条件则实例化linuxListService(4)运行结果
1.点睛从Spring3.1开始,计划任务在Spring中的实现变得异常的简单。首先通过在配置类注解@EnableScheduling来开启对计划任务的支持,然后在要执行计划任务的方法上注解@Scheduled,声明这是一个计划任务。Spring通过@Scheduled支持多种类型的计划任务,包含cron、fixDelay、fixRate等。//@Scheduled(fixedDelay=ONE_Minute)//@Scheduled(fixedRate=ONE_Minute)//第一位,表示秒,取值0-59//第二位,表示分,取值0-59//第三位,表示小时,取值0-23//第四位,日期天/日,取值1-31//第五位,日期月份,取值1-12//第六位,星期,取值1-7,星期一,星期二...,注:不是第1周,第二周的意思,另外:1表示星期天,2表示星期一//第7位,年份,可以留空,取值1970-2099//(*)星号:可以理解为每的意思,每秒,每分,每天,每月,每年...//(?)问号:问号只能出现在日期和星期这两个位置,表示这个位置的值不确定,每天3点执行,所以第六位星期的位置,我们是不需要关注的,就是不确定的值。同时:日期和星期是两个相互排斥的元素,通过问号来表明不指定值。比如,1月10日,比如是星期1,如果在星期的位置是另指定星期二,就前后冲突矛盾了。//(-)减号:表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12//(,)逗号:表达一个列表值,如在星期字段中使用“1,2,4”,则表示星期一,星期二,星期四//(/)斜杠:如:x/y,x是开始值,y是步长,比如在第一位(秒) 0/15就是,从0秒开始,每15秒,最后就是0,15,30,45,60 另:*/y,等同于0/y2.示例(1)计划任务执行类通过@Scheduled声明该方法是计划任务,使用fixedRate属性每隔固定时间执行。使用cron属性可按照指定时间执行,本例指的是每天11点28分执行;cron是UNIX和类UNIX(Linux)系统下的定时任务。(2)配置类通过@EnableScheduling注解开启对计划任务的支持。(3)运行结果
1.点睛Spring的依赖注入的最大亮点就是你所有的Bean对Spring容器的存在是没有意识的。即你可以将你的容器替换成别的容器,如Google Guice,这时Bean之间的耦合度很低。但是在实际项目中,你不可避免的要用到Spring容器本身的功能资源,这时你的Bean必须意识到Spring容器的存在,才能调用Spring所提供的资源,这就是所谓的Spring Aware。其实Spring Aware本来就是Spring设计用来框架内部使用的,若使用了Spring Aware,你的Bean将会和Spring框架耦合。Spring Aware的目的是为了让Bean获得Spring容器的服务。因为ApplicationContext接口集成了MessageSource接口、ApplicationEventPublisher接口和ResourceLoader接口,所以Bean继承ApplicationContextAware可以获得Spring容器的所有服务,但原则上我们还是用到什么接口,就实现什么接口。2.示例(1)准备。在ch3.aware包下新建一个test.text,内容随意,给下面的外部资源加载使用。(2)Spring Aware演示Bean实现BeanNameAware、ResourceLoaderAware接口,获得Bean名称和资源加载的服务实现ResourceLoaderAware需重写setResourceLoader方法实现BeanNameAware需重写setBeanName方法(3)配置类(4)运行结果
1.点睛Spring的事件(Application Event)为Bean与Bean之间的消息通信提供了支持。当一个Bean处理完一个任务之后,希望另一个Bean知道并能做相应的处理,这时我们就需要让另外一个Bean监听当前Bean所发送的事件。Spring的事件需要遵循如下流程:(1)自定义事件,继承ApplicationEvent(2)定义事件监听器,实现ApplicationListener(3)使用容器发布事件2.示例(1)自定义事件(2)事件监听器实现ApplicationListener接口,并指定监听的事件类型使用onApplicationEvent方法对消息进行接受处理(3)事件发布类注入ApplicationContext用来发布事件使用ApplicationContext的publishEvent方法来发布(4)配置类(5)运行结果:
1.点睛Profile为在不同环境下使用不同的配置提供了支持(开发环境下的配置和生产环境下的配置肯定是不同的,例如,数据库的配置)(1)通过设定Environment的ActiveProfiles来设定当前context需要使用的配置环境。在开发中使用@Profile注解或者方法,达到在不同情况下选择实例化不同的Bean(2)通过设定jvm的spring.profiles.active参数来设置配置环境(3)Web项目设置在Servlet的context parameter中
1.点睛在我们实际开发的时候,经常会遇到在Bean在使用之前或者之后做些必要的操作,Spring对Bean的生命周期的操作提供了支持。在使用Java配置和注解配置下提供如下两种方式:(1)Java配置方式:使用@Bean的initMethod和destroyMethod(相当于xml配置的init-method和destroy-method)(2)注解方式:利用JSR-250的@PostConstruct和@PreDestroy2.演示(1)增加JSR250支持(2)使用@Bean形式的Bean(3)使用JSR250形式的Bean@PostConstruct,在构造函数执行完之后执行。@PreDestroy,在Bean销毁之前执行。(4)配置类initMethod和destroyMethod指定BeanWayService类的init和destroy方法在构造之后、Bean销毁之前执行。(5)运行结果:
一、简介1.AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制、异常处理等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。2.概念Aspect(切面)Joinpoint(连接点):指那些被拦截到的点(可以是方法、属性或者类的初始化时机(可以是Action层、Service层、dao层))
1.点睛Spring的EL-Spring表达式语言,支持在xml和注解中使用表达式,类似于JSP的EL表达式语言。Spring开发中经常涉及调用各种资源的情况,包含普通文件、网址、配置文件、系统环境变量等,我们可以使用Spring的表达式语言实现资源的注入。Spring主要在注解@Value的参数中使用表达式。下面演示将实现以下几种情况:(1)注入普通字符(2)注入操作系统属性(3)注入表达式运算结果(4)注入其他Bean的属性(5)注入文件内容(6)注入网址内容(7)注入属性文件2.示例(1)准备,增加commons-io可简化文件相关操作,本例中使用commons-io将file转换成字符串在ch2.el包下新建test.txt,内容随意在ch2.el包下新建test.properties,内容如下:(2)需被注入的Bean此处为注入普通字符串(3)配置类注入普通字符串注入操作系统属性注入表达式结果注入其他Bean属性注入文件资源注入网址资源注入配置文件注入配置配件需使用@PropertySource指定文件地址,若使用@Value注入,则要配置一个PropertySourcePlaceholderConfigurer的Bean。注意,@Value("${book.name}"使用的是“$”而不是“#”。注入Properties还可从Environment中获得。(4)运行结果:
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)编写Singleton的Bean默认为Singleton,相当于@Scope("singleton")(2)编写Prototype的Bean声明Scope为Prototype(3)配置类(4)运行结果:
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项目(2)输出本Maven项目的坐标值(3)在STS中生成如图所示结构的项目(4)修改pom.xml。增加Spring的依赖,添加编译插件,将编译级别设置为1.8。(5)更新项目。项目(project_one)右键-Maven-Update Project(6)依赖树查看
1.Maven简介Apache Maven是一个软件项目管理工具。基于项目对象模型(Project Object Model,POM)的概念,Maven可用来管理项目的依赖、编译、文档等信息。使用Maven管理项目时,项目依赖的jar包将不再包含在项目内,而是集中放置在用户目录下的.m2文件夹下。2.Maven安装(1).下载Maven根据操作系统下载正确的Maven版本,并解压到任意目录。Maven下载地址:https://maven.apache.org/download.cgi(2).配置Maven在系统属性—高级—环境变量中分别配置M2_HOME和Path,如下图(3).测试安装在控制台输入“mvn-v”,获得如图所示信息表示安装成功3.Maven的pom.xmlMaven是基于项目对象模型的概念运作的,所以Maven的项目都有一个pom.xml用来管理项目的依赖以及项目的编译等功能。在我们的项目中,我们主要关注下面的元素。(1)dependencies元素,此元素包含多个项目依赖需要使用的(2)dependency元素内部通过groupId、artifactId以及version确定唯一的依赖,有人称这三个为坐标groupId:组织的唯一标识artifactId:项目的唯一标识version:项目的版本(3)变量定义变量定义:可定义变量在dependency中引用(4)编译插件Maven提供了编译插件,可在编译插件中涉及Java的编译级别(5)Maven运作方式Maven会自动根据dependency中的依赖配置,直接通过互联网在Maven中心库下载相关依赖包到.m2目录下,.m2目录下是你本地Maven库。如果你不知道你所依赖jar包的dependency怎么写的话,推荐到http://mvnrepository.com 网站检索。若Maven中心库中没有你需要的jar包(如Oracle),你需要通过Maven命令打到本地Maven库后应用即可,如安装Oracle驱动到本地库。
1.点睛Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置;Java配置也是Spring Boot推荐的配置方式。Java配置是通过@Configuration和@Bean来实现的。@Configuration声明当前类是一个配置类,相当于一个Spring配置的xml文件。@Bean注解在方法上,声明当前方法的返回值为一个Bean。本书通篇使用Java配置和注解配置混合配置。何时使用Java配置或者注解配置呢?我们主要的原则是:全局配置使用Java配置(如数据库相关配置、MVC相关配置),业务Bean的配置使用注解配置(@Service、@Component、@Repository、@Controller)。
Spring框架本身有四大原则:1)使用POJO进行轻量级和最小侵入式开发。2)通过依赖注入和基于接口编程实现松耦合。3)通过AOP和默认习惯进行声明式编程。4)使用AOP和模板(template)减少模式化代码。Spring所有功能的设计和实现都是基于此四大原则的。 依赖注入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提供的注解
1.点睛:AOP:面向切面编程,相对于OOP面向对象编程。Spring的AOP的存在目的是为了解耦。AOP可以让一组类共享相同的行为。在OOP中只能通过继承类和实现接口,来使代码的耦合度增强,AOP弥补了OOP的不足。Spring支持AspectJ的注解式切面编程。(1)使用@AspectJ声明是一个切面。(2)使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。(3)其中@After、@Before、@Around参数的拦截规则为切点(PointCut),为了使切点复用,可使用@PointCut专门定义拦截规则,然后在@After、@Before、@Around的参数中调用。(4)其中符合条件的每一个被拦截处为连接点(JointPoint) 示例将演示基于注解拦截和基于方法规则拦截两种方式,演示一种模拟记录操作的日志系统的实现。其中注解式拦截能够很好地控制要拦截的粒度和获得更丰富的信息,Spring本身在事务处理(@Transcational)和数据缓存(@Cacheable等)上面都使用此种形式的拦截。 2.示例(1)添加Spring aop支持及AspectJ依赖(2)编写拦截规则的注解注解本身是没有功能的,就和xml一样。注解和xml都是一种元数据,元数据即解释数据的数据,这就是所谓配置。注解的功能来自用这个注解的地方。(3)编写使用注解的被拦截类(4)编写使用方法规则被拦截类(5)编写切面通过@Aspect注解声明一个切面通过@Component让此切面成为Spring容器管理的Bean通过@PointCut注解声明切点通过@After注解声明一个建言,并使用@PointCut定义的切点通过反射可获得注解上的属性,然后做日志记录相关的操作,下面的相同通过@Before注解声明一个建言,此建言直接使用拦截规则作为参数(6)配置类使用@EnableAspectJAutoProxy注解开启Spring对AspectJ的支持(7)运行结果: