Spring实战随笔(一) 核心概念

- Bean发展历史

JAVA bean:
  • 要有默认构造函数
  • 所有属性都是private的
  • 提供getter setter
  • 实现了serializable接口可以序列化
    这个最简单的java bean开始出现是为了java gui可视化编程用的。
EJB

在实际企业开发中,需要实现事务,安全分布式,javabean就不好用了。sun公司就开始往上面堆功能,这里java bean就复杂为EJB。

POJO

EJB很强大,但是太重了,没有必要每次都用。此时出现了DI、AOP技术,通过简单的java bean也能完成EJB的工作,这是java bean简化为POJO,其实就是普通的java bean,不过融合了DI、AOP技术。

Spring

Spring诞生了,Spring赋予POJO魔力的方式之一就是用DI来装饰它。
Spring做的就是简化JAVA开发

- DI(Dependency Injection)依赖注入

没有什么神奇的,简单的譬如说构造器注入,就是构造器传入参。
还可以通过xml将参数注入,类似下面的方式注入request被声明为spring的bean了,这种行为也称之为装配,把request、arg、value装配到一起了。

DI.png

DI的好处: 像示例中,knight对象不需要关注是什么类型的request,也不用关注request来自哪里,spring通过配置,就能知道他们的依赖关系,这样就避免强耦合,对象不需要管理或者创建这个依赖关系。

Q:这个装配的工作是怎么实现的呢?
A:Spring通过Application Contex(应用上下文)来装载bean的定义并且组装起来。这些都是由Spring来做的工作,Spring本身也有很多Application Context的实现,用来组装bean。

Application Context

上述例子中是通过XML文件配置的,所以选择的是ClassPathXmlApplicationContext。所以在该Spring的main方法中要调用ClassPathXmlApplicationContext来加载xml文件,并获得knight对象。

public static void main(String[] args){
  ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("**/**/**.xml");
  Knight knight = ctx.getBean(Knight.class);
  …………
  ctx.close();
}

Q:DI和IoC的关系?
A:IoC是目标,DI是方法,通过DI来实现IoC。DI通常有构造器注入和setter注入。

- AOP

把和业务无关的事务处理(安全、日志……)等独立模块抽离出来,不和业务逻辑交织在一起,并且各个组件的非业务模块能重用。
AOP能保持POJO的简单性。AOP的xml实现:

AOP.png

这里使用了AOP的配置命名空间,minstrel声明为一个切面,pointcut定义了切入点。(切入点的表达方式是AspectJ)
所以通过这样的xml配置就可以声明spring的切面,并且在knight中不需要写代码去调用mistrel就可以实现了。

- 模板

Spring提供了多种多样的模板来消除重复的样式代码,非常典型的就是JdbcTemplate。
以往的JDBC实现需要写一大堆创建数据库连接、捕获数据库异常、清理数据……的代码,每做一次数据库操作可能都要try catch一大堆代码,不光JDBC,其他的JMS、JNDI、REST一样有这样的问题。这些重复的样式代码太多了,导致核心的业务代码逻辑反而不被突出。
所以Spring提供了模板,例如提供了jdbcTemplate.queryForObject方法,把重复的样式代码封装在了jdbcTemplate里面,所以写代码的时候不需要关心这些样式代码,直接调用jdbcTemplate就行。

JdbcTemplate.png
学习了Spring如何通过DI、AOP、模板来简化java中的复杂开发,这些都是基于在xml中配置bean和aspec来做的,但是xml文件是如何被加载,又是被加载到哪里去了,这些就是[容器]来解决的。

- 容器

Spring中所有对象都生存在容器中,容器负责创建、装配、配置并管理对象的整个生命周期(从new到finalize)。

Spring容器的归纳为2种实现方式:

  • bean工厂
    org.springframework.beans.factory.BeanFactory最简单的容器,提供基本DI支持。一般现在太简单不用。
  • ApplicationContex
    org.springframework.context.ApplicationContext基于BeanFactory构建,提供框架级别的服务(例如发布事件给感兴趣的监听者),一般都用这个。上面的例子中就是通过ClassPathXMLApplicationContext来配置加载bean,ApplicationContext准备就绪后,就可以通过getBean来获取bean。这样就等于创建好了一个容器。

- W3CSchool参考链接

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

推荐阅读更多精彩内容