Spring入门之Spring核心与概述

1、Spring的两个特性

Spring丰富功能的底层都依赖于两个特性:1、依赖注入(Dependency injection ,DI)和面向切面编程(aspect-oriented programming,AOP)。


2、Spring的作用

帮助程序员解耦应用组件。使得程序员可以在不改变所依赖的类的情况下,修改依赖关系。


3、装配bean:

a、Spring的自动配置 ;b、基于java的配置 ; c、XML配置


4、Spring高级装配

Spring的条件装配(profile)、处理自动装配时的歧义性、作用域以及spirng表达式语言


5、Spring的面向切面

面向切面的Spring利用AOP特性把系统级的服务(例如安全和审计)从他们所服务的对象中解耦出来。


6、Spring最根本的使命:

简化Java开发


7、Spring简化java开发的4种关键策略:

a.基于POJO的轻量级和最小侵入性编程
b.通过依赖注入和面向接口实现松耦合
c.基于切面和惯例进行声明式编程
d.通过切面和模板减少样板代码


8、DI松耦合

如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。


9、DI的两种注入方式:

构造器注入、setter方法注入,通常用后者。


10、Spring单元测试

对依赖进行替换的一个最常用方法是在测试的时候使用mock实现。而在紧耦合的程序中,单元测试是极为困难的。深入学习参照http://easymock.org/


11、现代Spring开发者的必备技能:

基于java的配置,配置对比:

  • a、基于xml的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <bean id="knight" class="com.star.knights.BraveKnight">
      <constructor-arg ref="quest"/>
    </bean>
    <bean id="quest" class="com.star.knights.SlayDragonQuest"/>
</beans>
  • b.基于java的配置:
package com.star.knights.config;
@Configuration
public class KnightConfig{

   @bean
   public Knight knight(){
    return new BraveKnight(quest());
  }
  @bean
   public Quest quest(){
     return new SlayDragonQuest();
   }
}

两种配置方式各有好处,基于java的配置可以适用几乎所有使用spring的场景,且不需要加入xml的schema头。


12、Spring应用上下文

在Spring的7大模块中,应用上下文(Application Context)负责装载bean的定义,并把它们组装起来,即装载配置文件。Spring应用上下文全权负责对象的创建和组装。spring自带多种应用上下文的实现,它们之间的区别仅仅在于如何加载配置。
若Spring采用的是xml配置,则选择ClassPathXMLApplicationContext作为应用上下文比较合适。而对于基于java的配置,Spring提供了AnnotationConfigApplicationContext.加载应用上下文:

//加载应用上下文
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("ClassPath:spring.xml");
//获取bean
User user = context.getBean("user");

13、DI与AOP

DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(AOP)允许你把遍布应用各处的功能分离出来形成可重用组件。


14、面向切面

除了实现自身核心的功能之外,有些组件还经常承担额外的职责。诸如日志、食物管理和安全这样的系统服务经常融入到其他核心业务逻辑组件中去,这些系统服务通常被称为横切关注点,因为它们会跨越系统的多个组件。如果将这些关注点分散到多个组件中去,你的代码将会带来双重的复杂性。


15、为什么需要AOP?

a、实现系统关注点功能的代码将会重复出现在多个组件中。这意味着如果你要改变这些关注点的逻辑,必须修改各个模块中的相关实现。即使你把这些关注点抽象为一个独立的模块,其他模块知识调用它的方法,但方法的调用还是会重复出现在各个模块中。
b、组件会因为那些与自身核心业务无关的代码而变得混乱。一个向地址簿添加地址条目的方法应该只关注如何添加地址,而不应该关注它是不是安全的或者是否需要事务支持。
AOP能够使日志、安全等服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。这样,其他核心组件就会具有更高的内聚性并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来的复杂性。总之,AOP能够确保POJO的简单性。


16、切面理念

我们可以把切面想象为覆盖在很多组件之上的一个外壳。借助AOP,可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活地应用到系统中,你的核心应用甚至根本不知道它们的存在。这是一个非常强大的理念,可以将安全、事务和日志关注点与核心业务逻辑相分离。


17、切面应用小实例:

