重新来认识你的老朋友Spring框架
Spring的起源和根本使命

Spring如何简化Java开发
- 基于POJO的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样版式代码
1. 基于POJO的轻量级和最小侵入性编程
/**
* @Author:jimisun
* @Description:
* @Date:Created in 20:32 2018-09-26
* @Modified By:
*/
public class HelloSpringBean {
public String sayHello() {
return "Hello Spring!!!";
}
}
你可以看到,这就是一个POJO(简单的JAVA类),没有任何地方表明它是Spring组件,Spring非侵入式编程模型意味着这个类在Spring应用和非Spring应用中都可以发挥同样的作用。尽管看起来很简单;但Spring通过IOC(Inversion of Control)管理这个POJO,然后通过DI(Dependency Inject)来注入他们,这个POJO就变的魔力十足;那么DI是如何帮助应用对象彼此之间保持松耦合的呢?
2. 通过依赖注入和面向接口实现松耦合
/**
* @Author:jimisun
* @Description:
* @Date:Created in 07:44 2018-09-27
* @Modified By:
*/
public class BeautifulGirl implements Gril { private EatAction eat;
public BeautifulGirl() {
this.eat = new EatAction();
}
@Override
public void action() {
eat.action();
}
}
在BeautifulGirl(可爱的小女孩)这个类中,在构造方法中创建一个EatAction(吃饭动作)。这样就极大限制了BeautifulGirl(可爱的小女孩)的能力;如果现在小女孩需要去玩耍呢?或者需要去睡觉呢?真是太抱歉了,BeautifulGirl(可爱的小女孩)只会吃东西这个动作。这是什么原因呢?这就是BeautifulGirl(可爱的小女孩)和EatAction(吃饭动作)这两个类紧紧耦合在了一起!紧密耦合同时会造成代码的难以测试,难以服用,难以理解,并且典型地表现出"打地鼠“式的Bug特性(修复一个Bug,将会出现一个或多个新Bug),所以我们可以知道耦合是必须的,但必须谨慎管理耦合,但是怎么才算是谨慎处理耦合关系呢?

