Spring的两个核心特性:

  • 依赖注入(dependency injection,DI)
  • 面向切面编程(aspect oriented programming,AOP)

依赖注入(dependency injection,DI)

  • 没有使用依赖注入时:以前每个POJO(Plain Ordinary Java Object,简单的Java对象)在创建的时候会主动的去获取依赖。从代码上的体现是一个类中有实例化另一个类的对象(耦合度高)。我们需要将相互协作的对象引用赋给它。
  • 三种依赖注入方式:setter方法注入,构造器注入,接口注入(就是在接口中声明一个方法,参数是依赖的对象)。
  • 依赖注入作用:将各个相互协作的模块代码保持松散耦合。
  • 下面我们通过几个简单的类来了解一下依赖注入:

先声明两个接口People与Fruit。

public interface People {// people接口
void eat();
} public interface Fruit {// 水果接口
void speak();
}

接下来是分别实现他们的类Watermelon与Student。

public class Watermelon implements Fruit{// 西瓜类
@Override
public void speak() {
System.out.println("我是西瓜,我要被吃掉了!");
}
} public class Student implements People {// 学生类
private Fruit fruit; public Student(Fruit fruit) {// 构造器注入依赖的对象
this.fruit = fruit;
} @Override
public void eat() {
fruit.speak();
}
}

到这里我们可以看出Student类依赖Watermelon类。当调用Student的eat方法时需要调用Watermelon的speak方法。

我们接下来用XML对这两个应用组件进行装配(wiring)。

<?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.xsd"> <!--水果声明为Spring的bean-->
<bean id="fruit" class="com.qsh.springaction.Watermelon"/>
<!--人声明为Spring的bean-->
<bean id="people" class="com.qsh.springaction.Student">
<constructor-arg ref="fruit"/>
</bean>
</beans>

最后我们进行测试。用spring上下文全权负责对象的创建和组装。

public class TestEat {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("eat.xml");
People people = context.getBean(People.class);
people.eat();
context.close();
}
}

测试结果。

面向切面编程(aspect oriented programming,AOP)

  • 是什么:促使软件系统实现关注点分离的一项技术。系统由许多不同组件构成,每个组件负责一块特定功能。除了实现自身核心功能外,这些组件还承担着额外职责,如日志,事务管理和安全这样的系统服务,这样的系统服务被称为横切关注点。因为他们会横跨多个组件。
  • 作用:有助于横切关注点与它们所影响的对象之间的解耦。
  • 个人理解:每个组件除了实现自身的功能,还需要实现其他的如事物管理等功能(称为横切关注点)。我们将这功能单独抽取出来成一个模块,每个组件在工作的过程中,这个模块神不知鬼不觉的为每个组件实现额外功能。
  • 个人理解的切面图:应用组件:实现各自功能的代码。横切关注点:每个组件的额外业务,相同的代码。切面:将横切关注点模块化出来的一个类。连接点:应用执行时能够插入切面的点(超级多)切点:匹配其中一个或多个连接点。

  • 通过几段代码讲解AOP:

我们还是有上面的Student 和 Watermelon类。需要新增加一个Action类,就是一会的切面。

public class Action {// 行为类

    public void beforeEat() {
System.out.println("吃前拿刀,嚓嚓嚓");
} public void afterEat() {
System.out.println("吃后洗手,哗哗哗");
}
}

需要在XML中加入Spring AOP命名空间,将Action方法声明为Spring的bean,然后切面引用这个bean。切点为student的eat方法,在切点前后加入前置通知和后置通知。

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"> <!--水果声明为Spring的bean-->
<bean id="fruit" class="com.qsh.springaction.Watermelon"/>
<!--人声明为Spring的bean-->
<bean id="people" class="com.qsh.springaction.Student">
<constructor-arg ref="fruit"/>
</bean>
<!--行为声明为Spring的bean-->
<bean id="action" class="com.qsh.springaction.Action"/> <!--用spring aop的命名空间把Action声明为一个切面-->
<aop:config>
<!--引用Action的bean-->
<aop:aspect ref="action">
<!--声明Student的eat方法为一个切点-->
<aop:pointcut id="eating" expression="execution(* *.eat(..))"/>
<!--前置通知,在调用eat方法前调用Action的beforeEat方法-->
<aop:before pointcut-ref="eating" method="beforeEat"/>
<!--后置通知,在调用eat方法后调用Action的afterEat方法-->
<aop:after pointcut-ref="eating" method="afterEat"/>
</aop:aspect>
</aop:config>
</beans>

