第1章—Spring之旅—简化Spring的java开发

简化Spring的java开发

1.1简介

区别于EJB的特性 简化javaBean,为了降低java开发的复杂性,Spring采取了以下4种关键策略:

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

1.2依赖注入(DI)

? 依赖注入到底是什么呢?任何一个有实际意义的应用都会由两个或者多个类组成,这些类进行相互协作来完成特定的业务逻辑.按照传统的做法,没个对象负责管理与自己相互协作的对象(即它所依赖的对象)的引用,这将会导致高度耦合和难以测试的代码.

例子:

骑士去探险

/**
 * 骑士
 */
public interface Knight {
    public void embarkOnQuest();
}
/**
 *
 * 探险类型
 */

public interface Quest {
    public  void embark();
}
/**
 * 勇敢的骑士
 */

public class BraveKnight implements Knight {

    private Quest quest;

    //quest被注入进来(构造注入)
    public BraveKnight(Quest quest) {
        this.quest = quest;
    }

    public void embarkOnQuest() {
        quest.embark();
    }
}

这个例子中的Quest是通过构造参数传递进来的,这里的重点是BraveKnight没有与任何特定的Quest实现发生耦合.对于它来说,被要求挑战的探险任务只要实现了Quest接口,那么具体是哪种类型的探险就无关紧要了.这就是DI所带来的最大收益 - - 松耦合.

对依赖进行替换的时候只需要给Quest的接口一个实现类即可

/**
 * 任务的实现类
 */
public class QuestImpl implements Quest{
    //从事 开始方法
    public  void embark() {
        System.out.println("开始探险");
    }
}
/**
     * 进行依赖的测试
     */
    @Test
    public void KinghtShouldEmbarkOnQuest() {
        //向上转型
        Quest questimpl = (Quest) new QuestImpl();
        //注入Quest的实现类QuestImpl
        BraveKnight knight = new BraveKnight(questimpl);
        //执行方法
        knight.embarkOnQuest();
    }

1.3通过Spring的Xml进行配置实现

application.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--注入BraveKnight-->
<bean id="braveKnight" class="BraveKnight">
    <constructor-arg ref="quest"/>
</bean>
    <!--注入QuestImpl-->
    <bean id="quest" class="QuestImpl"></bean>
</beans>

进行Spring的测试

public static void main(String[] args) {
        //加载配置文件 加载Spring的上下文
        ApplicationContext app = new ClassPathXmlApplicationContext("classpath:application.xml");
        //获取bean
        BraveKnight bean = app.getBean(BraveKnight.class);
        //调用方法
        bean.embarkOnQuest();
    }

1.4应用切面编程(AOP)

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

? 常见的AOP抽离出来的组件有:日志模块;事务模块;安全模块等.

? AOP能够让服务模块化,并以声明的方式将他们应用到他们需要影响的组件中去.这样做的好处是可以让这些组件具有更高的内聚性并且更加关注自身的核心业务,完全不需要了解设计系统服务所带来的复杂性,总之,AOP能够确保POJO的简单性. 我们可以把切面想象为覆盖在很多组件之上的一个外壳,如下图所示:

例子:还是以刚才的骑士为例,我们熟知吟游诗人这个服务类会来记载骑士的所有事迹.

主要的类如下:

//吟游诗人作为切面
public class Minstrel {

    public void  singBeforeQuest(){
        //探险之前
        System.out.println("Before: Fa la la ,the Knight is so breave!");
    }

    public void  singAfterQuest(){
        //探险之后
        System.out.println("After: Tee hee hee ,the breave Knight!");
    }
}

AOP的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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--注入BraveKnight-->
    <bean id="braveKnight" class="BraveKnight">
    <constructor-arg ref="quest"/>
    </bean>

    <!--注入QuestImpl-->
    <bean id="quest" class="QuestImpl"/>

    <!--AOP实例-->
    <!--注入Minstrel-->
    <bean id="minstrel" class="com.aop.Minstrel"/>
    <aop:config>
        <!--声明切面-->
        <aop:aspect ref="minstrel">
            <!--定义切点 这里定义的是骑士的方法-->
            <aop:pointcut id="embark" expression="execution(* QuestImpl.embark(..))"/>
            <!--声明前置通知-->
            <aop:before pointcut-ref="embark" method="singBeforeQuest"/>
            <!--声明后置通知-->
            <aop:after pointcut-ref="embark" method="singAfterQuest"/>
        </aop:aspect>
    </aop:config>
</beans>

AOP的主要配置涉及到切面和切点,我们先定义横切面的类的Bean并进行注入,然后我们需要相关的类的方法作为切点,AOP的主要用法有:前置通知;后置通知;环绕通知,用于在核心代码前面后面加入相关的切面的代码的实现.

原文地址:https://www.cnblogs.com/charlypage/p/9211482.html

时间: 2024-10-11 18:05:51