骑士的职责是探险,吟游诗人的职责是为骑士的探险事迹歌颂。假设吟游诗人会在骑士探险前和探险后各歌唱一次,那么我们可以将吟游诗人的吟唱抽象为一个切面,这样骑士和吟游诗人的逻辑就可以互不干扰。
a、首先定义好骑士类Knight和吟游诗人类Minstrel。Knight类有战斗方法embark(),Mistrel类有方法singBeforeQuest()、singAfterQuest();
b、在spring.xml中声明切面:

<bean id="knight" class="com.star.knights.BraveKnight"><!--BraveKnight类是接口Knight的实现类之一-->
    <constructor-arg ref="quest"/> <!--构造器注入quest,声明是何种任务-->
</bean>
<!--指定quest为屠杀恶龙的探险召唤-->
<bean id="quest" class="com.star.knights.SlayDragonQuest" />
<!--声明吟游诗人bean-->
<bean id="minstrel" class="com.star.knights.Minstrel" />
<!--重点:声明切面-->
<aop:config>
    <aop:aspect ref="minstrel"><!--声明切面-->
        <aop:pointcut id="embark" expression="execution(**.embarkOnQuest(..))"/>
        <!--声明业务逻辑执行前后需要调用的切面方法-->
        <aop:before pointcut-ref="embark" method="singBeforeQuest" />
        <aop:after pointcut-ref="embark" method="singAfterQuest" />
    </aop:aspect>
</aop:config>

这里使用了Spring的aop配置命名空间把Minstrel bean声明为一个切面。<aop:before>称为前置通知、<aop:after>称为后置通知。
expression属性用来选择所应用的通知。表达式的语法采用的是AspectJ的切点表达式语言。现在无需担心不了解AspectJ或编写AspectJ切点表达式的细节,这些会在后面的详细探讨。
在本例中,首先,Minstrel仍然是一个POJO,没有任何形式代码表明它要被作为一个切面使用。当我们按照上面那样配置过后,在Spring的一个用上下文中,Minstrel已经变成了一个切面。
其次,也是最重要的,Minstrel可以被应用到BraveKnight中,而BraveKnight不需要显式地调用它。实际上,BraveKnight完全不知道Minstrel的存在。但必须要注意的是,Minstrel首先必须得是个Spring bean,能够为其他Spring bean做的事也同样可以应用到Spring切面中,例如为它们注入依赖。


18、使用模板消除样板式代码

一个简单的JDBC查询功能需要数倍于查询代码的其他异常处理、获取连接和结果集、关闭连接等代码,除了查询的那两行代码,其他的都是样板式代码。这些重复的样板式代码在你的程序中一遍又一遍地出现,消磨了你相当一部分时间和精力。JDBC不是产生样板式代码的唯一场景。在许多编程场景中往往都会导致类似的样板代码,JMS、JNDI和使用REST服务通常也涉及大量的重复代码。
Spring旨在通过模板封装来消除样板式代码。Spring的jdbcTemplate是的执行数据库操作时,避免传统的JDBC样板式代码成为可能。


19、Spring容器:容纳你bean的地方

容器是Spring框架的核心。Sprig容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。毫无疑问,这些对象更简单干净,更易于理解,更易于重用并且更易于进行单元测试。
Spring容器并不是只有一个。Spring自带多个容器实现,可以归为两种不同的类型:
a、bean工厂(beanFactory)。bean工厂(由org.springframework.beans.factory.beanFactory接口定义)是最简单的容器,提供基本的DI支持。
b、应用上线文(ApplicationContext)。应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。
虽然我们可以在bean工厂和应用上下文之间任选一种,但bean工厂对大多数应用来说往往太低级了,因此,ApplicationContext要比bean工厂更受欢迎。


20、使用应用上下文

Spring自带了多种类型的应用上下文。下面罗列的几个是最有可能遇到的:
a、AnnotationConfigApplicationContext:从一个或多个基于Java配置类中加载Spring应用上下文。
b、AnnotationConfigWebApplicationContext:从一个或多个基于java的配置类中加载Spring Web应用山下文。
c、ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,把应用上下文定义文件作为类资源。
d、FileSystemXMLApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义。
e、xmlWebApplicationContext:从Web应用的一个或多个xml配置文件中加载上下文定义。
//加载应用上下文的几种方式示例
//基于xml的配置
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(“classpath:spring.xml”);
//基于java的配置
AnnotaitionConfigApplicationContext context=new AnnotationConfigApplicationContext(“com.star.config.KnightConfig.class”);
应用上下文准备就绪之后,我们就可以调用上下文的getBean()方法从Spring容器中获取bean。


