Spring之旅(一):初识Spring

Spring之旅

一.Spring根本使命

简化java开发

1. 简化开发策略

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

2. 策略1:基于POJO的轻量级和最小侵入性编程

javaBean使用POJO而不需要继承或实现框架中的接口,就能实现Spring框架的功能。

框架和应用代码之间松耦合。

侵入性: 很多框架需要在应用代码中继承或实现框架的接口,让应用与框架绑定。

实现非侵入性的方式:

  1. 依赖注入

3. 依赖注入

3.1 概念

对象中可能需要其他的依赖对象,在依赖注入中对象不需要自己创建依赖的对象,而是依赖的对象将依赖关系自动交给对象。

3.2 依赖注入方式

(1) 构造器注入

在javaBean的构造函数中,将所依赖的类传进来。这样所依赖的对象主动交给javaBean,完成javaBean对象的创建。

扩展: 构造函数中传入来的依赖,最好是接口。这样所有实现接口的类都可以注入进来,屏蔽了类的具体实现。

3.3 问题

构造器注入在创建javaBean对象时,需要传依赖的对象,这个依赖的对象如何来?

如果是依赖的对象是接口,传哪一个实现类?

3.4 装配

(1) 概念

创建组件之间的协作行为

即配置javaBean和依赖的类。

(2) Spring装配方式

Spring有多重装配方式,常见的有两种:xml文件和java

:javaBean:Foo (接口)依赖javaBean:Bar (接口)

FooImp实现了Foo接口,BarImp实现了Bar接口。

(2.1) xml文件
<bean id="foo" class="com.spring.FooImp">
    <constructor-arg ref="bar">
</bean>

<bean id="bar" class="com.spring.BarImp"/>
(2.2) java配置
@configuration
public class FooConfig{
    
    @Bean
    public Foo foo(){
        return new FooImp(bar())
    }
    
    @Bean
    public Bar bar(){
        return new BarImp();
    }
}

装配好后的组件如何运行起来的呢?

Spring 通过应用上下文(Application Context)装载Bean的定义并把它们组装起来。

Spring的Application Context全权负责对象的创建与组装。

Spring 有多种实现Application Context的方式,主要区别在于如何加载配置。

完整例子:
  • Food接口
public interface Food {
    
    String foodName();
}
  • Apple类
public class Apple implements Food{

    public String foodName() {
        String foodname = "红富士苹果";
        System.out.println("这是非常好的" + foodname);
        return foodname;
    }   
}
  • Animal接口
public interface Animal {
    
    void eat();
}
  • Dog类
public class Dog implements Animal{
    
    private Food food;

    public Dog(Food food) {
        this.food = food;
    }

    public void eat() {
        System.out.println("dog like" + this.food.foodName());  
    }
    
}
  • AnimalConfig配置
@Configuration
public class AnimalConfig {

    @Bean
    public Animal animal(){
        return new Dog(food());
    }
    
    @Bean
    public Food food(){
        return new Apple();
    }
}

  • main方法中加载注解配置上下文,并获取Bean类
public class Demo {
    
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AnimalConfig.class);
        
        Animal animal = context.getBean(Animal.class);
        animal.eat();
    }
}
  • 打印结果输出:
这是非常好的红富士苹果
dog like红富士苹果

DI可以让各组件松耦合,而AOP可以把散落在系统各处的同类功能分离出来形成通用组件,接下来,让我们了解下AOP

AOP

AOP是啥?

AOP是面向切面编程,aspect-oriented programming.

可以将多个系统都调用的服务,抽离成单独的组件,以消除这些服务散落在系统各处带来的复杂性。

为何要使用AOP?

如果不使用AOP,散落在系统各处的同类功能代码,不仅不利于管理,而且会非常混乱。

如日志服务和安全管理,系统很多业务都需要调用它们的服务。想想看:

  • 如果日志服务有改动,所有的业务都需要同时改动。就算抽离成一个通用方法,方法的调用也会出现在各处,不利于维护与管理。
  • 而且这些服务又不是核心的业务代码,不应该在核心业务代码中去码这些东西,代码会非常混乱。

