Spring框架简介

Spring框架简介

Spring框架主要可以分为3个核心内容:

  • 容器
  • 控制反转(IoC ,Inversion of Control)
  • 面向切面编程(AOP ,Aspect-Oriented Programming)

Spring的特点:

组件之间的依赖关系由容器在运行期决定 ,由容器动态的将某种依赖关系注入到组件之中。

参考文章:blog.csdn.net/cainiaowys/article/details/7107925

1.使用容器解决问题:

消除实现依赖一般可以通过添加一个容器类来解决。在例子程序容器代码如下:

//容器类
publicclassContainer {
publicstaticContainer instance;
privateMap components;
publicContainer(){
component =newHashMap();
instance =this;
ReportGenertor reportGenertor =newSMSReportGenertor();
components.put(“reportGenertor”, reportGenertor);
ReportService reportService =newReportService();
components.put(“reportService”, reportService);
}
publicObject getComponent(String id){
returncomponents.get(id);
}
}

使用容器后,模块A的ReportService的属性实现方法也发生了变化。

//服务类变更,降低了耦合
publicclassReportService{

//private ReportGenerator reportGenerator = new SMSReportGenerator();
privateReportGenerator reportGenerator = (ReportGenerator) Container.instance.getComponent(“reportGenerator”);

publicvoidgenerateMonthlyReport(intyear,intmonth) {
...
}
}

这样的话,class都在容器中实现,使用者只需要在容器中查找需要的实例,开发人员修改模块B后(在模块中增加邮件报表生成类MailReportGenerator),只需要在容器类中修改声明(把ReportGenertor reportGenertor = new SMSReportGenertor();改为ReportGenertor reportGenertor = new MailReportGenertor();)即可,模块A不需要修改任何代码。一定程度上降低了模块之间的耦合。
但是,在程序中(ReportGenerator)Container.instance.getComponent(“reportGenerator”)的方法取得容器中SMSReportGenertor的实例,这种用字符(“reportGenerator”)指代具体实现类SMSReportGenertor 的方式并没有完全的解决耦合

2.控制反转与依赖注入

这种反转资源获取方向的思想被称为控制反转(IoC,Inversion of Control),使用控制反转后,容器主动地将资源推送给需要资源的类(或称为bean)ReportService,而ReportService需要做的只是用一种合适的方式接受资源。
ReportService类接受资源的方式有多种,其中一种就是在类中定义一个setter方法,让容器将匹配的资源注入:setter的写法如下:

//为需要依赖注入的类加入一种被称为setter的方法

publicclassReportService{

/*private ReportGenerator reportGenerator =
(ReportGenerator) Container.instance.getComponent(“reportGenerator”); */

privateReportGenerator reportGenerator;

publicvoidsetReportGenerator( ReportGenerator reportGenerator) {
this.reportGenerator = reportGenerator;
}

publicvoidgenerateMonthlyReport(intyear,intmonth) {
...
}
}

在容器中把依赖注入:

//容器类
publicclassContainer {

...
publicContainer ( ) {
component =newHashMap();
instance =this;
ReportGenertor reportGenertor =newSMSReportGenertor();
components.put(“reportGenertor”, reportGenertor);

ReportService reportService =newReportService();
reportService.setReportGenerator(reportGenerator);//使用ReportService的setter方法注入依赖关系
components.put(“reportService”, reportService);
}
...
}

这样一来ReportService就不用管SMSReportGenertor在容器中是什么名字,模块A对于模块B只有接口依赖,做到了松耦合。
Spring IoC容器的XML配置
每个使用Spring框架的工程都会用到容器与控制反转,为了代码复用,Spring把通用的代码独立出来形成了自己的IoC容器供开发者使用:
与上面例子中实现的容器相比,Spring框架提供的IoC容器要远远复杂的多,但用户不用关心Spring IoC容器的代码实现,Spring提供了一种简便的bean依赖关系配置方式------使用XML文件,在上面的例子中,配置依赖关系只要在工程根目录下的“application.xml”编辑如下内容:

XML代码参考:blog.csdn.net/cainiaowys/article/details/7107925

是标准的XML头,xmlns引用的是一些命名空间,两个一般在工程中自动生成。后面的内容由用户输入,主要表示实例化SMSReportGenerator,实例化ReportService并把SMSReportGenerator的对象smsReportGenerator赋值给ReportService的属性reportGenerator,完成依赖注入。

3.用AOP解决问题

Spring框架利用了代理模式的思想,提出了一种基于Java注解(Annotation)和XML配置的面向切面编程方法(AOP ,Aspect-Oriented Programming)简化了编程过程。AOP类似于代理模式。

//切面模块实现
@Aspect//注解1
publicclassLogAspect{

@Before(“execution(* *.*(..))”)//注解2
publicvoidLogBefore(JoinPoint joinPoint)throwThrowable{
log4j.info(“开始:方法”+ joinPoint.getSignature().getName() );
}

@After(“execution(* *.*(..))”)//注解3
publicvoidLogAfter(JoinPoint joinPoint)throwThrowable{
log4j.info(“结束:方法”+ joinPoint.getSignature().getName() );
}
}

实现完切面类后,还需要对Spring工程中的application.xml进行配置以便实现完整的动态代理:
AOP配置XML文件参考:blog.csdn.net/cainiaowys/article/details/7107925

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

推荐阅读更多精彩内容

  • Spring 框架简介 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一...
    JACK_岩阅读 660评论 0 6
  • 新的一年伊始,由于公司内部组织架构调整,本来是做Android方面开发的,近来要转做下发接口开发,不可避免就要去学...
    斜杠时光阅读 39,090评论 5 61
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 16,445评论 1 133
  • 我能想到一件事 那时你在春风里 柳丝飘飘 那时我在屋檐角 可不可以跃向你 我不会太调皮 也许只是抱抱你 你若不愿意...
    殷殷囷囷阅读 150评论 2 5