Spring是如何简化开发的

Spring为了简化Java开发而产生,使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情,在简单性,可测试性和松耦合等方面从Spring获益。

一、Spring是怎么简化java开发的??

1、 基于POJO的轻量级和最小侵入性变成
2、通过依赖注入和面向接口实现松耦合
3、基于切面和惯例进行声明式编程
4、通过切面和模板减少样板式代码


1、Spring不会在HelloWorld上导入乱糟糟的方法。
2、依赖注入Dependency Injection(DI)
  • 为什么要用DI

因为应用之间是通过很多组件和类的相互协作来完成的。通常,每个对象负责管理与自己相互协作的对象的引用,这样会导致高度耦合和难以测试的代码。
也就是相互调用太多,代码看起来太复杂。当一个组件需要修改的时候,所有涉及到它的其他组件都要进行修改。
这里讲了依赖注入的方式之一,构造器注入。

   public class DamselRescuingKnight implements Knight{
   private RescueDamselQuest quest;
   public DamselRescuingKnight(){
      quest = new RescueDamselQuest();
   }
  public void embarkOnQuest() throws QuestException{
      quest.embark();
   }
}
  • DamselRescuingKnight在他的构造函数中自行创建了RescueDamselQuest。所以骑士就和这个任务紧密的结合在一起了。而且难以测试embark()是否在embarkQuest()方法被调用的时候执行。所以这种写法很不好。
  • 所以我们采用依赖注入。对象的依赖关系将由负责协调系统中各个对象的第三方组件在创建对象时设定。对象无需自行创建或者管理它们的依赖关系。依赖关系将被自动注入到需要它们的对象中去。
 public class BraveKnight implements Knight{
     private Quest quest;
     public BraveKnight(Quest quest){
       this.quest = quest;      -->Quest被注入进来
     }
     public void embarkOnQuest() throws QuestException{
         quest.embark();
     }
}
  • 这里没有自行创建任务。而是在构造时把任务当做构造器参数传入,即构造注入
  • 而 且Quest是所有任务的接口。可以实现任意一种任务。重要的是骑士没有与任何一个特定的任务发生耦合。
  • 这样就实现了松耦合。
  • 如果一个对象只通过接口(而不是具体化实现或者初始化的过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。也就是改实现不用换接口。
  • 可以采用mock测试

然后可以用Spring将SlayDragonQuest通过XML文件注入到BraveKnight当中。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   http://www.springframework.org/schema/cache 
   default-lazy-init="true">

<bean id="knight" class = "com.springinaction.knights.BraveKnight">
<constructor-arg ref="quest"></constructor-arg>     -->通过Constructor-arg来告诉Spring额外的信息
</bean>
<bean id="quest"
  class="com.springinaction.knight.SlayDragonQusest">
</bean>
</beans>
  • Spring通过Application Context应用上下文装载Bean

  • Spring应用上下文全权负责对象的创建和组装。

  • Spring自带了几种应用上下文的实现,它们之间的主要区别是如何加载它们的配置

    public class KnightMain{
       public static void main(String[] args){
            ApplicationContext context = 
                 new ClassPathXmlApplicationContext("knight.xml"); -->加载Spring上下文
            Knight knight = (Knight) context.getBean("knight");    -->获取knight Bean
            knight.embarkOnQuest();                                -->使用knight
       }
    }
    
  • 这里的main()方法创建了一个Spring上下文,该上下文加载了knight.xml文件。随后它调用该上下文获取一个ID为knight的Bean。得到Knight的对象之后,只需要调用embarkOnQuest()方法就可以执行所赋予的任务。

3、应用切面 (AOP Aspect Oriented Programming)

允许你把遍布应用程序各处的功能分离出来形成可重用的组件。

  • 为什么要用AOP?

因为系统由许多不同的组件组成,每个组件负责一块特定的职责。有些系统服务跨越多个组件,被称为横切关注点。
如果将这些服务分散到各个组件中,代码将会变得重复而混乱。每个模块都要调用这些服务
所以AOP使这些服务模块化,并以声明的方式将他们应用到需要影响的组件中去。将他们想象成一个切面,覆盖了多个组件。使这些组件更关注自身业务而不需要了解系统服务

  • 如何实现?
    在Spring配置文件中声明它。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   http://www.springframework.org/schema/cache 
   default-lazy-init="true">

<bean id="knight" class = "com.springinaction.knights.BraveKnight">
<constructor-arg ref="quest"></constructor-arg>
</bean>
<bean id="quest"
  class="com.springinaction.knight.SlayDragonQusest">
</bean>

<bean id="minstrel" class="com.springinaction.knights.Minstrel">              -->声明Minstrel Bean
</bean>
<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>
</beans>

使用AOP配置的命名空间把Minstrel Bean声明为一个切面:

  • 先声明Minstrel为一个Bean,然后在<aop:aspect>元素中引用该bean
    这样就不用在knight中每次调用Minstrel了
4、使用模板消除样板式代码:封装

比如使用JDBC的时候,样板式代码是核心业务代码的好几倍,这时候用Spring就简洁的多
Spring通过模板封装来消除样板式代码。比如JDBCTemplate就可以简化原来的代码,因为都被封装了。

二、Bean的容器和生命周期

在基于Spring的应用中,应用对象生存于Spring的容器中。
容器是Spring框架的核心。有两种类型

  • Bean工厂(Bean Factories)
  • 应用上下文(Application Context)基于BeanFactory之上构建,并提供面向应用的服务。最常用

三种最常见的应用上下文
1、ClassPathXmlApplicationContext
从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当做资源

2、FileSystemXmlApplicationContext
读取文件系统下的XML配置文件并加载上下文定义

3、XmlWebApplicationContext
读取web应用下的XML配置文件并加载上下文定义

通过现有的应用上下文引用,可以调用应用上下文的getBean()方法从Spring容器中获取Bean

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,799评论 6 342
  • 依赖注入 按照传统的做法,每个对象负责管理与自己相互协作的对象的引用,这将会导致高度耦合和难以测试的代码。例如: ...
    谢随安阅读 535评论 0 0
  • 买一本书 一本有趣的书 放在我办公室的抽屉里 工作疲累 阴雨连绵的天气里 取出来翻一翻 暂时把烦闷忘记 比如养一盆...
    水仙书生阅读 316评论 0 2
  • “朝看水东流,暮看日西沉” 在时光的沉浮中,我留下了什么,又带走了什么,仿佛一直都在遗忘中度过,不知为何,一直...
    西瓜丸子zero阅读 262评论 0 1