AOP的好处在哪里?

AOP能够让这些服务模块化,以声明的方式去应用到需要这些服务的影响的组件中。

这些组件更关注自身的核心业务而不需要关注其他服务。

总之,AOP能让POJO变得简单。

如何理解AOP?

AOP可以想象成包裹核心业务组件的一层外壳,以声明的方式灵活的运用到业务组件中,甚至核心业务层都不知道它们的存在,将核心业务与日志事物等服务功能分离。

例子:

在每个animal eat food之前,都会有doctor过来给animal检查,eat food之后,又会给animal称重。

你可能会想到:在每个eat方法的开头添加检查cheak方法,在结尾添加称重weight方法。

但是仔细想想,animal 中需要管理 doctor的方法?check和weight不是animal的核心业务呀,这些都让doctor自己做就好了。

如果想要管理也OK,你给我将doctor的实例传给我,依赖注入进来。但如果doctor为空呢?

简单的事情就变得很复杂,倒不如是doctor的方法就由doctor自己来管理。

利用AOP,可以让animal在eat food之前必须check,而animal一无所知。

详细代码:

Doctor类
public class Doctor implements Person{
    
    public void check() {
        System.out.println("医生来检查啦");       
    }

    public void weight() {
        System.out.println("吃胖啦!");     
    }

}
配置AOP的xml文件
<bean id="food" class="com.example.beans.Apple"/>
    
    <bean id="animal" class="com.example.beans.Dog">
        <constructor-arg ref="food"/>
    </bean>
    
    <bean id="person" class="com.example.beans.Doctor"/>
    
    <aop:config>
        <aop:aspect ref="person">
            <aop:pointcut expression="execution(void com.example.beans.Dog.eat(..))" id="doctorSay" />
            <aop:before method="check" pointcut-ref="doctorSay" />
            <aop:after method="weight" pointcut-ref="doctorSay" />
        </aop:aspect>
    </aop:config>
输出日志:
医生来检查啦
这是非常好的红富士苹果
dog eat 红富士苹果
吃胖啦!

从这个例子我们可以了解到

  • 没有任何代码说明Doctor是一个切面,它依然是一个POJO。
  • 没有任何代码说明Dog eat调用了Doctor的方法,但Doctor的方法依然在Dog eat方法执行时启用了。
  • Doctor依然是POJO,也就意味着它可以使用DI等其他POJO可以做的事。

使用模板Template消除样板式代码

每次在码东西的时候,经常碰到这些东西是不是在哪见过。没错,你可能真的在重复的码同一个东西,这就是样板式的代码。

最直接的例子就是java创建jdbc的连接,执行sql,再放入Bean类中,最后释放连接,抛出异常。

其中创建jdbc和释放连接抛出异常都是通用的写法,样板式的代码,但又不得不写。其实真正的业务只有执行SQL,并将查询结果放入Bean类中。

使用模板可以消除这些样式代码,可以理解成将这些样式代码封装成了一个模板类,只需码真正的核心业务就行了。

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

推荐阅读更多精彩内容

  • 在PPT的制作中,常说:文不如图,图不如表。因为相对于在阐述观点的时候往往最有力的就是用数据说话,用图表来传递信息...
    掌上ppt阅读 3,550评论 5 83
  • 性观念越来越开放,许多小女生或年轻女性却并不太懂保护自己。一时激情之后,意外怀孕了,这往往就意味着人流。在人流的几...
    医见封喉阅读 358评论 0 1
  • 熊掌一出,摧枯拉朽。 说也奇怪,萦怀半月的芥蒂就这样烟消云散。有时候,很多事情就是一句话,一张纸,不过人们都习惯于...
    籽盐阅读 300评论 0 0
  • 最近YSL的星辰口红火了,天天上微博热门榜,微博上大V小V唇枪舌战,朋友圈也是讨论得热烈。 好莱坞巨星伊丽莎白·泰...
    红妹爱折腾阅读 874评论 0 1