运行结果为:

5分钟简述Spring中的DI与AOP的更多相关文章

  1. 如何快速理解Spring中的DI和AOP

    前言 Spring框架通过POJO最小侵入性编程.DI.AOP.模板代码手段来简化了Java 开发,简化了企业应用的开发.POJO和模板代码相对来说好理解,本篇重点解读下DI和AOP. 一 DI DI ...

  2. 详谈 Spring 中的 IOC 和 AOP

    这篇文章主要讲 Spring 中的几个点,Spring 中的 IOC,AOP,下一篇说说 Spring 中的事务操作,注解和 XML 配置. Spring 简介 Spring 是一个开源的轻量级的企业 ...

  3. Spring中基于xml的AOP

    1.Aop 全程是Aspect Oriented Programming 即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的同一维护的一种技术.Aop是oop的延续,是软件开发中的 一个热点 ...

  4. 用通俗的语言解释 Spring 中的 DI 、IOC 和AOP概念

    DI 所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是 ...

  5. 一分钟掌握Spring中bean的生命周期!

    Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean 的别名只能维持 ...

  6. 理解Spring中的IOC和AOP

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式 IOC就是典型的工厂模式,通过ses ...

  7. spring中基于注解使用AOP

    本文内容:spring中如何使用注解实现面向切面编程,以及如何使用自定义注解. 一个场景 比如用户登录,每个请求发起之前都会判断用户是否登录,如果每个请求都去判断一次,那就重复地做了很多事情,只要是有 ...

  8. 在Spring中使用AspectJ实现AOP

    在Spring中,最常用的AOP框架是AspectJ,使用AspectJ实现AOP有2种方式: 基于XML的声明式AspectJ 基于注解的声明式AspectJ 基于XML的声明式AspectJ 1. ...

  9. 解释Spring中IOC, DI, AOP

    oc就是控制翻转或是依赖注入.通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象,而是通过spring的bean工厂为你长生这样一个对象.aop就是面向切面的编程.比如说 ...

随机推荐

  1. 蛋疼的mysql_ping()以及MYSQL_OPT_RECONNECT

    From: https://www.felix021.com/blog/read.php?2102 昨天@Zind同学找到我之前的一篇blog(已经修改),里面提到了mysql_ping和MYSQL_ ...

  2. Nginx配置详细

    ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_ ...

  3. JConsole & JVisualVM远程监视Websphere服务器JVM的配置方法

    原文链接:http://xjsunjie.blog.51cto.com/999372/1331880/ jconsole是JDK里自带的一个工具,可以监测Java程序运行时所有对象的申请.释放等动作, ...

  4. 基金 、 社保和QFII等机构的重仓股排名评测

    来源:基金前20大重仓股持仓股排名 基金前15大重仓股持仓股排名 基金重仓前15大个股,相较于同期沪深300的平均收益, 近1月:2.23%, 近3月:3.09%, 近6月:9.61%, 近1年:13 ...

  5. 断网环境下利用pip安装Python离线安装包

    这几天搞Windows离线断网环境下安装Python包,配置环境,各种坑!做个记录,供以后查询吧. # 生产环境 windows 7 # python 2.7.9 # pip 1.5.2 友情提示:当 ...

  6. libuv示例代码

    https://github.com/nikhilm/uvbook/tree/master/code

  7. 安装 powerline

    使用说明: https://powerline.readthedocs.io/en/latest/usage.html ~ vim,在 .vimrc 中添加配置 set rtp+=/usr/lib/p ...

  8. Nodejs----登录验证

    1. 写在前面 当我们登录了一个网站,在没有退出登录的情况下,我们关闭了这个网站 ,过一段时间,再次打开这个网站,依然还会是登录状态.这是因为,当我们登录了一个网站,服务器会保存我们的登录状态,直到我 ...

  9. N!

    求N! Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N ...

  10. datagrid--新增

    先在datagrid中添加toolbar配置项,增删改差的按钮,有3个属性,按钮名称,图标,回调函数,点击按钮会弹出一个对话框dialog,dialog是关闭的,closed=true, toolba ...