简化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("开始探险");}
}
/*** 进行依赖的测试*/@Testpublic void KinghtShouldEmbarkOnQuest() {//向上转型Quest questimpl = (Quest) new QuestImpl();//注入Quest的实现类QuestImplBraveKnight 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");//获取beanBraveKnight 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

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

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

    简化Spring的java开发 1.1简介 区别于EJB的特性 简化javaBean,为了降低java开发的复杂性,Spring采取了以下4种关键策略: 基于POJO的轻量级和最小入侵性编程 通过依赖 ...

  2. 镜子的Spring之旅 之 Spring MVC

    Spring MVC 基于模型-视图-控制器(Model-View-Controller)实现,该web框架用于构建灵活和松耦合的web应用程序. 图上的标注很详细,下面是个人理解: 1.请求进入Di ...

  3. 一篇文章带你更好了解热门Java开发工具IDEA!

    IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手.代码自动提示.重构.JavaEE支持.各类版本工具(git.sv ...

  4. Spring实战1:Spring初探

    现在的Java程序员赶上了好时候.在将近20年的历史中,Java的发展历经沉浮.尽管有很多为人诟病的产品,例如applets.EJB.Java Data Object(JDO)和数不清的日志框架,Ja ...

  5. Spring入门(包括spring整合mybatis的spring-mybatis)

    Spring 一.背景介绍 1.spring理念 使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架 Spring是一个轻量级控制反转(lOC)和面向切面(AOP)的容器框架 2.轮子理 ...

  6. spring in action学习-第一章 spring之旅

    首先我先吐槽一下这本书的封面图,我能理解成一个包着头巾的男人举着个水壶昂首挺胸,最后给你个眼神....开玩笑的这幅插图是约旦西南部卡拉克省的居民,那里的山顶有座城堡,对死海和平原有极佳的视野,这幅图出 ...

  7. Spring实战 第1章 Spring之旅

    本章内容: Spring的bean容器 介绍Spring的核心模块 Spring的新功能 本章目录: 1.1 简化Java开发 1.1.1 激发POJO的潜能 1.1.2 依赖注入(DI) 1.1.3 ...

  8. Spring实战 | 第一部分 Spring的核心(第一章 Spring之旅)

    Spring的bean容器 介绍Spring的核心模块 更为强大的Spring生态系统 Spring的新功能 一.简化java开发 为了降低Spring开发的复杂性,Spring采取了以下4钟关键策略 ...

  9. 《Spring实战》第一章 — Spring之旅

    2019独角兽企业重金招聘Python工程师标准>>> 1.1 使用Spring简化Java开发 为了降低Java开发,Spring使用了一下4种关键策略: 基于POJO的轻量级和最 ...

  10. Spring之旅第一站(不得不佩服老外...)

    第1章 Spring之旅 说明 1.本文抄写了<Spring 实战>重点内容,参考了GitHub上的代码 2.每个人的学习方式不一样,但目的是一样的,活学活用.最近一直在听<我们不一 ...

最新文章

  1. 做事范围是多么多么重要
  2. Java内存模型深度解析:final--转
  3. LWUIT显示中文问题
  4. nginx配置文件语法高亮的Sublime Text扩展
  5. [翻译]在 .NET Core 中的并发编程
  6. 474. 一和零 golang动态规划
  7. JMeter【第五篇】关联:5种方法
  8. 零侵入性:一个注解,优雅的实现循环重试功能
  9. 小码农也有大梦想!人机猜拳java项目代码
  10. PAT 1018 锤子剪刀布
  11. 微信公众号开发者模式入门
  12. 计算机桌面上的照片转pdf免费,有没有免费将图片转PDF的工具?
  13. 简单的加盐加密登录处理
  14. 使用Power Automate (MS Flow) 发送审批邮件
  15. r5 5600H 怎么样 相当于什么水平
  16. Java:通过读取文件头来得到文件真实类型
  17. android 自动唤醒解锁,Android-唤醒并解锁Devi
  18. 什么是码点与代码单元
  19. 浅谈dfs深度优先搜索(基于啊哈算法)
  20. 必修三计算机选修三知识点,高二数学必修三知识点归纳总结

热门文章

  1. VKTM进程消耗大量CPU的问题
  2. 方法:如何解决NetShareEnum返回ERROR_NO_UNICODE_TRANSLATION(1113)的问题
  3. CSS 媒体类型 ,相应式布局使用
  4. windows netstat命令小节
  5. 分布式ID生成之雪花算法
  6. java 定义三维列表_java 多维数据定义
  7. python股票交易微信提醒_python实现秒杀商品的微信自动提醒功能(代码详解)
  8. 原生mysql 怎么创表_Mysql的基础使用之SQL原生语句的使用:表的 创建 删除 修改 (一)...
  9. mysql水平分表实践记录_MYSQL 分表实践
  10. unityar自动识别人脸_AR开发实战项目之人脸识别(实现换脸、人脸涂妆、动作特效)...