重新来认识你的老朋友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 ...
随机推荐
- hive执行流程分析
转自:http://blog.csdn.net/gexiaobaohelloworld/article/details/7719163 入口:bin/hive脚本中,环境检查后执行ext中的cli.s ...
- ROS 教程之 navigation :在 catkin 环境下创建costmap layer plugin
在做机器人导航的时候,肯定见到过global_costmap和local_costmap.global_costmap是为了全局路径规划服务的,如从这个房间到那个房间该怎么走.local_costma ...
- Spring 4 官方文档学习(十)数据访问之DAO支持
1.介绍 Spring 中 Data Access Object (DAO)支持 的目标是以一种一致的方式更简单的使用JDBC.Hibernate.JPA或JDO等数据访问技术.可以在前面说的几种数据 ...
- nodejs基础 -- Stream流
nodejs 的 Stream 是一个抽象接口,node中有很多对象实现了这个接口.例如,对http服务器发起请求的request对象就是一个Stream,还有stdout(标准输出)也是一个Stre ...
- 【Java 线程的深入研究3】最简单实例说明wait、notify、notifyAll的使用方法
wait().notify().notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态. 这三个方法最终调用的都是jvm级的native方法.随着jvm运行平台的不同可能有些 ...
- mysql connection不断增加
程序运行以后,刷新页面,在mysql的status里面检测到Threads_connected的值不断上升. 对程序断点调试,发现,是由于下面的代码导致. class ConnectionMySQL( ...
- 放在github pages上的静态网站怎么取消绑定自定义域名?
使用GitHub Pages搭建的静态网站绑定了自定义域名操作,但是想反悔怎么办? 删除CNAME文件,重新删除仓库,新建后均不行~ 解决办法:清除一下浏览器缓存,或者用别的浏览器打开就好了,因为之前 ...
- 启用lazyload插件,减少图片加载
使用lazyload的js插件,减少图片加载,提高页面加载速度和节省流量.虽然这个头像是第三方服务器来的,不消费博客的流量,但是能节省部分访客的加载时间,也是不错的哦. 用lazyload插件,只是后 ...
- memcached 安装使用
一.Memcached和Memcache的区别: 网上关于Memcached和Memcache的区别的理解众说纷纭,我个人的理解是: Memcached是一个内存缓存系统,而Memcache是php的 ...
- ios开发之--iOS 11适配:iOS11导航栏返回偏移
UIBarButtonItem 左边间隙过大,解决方案(ios11之前): 调用下面的方法,设置negativeSpacer.width = -15;就可以解决间隙过大的问题: UIBarButton ...