21、bean的生命周期

在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不在被引用,则由Java自动进行垃圾回收。相比之下,Spring容器中的bean的生命周期就显得复杂得多了。bean的生命周期如下:
a、Spring对bean进行实例化。
b、Spring将值和bean 的引用注入到bean对应的属性中。
c、如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法;
d、如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入。
e、如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来。
f、如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法。
g、如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似的,如果bean使用了init-method声明了初始化方法,该方法也会被调用。
h、如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
i、此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用程序山下文中,知道该应用上下文被销毁。
j、如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。


22、Spring Portfolio Spring扩展功能集

当谈论Spring时,其实它远远超出我们的想象。Spring远不是Spring框架所下载的那些。整个Spring Portfolio包括多个构建与核心Spring框架之上的框架和类库。概括地讲,整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型。Spring portfolio下的一些项目:
a、Spring Web Flow:建立于SpringMVC之上的基于流程的会话式Web应用(可以想一下购物车或者是向导功能)。访问Spring Web Flow的主页(http://projects.spring.io/springwebflow/)。
b、Spring Web Service:Spring Web Service提供了契约优先的Web Service模型,服务的实现都是为了满足服务的契约而编写的。浏览站点http://docs.spring.io/springws/site/来了解更多信息。
c、Spring Security:安全对于许多应用都是一个非常关键的切面。利用Spring AOP,Spring Security为Spring应用提供了声明式的安全机制。可以在主页http://projects.spring.io/spring-security/ 获取关于Spring Security 的更多信息。
d、Spring integration:许多企业级应用都需要与其他应用进行交互。Spring Integration提供了多种通用应用集成模式的Spring声明式风格实现。更多信息可以参考Mark Fisher、Jonas Partner等编写的《Spring Integration in Action》;或访问Spring Integration 的主页:http://projects.spring.io/spring-integration .
e、Spring Batch:当我们需要对数据进行大量操作时,没有任何技术可以比批处理更胜任这种场景。如果需要开发一个批处理应用,就可以通过Spring Batch,使用Spring强大的面向POJO的编程模型。学习参照Arnaud Cogoluegnes、Thierry Templier等编写的《Spring batch in Action》,或者访问Spring Batch主页http://projects.spring.io/spring-batch/
f、Spring Data:Spring Data使得在Spring应用中使用任何数据库都变得非常容易。不管使用文档数据库,如MongoDB,图形数据库,如Neo4j,还是传统的关系型数据库,Spring Data都为持久化提供了一种简单的编程模型。这包括为多种数据库类型体用了一种自动化的Repository机制,它负责为你创建Repository的实现。
g、Spring Social:社交网络是互联网领域中新兴的一种潮流,如FaceBook或者Twitter。如果对此感兴趣,可以了解一下SpringSocial,这是Spring的一个社交网络扩展模块。有兴趣可以参照:https://spring.io/guides/gs/accession-facebook/https://spring.io/guides/gs/accessing-twitter/ 中的入门指南。
h、Spring Mobile
移动应用是另一个引人注目的软件开发领域。只能手机和平板设备已经成为许多永无首选的客户端。Spring Mobile是Spring MVC新的扩展模块,用于支持移动Web应用开发。
i、Spring Boot:Spring及大地简化了众多的编程任务,减少甚至消除了很多样板式代码,如果没有Spring的话,在入场工作中你不得不编写这样的样板代码。Spring Boot 是一个崭新的令人兴奋的项目,它以Spring的视角,致力于简化Spring本身。
SpringBoot大量依赖于自动配置技术,它能够消除大部分(在很多场景中,甚至是全部)Spring配置。它还提供了多个Starter项目,不管你使用Maven还是Gradle,这都能减少Spring工程构建文件的大小。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值