第1章—Spring之旅—简化Spring的java开发的相关文章

Spring Boot:简化Spring应用初始搭建以及开发过程(转)

Spring Boot专注于Spring平台和第三方开发库,简化了基于Spring的产品开发.让你在开始Spring应用开发时,不会被各种繁杂的事务困扰.通过Spring Boot,开发时只需少量的Spring配置就可以完成项目结构的初始搭建. 功能特性 创建独立的Spring应用程序. 直接嵌入Tomcat.Jetty和Undertow(无需部署WAR文件). 使用特定的POM文件,简化Maven配置. 尽可能自动化配置Spring. 提供产品级特性,比如指标测量.健康检查.外部配置等. 绝对

SpringInAction读书笔记--第1章Spring之旅

1.简化Java开发 Spring是一个开源框架,它的根本使命在于简化java开发.为了降低java开发的复杂性,Spring采取了以下4种关键策略: 1.基于POJO的轻量级和最小侵入性编程:       有很多框架强迫应用继承它们的类或实现它们的接口从而导致应用与框架绑死,而基于Spring构建的应用通常没有任何痕迹表明你使用了Spring,最坏的场景是一个类或许会用到Spring注解,但它依旧是POJO. 2.通过依赖注入和面向接口实现松耦合:       任何应用都会由多个类相互协作完成

一篇文章带你搞懂spring全家桶套餐

spring全家桶里都有哪些食物 上期我们讲了spring和springmvc两个框架的基础知识和学习路线,而这期内容,我们将围绕着spring全家桶展开来讨论. 大家应该都知道,按照出现的顺序,spring全家桶大概包含了spring.springmvc.springboot以及springcloud,从开胃小菜spring到满汉全席springcloud,spring全家桶可谓Java工程师的必备大餐,那么,我们不妨先来看看,spring全家桶是如何从光杆司令spring发展到如今的庞大家族

使用 Spring Data JPA 简化 JPA 开发

从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示例:接着重构该示例,并引入 Spring 框架,这两部分不会涉及过多的篇幅,如果希望能够深入学习 Spring 和 JPA,可以根据本文最后提供的参考资料进一步学习. 自 JPA 伴随 Java EE 5 发布以来,受到了各大厂商及开源社区的追捧,各种商用的和开源的 JPA 框架如雨后春笋般出现,为

01 Spring之旅

Spring诞生的最初目的是为了替代EJB,提供更加轻量级和简单的编程模型核心的思想是依赖注入和面向切面编程的概念 1.1 简化Java开发 通过POJO的轻量级和最小侵入性编程(只需提供一个简单的Bean) 通过依赖注入和面向接口实现松耦合(IoC,对接口编程) 基于切面和惯例进行声明式编程(声明式事务) 通过切面和模板减少某些固定的代码(路数据库链接.释放等) Spring提供了基于Java的配置,可作为XML的替代方案(对重构友好) DI能够让相互协作的软件组件保持松耦合,而面向切面编程允

Leopard Jdbc:简化Spring Jdbc使用

Leopard Jdbc:简化Spring Jdbc使用 学习如何在旧项目中使用Leopard Jdbc. 本指南将引导您完成使用Leopard Jdbc操作MySQL. How to complete this guide 你可以从头开始并完成每一个步骤,或者您可以绕过你已经熟悉的基本设置步骤.无论哪种方式,你最终都可以得到可工作的代码. 1.配置maven依赖 在dao模块的pom.xml加入 <dependencies> [...] <dependency> <grou

我的Spring之旅(二):为请求添加参数

1.前言 在上一篇我的Spring之旅(一)中,我们只是利用不带参数的请求返回一个网页或一段json,在实际的B/S.C/S网络交互中,请求中需要自定义的参数.本篇将简单地为之前的请求添加参数. 2.参数说明 ①method:API名称,用于区分服务端调用方法 ②name:请求参数名称,将作为method方法的实参 3.改写HelloController.java package com.nextgame.web; import java.io.IOException; import net.s

[z]使用 Spring Data JPA 简化 JPA 开发

文章来自http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/,内容非常清晰. 从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示例:接着重构该示例,并引入 Spring 框架,这两部分不会涉及过多的篇幅,如果希望能够深入学习 Spring 和 JPA,可以根据本文最后提供

Spring之旅

Java使得以模块化构建复杂应用系统成为可能,它为Applet而来,但为组件化而留. Spring是一个开源的框架,最早由Rod Johnson创建.Spring是为了解决企业级应用开发的复杂性而创建的,但Spring又不仅仅局限于服务器端开发,任何Java应用都能在简单性.可测试性和松耦合性等方面从Spring中获益. Spring可以做很多事情,但归根结底,支撑Spring的仅仅是少许的基本理念,所有的理念都可以追溯到Spring最根本的使命:简化Java开发. 为了降低Java开发的复杂性