/**
* @Author:jimisun
* @Description:
* @Date:Created in 07:44 2018-09-27
* @Modified By:
*/
public class BeautifulGirl implements Gril { private Action action; public BeautifulGirl(Action action) {
this.action = action;
} @Override
public void action() {
action.action();
}
}
从上面实例代码中可以看到BeautifulGirl本身并没有创建任何的动作,而是通过构造方法传入一个实现了Action(动作)接口的实现类即可,也就是说BeautifulGirl可以完成任意实现了Action接口的动作(睡觉啦...玩耍啦...旅行啦....)。这里的要点是BeautifulGirl没有与任何特定的Action发生耦合。BeautifulGirl只需要的是一个实现Action接口就行,对象本身只是通过接口(而非具体实现或初始化过程)来表明依赖关系,那么这种依赖就能够在BeautifulGirl不知情的情况下替换不同的具体动作。好了我们现在明白了DI进行依关系解耦的原理了,下面我们看一下如何在Spring中应用DI。example4实例源码下载
<?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-4.0.xsd"> <bean class="com.jimisun.spring.example4.BeautifulGirl" id="beautifulGirl">
<constructor-arg ref="action"/>
</bean> <bean class="com.jimisun.spring.example4.SleepAction" id="action"></bean> </beans>
/**
* @Author:jimisun
* @Description:
* @Date:Created in 07:53 2018-09-27
* @Modified By:
*/
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");
BeautifulGirl beautifulGirl = (BeautifulGirl) context.getBean("beautifulGirl");
beautifulGirl.action();
context.close();
}
}
这样执行Main方法,从Context中获取BeautifulGirl实例执行action方法。当然Spring提供了基于Java的配置,可作为XML配置文件的代替方案example5实例源码下载
/**
* @Author:jimisun
* @Description:
* @Date:Created in 08:40 2018-09-27
* @Modified By:
*/
@Configuration
public class SpringConfig { @Bean
public SleepAction sleepAction() {
return new SleepAction();
} @Bean
public BeautifulGirl beautifulGirl() {
return new BeautifulGirl(sleepAction());
}
}
/**
* @Author:jimisun
* @Description:
* @Date:Created in 07:53 2018-09-27
* @Modified By:
*/
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
SleepAction action = applicationContext.getBean(SleepAction.class);
action.action();
}
}
3. 基于切面和惯例进行声明式编程
/**
* @Author:jimisun
* @Description:
* @Date:Created in 09:32 2018-09-27
* @Modified By:
*/
public class Parent {
public void check() {
System.out.println("检查动作是否安全.......");
}
}
非常简单!Parent(家长类)只有一个方法就是check,那么现在就让Parent对BeautifulGirl的执行动作进行检查吧。
<bean class="com.jimisun.spring.example6.BeautifulGirl" id="beautifulGirl">
<constructor-arg ref="action"/>
<constructor-arg ref="parent"/>
</bean> <bean class="com.jimisun.spring.example6.SleepAction" id="action"></bean>
<bean class="com.jimisun.spring.example6.Parent" id="parent"></bean>
</beans>
/**
* @Author:jimisun
* @Description:
* @Date:Created in 07:44 2018-09-27
* @Modified By:
*/
public class BeautifulGirl implements Girl { private Action action; private Parent parent; public BeautifulGirl(Action action, Parent parent) {
this.action = action;
this.parent = parent;
} @Override
public void action() {
parent.check();
action.action();
}
}
- 管理Parent家长的check动作真的是美丽的小女孩的职责吗?
- 将Parent家长注入到美丽的小女孩类中不是将代码复杂化了吗?
- 我们需不需要一个不需要家长注入的美丽的小女孩呢?
- 如果注入的Parent为NULL我们是否应该在美丽的小女孩中进行校验呢?
<!--声明Bean-->
<bean class="com.jimisun.spring.example7.Parent" id="parent"></bean> <!--声明切面-->
<aop:config>
<aop:aspect ref="parent">
<aop:pointcut id="girlAction" expression="execution(* com.jimisun.spring.example7.Action.*(..))"/>
<aop:before pointcut-ref="girlAction" method="check"/>
</aop:aspect>
</aop:config>
/**
* @Author:jimisun
* @Description:
* @Date:Created in 07:44 2018-09-27
* @Modified By:
*/
public class BeautifulGirl implements Girl { private Action action; public BeautifulGirl(Action action) {
this.action = action;
} @Override
public void girlAction() {
action.action();
}
}
4. 通过切面和模板减少样版式代码
/**
* @Author:jimisun
* @Description:
* @Date:Created in 11:13 2018-09-27
* @Modified By:
*/
public class Main {
public static void main(String[] args) {
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.execute("select * from user");
}
}
Java开发之上帝之眼系列教程其他文章
本文资料来源:
勘误&感谢
本系列文章资料来源很多出自于互联网和在下本身的见解,受限于个人技术能力水平和其他相关知识的限制,相关见解错误或者资料引用错误请各位帮助留言校正!引用资料多来自于互联网,在下在引用前会遵循各位前辈或者博主的引用说明表示感谢,但互联网资料多是转发再转发或存在遗漏请原作者内信联系指正。
重新来认识你的老朋友Spring框架的更多相关文章
- Spring框架概述
Spring是最流行的Java企业级应用开发框架,全球数以百万的开发者在使用Spring框架创建高性能.易测试.可重用的代码. Spring框架的核心特性可以应用于任何Java应用,但扩展的JavaE ...
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
- Spring 框架的架包分析、功能作用、优点,及jar架包简介
Spring 框架的架包详解 Spring的作用 Spring的优势 由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或 ...
- 最新 Eclipse IDE下的Spring框架配置及简单实例
前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...
- spring框架学习(三)
一.Spring自动组件扫描 Spring 提供组件扫描(component scanning)功能.它能从指定的classpath里自动扫描.侦测和实例化具有特定注解的组件. 基本的注解是@Comp ...
- Spring框架学习(一)
一. spring概述 Spring 框架是一个分层架构,由 7 个定义良好的模块组成.Spring 模块构建在核心容器之上,核心容器定义了创建.配置和管理 bean 的方式,如图 1 所示. 图 1 ...
- Spring 系列: Spring 框架简介 -7个部分
Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...
- 使用 Spring Boot 快速构建 Spring 框架应用--转
原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/ Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2 ...
- 【Spring】浅析Spring框架的搭建
c目录结构: // contents structure [-] Spring是什么 搭建Spring框架 简单Demo 1,建立User类 2,建立Test类 3,建立ApplicationCont ...
随机推荐
- 让IE6支持min-height,max-height等的方法
1.IE6支持max-height解决方法 IE6支持最大高度解决CSS代码:.yangshi{max-height:1000px;_height:expression((document.do ...
- jQuery客户端分页
01 <script src="/js/jquery-1.4.1.js" type="text/javascript"></script> ...
- mssql 设置id自增 设置主键
主键自增长列在进行数据插入的时候,很有用的,如可以获取返回的自增ID值,接下来将介绍SQL Server如何设置主键自增长列,感兴趣的朋友可以了解下,希望本文对你有所帮助 1.新建一数据表,里 ...
- 美化VC界面(用户登录界面)
源代码:下载 VC开发程序单调的界面相信大家都是深有感触,提到界面美化编程,人们都会说做界面不要用VC写,太难了.一句俗语:难者不会,会者不难.VC的美化界面编程并没有人们想像的那么难.这篇文章是我写 ...
- 转载:QT QTableView用法小结
出自: http://blog.chinaunix.net/uid-20382483-id-3518513.html QTableView常用于实现数据的表格显示.下面我们如何按步骤实现学生信息表格: ...
- PHP删除目录及目录下所有文件或删除指定文件
PHP删除目录及目录下所有文件或删除指定文件 <?php header("content-type:text/html;charset=utf-8"); /** * 删除目录 ...
- PL/SQL中decode函数简介
今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: 主要作用:将查询结果翻译成其他值(即 ...
- apache Storm之一-入门学习
准备工作 这个教程使用storm-starter项目里面的例子.我推荐你们下载这个项目的代码并且跟着教程一起做.先读一下:配置storm开发环境和新建一个strom项目这两篇文章把你的机器设置好. 一 ...
- mysql 异常 Lock wait timeout exceeded; try restarting transaction;expc=java.sql.SQLExcept
这种一般是等锁超时了,可以设置延长等锁时间. mysql> set innodb_lock_wait_timeout=100 Query OK, 0 rows affected (0.02 se ...
- CSS使用学习总结
尽量少使用类,因为可以层叠识别,如: .News h3而不必在h3上加类 <div class=”News”> <h3></h3> <h2></h ...