第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的主要用法有:前置通知;后置通知;环绕通知,用于在核心代码前面后面加入相关的切面的代码的实现.
第1章—Spring之旅—简化Spring的java开发的更多相关文章
- Spring实战(一)Spring简介---呕心沥血只为让Java开发更简单。
		
Spring诞生的初衷是为了替代更加重量级的企业级Java技术(EJB). 相对于EJB来说,Spring提供了更加轻量级和简单的编程模型,它增强了POJO(简单老式Java对象)的功能,使简单的Ja ...
 - SpringInAction读书笔记--第1章Spring之旅
		
1.简化Java开发 Spring是一个开源框架,它的根本使命在于简化java开发.为了降低java开发的复杂性,Spring采取了以下4种关键策略: 基于POJO的轻量级和最小侵入性编程 ...
 - Spring实战1:Spring初探
		
主要内容 Spring的使命--简化Java开发 Spring容器 Spring的整体架构 Spring的新发展 现在的Java程序员赶上了好时候.在将近20年的历史中,Java的发展历经沉浮.尽管有 ...
 - Spring企业级程序设计 • 【第1章 Spring之旅】
		
全部章节 >>>> 本章目录 1.1 Spring框架基础 1.1.1 Spring特点及体系结构 1.1.1 Spring的体系结构 1.1.2 使用Eclipse搭建 ...
 - Spring in Action 第一章 Spring之旅
		
1.1 简化Java开发 1.1.2 依赖注入(DI) 松耦合:如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能在对象本身毫不知情的情况下,用不同的具体实现进行替代 ...
 - 第01章-Spring之旅
		
一.简化Java开发 1. Spring的主要特性 依赖注入DI和面向切面编程AOP. 2. 关键策略 轻量级和最小侵入性编程:POJO 松耦合:DI和AOP 声明式编程:切面和惯例 减少样板式代码: ...
 - 第二章 微服务构建:Spring Boot
		
此处介绍Spring Boot的目的除了它是Spring Cloud的基础外,也由于其自身的各项优点,如自动化配置.快速开发.轻松部署等,非常适合用作微服务架构中各项具体微服务的开发框架. 本章内容: ...
 - Spring之旅
		
Java使得以模块化构建复杂应用系统成为可能,它为Applet而来,但为组件化而留. Spring是一个开源的框架,最早由Rod Johnson创建.Spring是为了解决企业级应用开发的复杂性而创建 ...
 - 转:使用 Spring Data JPA 简化 JPA 开发
		
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
 
随机推荐
- 如何打开Tango的ADF文件?
			
3ds max? opengl? ... Excel? vs? UltraEdit OpenGL Android API ADF文件数据结构:链接
 - kali下搭建WiFi钓鱼热点
			
在linux下建立无线热点并不像在windows下开启网络共享或者使用无线网卡驱动设置AP模式即可. linux下的无线共享要用到两个软件:hostapd(创建无线热点).dnsmasq(dns服务和 ...
 - 报表导出jxls的使用笔记
			
基于poi的jxls工具的使用:1.依赖: <dependency> <groupId>org.jxls</groupId> <artifactId>j ...
 - day15(生成器send方法,递归,匿名函数,内置函数)
			
一,复习 ''' 1.带参装饰器 - 自定义 | wraps def wrap(info) def outer1(func): from functools import wraps @wraps(f ...
 - Xamarin.Android RelativeLayout
			
初次接触Xamarin.Android. 由于国内Xamarin的资料少见,我大多参考JAVA原生代码,慢慢摸索过来. 我把摸索出来的结果广而告之,希望后来人能少走一点弯路,也希望你也能做出一份贡献. ...
 - cesium随笔 — 简单实现获取三维范围(包括相机高度)
			
代码 // 获取当前三维范围 function getCurrentExtent() { // 范围对象 var extent = {}; // 得到当前三维场景 var scene = viewer ...
 - UWP开发入门(二)——RelativePanel
			
RelativePanel也是Win10 UWP新增的控件,和上篇提到的SplitView一样在UWP的UI布局起到非常重要的作用.说句实在话,这货其实就是为了UWP的Adaptive UI而特意增加 ...
 - JSOI2008 Blue Mary开公司 | 李超线段树学习笔记
			
题目链接:戳我 这相当于是一个李超线段树的模板qwqwq,题解就不多说了. 代码如下: #include<iostream> #include<cstdio> #include ...
 - 初学python之路-day15
			
一.生成器send方法 # send的工作原理 # 1.send发送信息给当前停止的yield # 2.再去调用__next__()方法,生成器接着往下指向,返回下一个yield值并停止 # 案例: ...
 - 深入了解java虚拟机(JVM)  第八章 常见的jvm调优策略
			
一般来说,jvm的调优策略是没有一种固定的方法,只有依靠我们的知识和经验来对项目中出现的问题进行分析,正如吉德林法则那样当你已经把问题清楚写出来,就已经解决了一半.虽然JVM调优中没有固定的策略,但是 ...