继续上一节的内容,多几个jar包:

aop技术是面向切面编程思想,作为OOP的延续思想添加到企业开发中,用于弥补OOP开发过程中的缺陷而提出的编程思想。AOP底层也是面向对象;只不过面向的不是普通的Object对象,而是特殊的AOP对象。AOP的关注点是组成系统的非核心通用服务模块(比如登录检查等),相对于普通对象,aop不需要通过继承、方法调用的方式来提供功能,只需要在xml文件中以引用的方式,将非核心服务功能引用给需要改功能的核心业务逻辑对象或方法中。最终实现对象的解耦。spring 中ioc技术实现了核心业务逻辑对象之间的解耦(如LoginAction与DaoImpl)

AOP可以说是Spring中最难理解的一个知识点了,你可能网上找了很多资料,也买过很多本书,但都不是很理解到底什么是AOP?我曾经也是琢磨了好久才有了一定的了解。那么,到底怎么讲这个知识点呢。来不及解释了,快上车!听完这个例子,我相信你一定会对AOP有一个非常深刻的理解!

让我们新建一个英雄类:

package com.spring.bean;

public class Hero {

	private String heroName;
private String type;
private String description; public String getHeroName() {
return heroName;
}
public void setHeroName(String heroName) {
this.heroName = heroName;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Hero [heroName=" + heroName + ", type=" + type + ", description=" + description + "]";
} }

再来个露娜类,继承自英雄类:

啊啊啊,放错图片了,应该是这个:

package com.spring.bean;

public class Luna extends Hero{

	/**
* 秀操作
*/
public void operation(){
System.out.println("看我月下无限连!");
} /**
* 跑路
*/
public void run(){
System.out.println("我操,大空了,赶紧跑!");
} /**
* 发信息
* @param str
*/
public void say(String str){
System.out.println(str);
} }

可以看到,露娜类有三个方法,分别是秀操作,跑路和发信息。

再写一个团战类:

package com.spring.test;

import com.spring.bean.Luna;

/**
* 团战类
* @author Administrator
*
*/
public class Battle { public void tuan(){
Luna luna = new Luna();
luna.say("上去开团!");
luna.operation(); } }

测试代码如下:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-aop.xml");
Battle battle = (Battle)context.getBean("Battle");
battle.tuan();

我们用spring把Battle类配上去。

spring-aop.xml

<bean id = 'Battle' class="com.spring.test.Battle"></bean>

运行测试代码:



在团战方法里面,我们新建一个露娜的对象,然后发出信息“上去开团”,接着又秀了一把操作。这是一个比较普通的流程。而事实上,露娜可能需要在团战前就提醒我方队友“等我集合打团”,不要人都没齐,队友就无脑往前冲。OK,我们如何通过代码来实现这个过程呢?很显然,这个过程需要在团战方法执行之前就被执行。这就需要AOP面向切面的技术了。

我们需要写一个类,实现MethodBeforeAdvice接口。

/**
* Notice 定义一个通知打团的信号 - 团战之前
* @author Administrator
*
*/
public class BeforeTuanZhan implements MethodBeforeAdvice{ @Override
public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
System.out.print(this.getClass().getName() + " -- ");
Luna luna = new Luna();
luna.setHeroName("露娜");
luna.setType("战士/法师");
luna.setDescription("月光女神");
luna.say("等我集合打团!"); } }

我们希望这个方法在团战之前就被执行,怎么做呢?没错,就是在XML文件中做如下配置:

<bean id = 'BeforeTuanZhan' class="com.spring.service.BeforeTuanZhan"></bean>

<aop:config>

		<!-- 定义所有可供露娜切入的点(方法) -->
<!-- 原则上只要时机正确,任何团战露娜都可以切进去! -->
<aop:pointcut expression="execution(* com.spring.test.Battle.*(..))" id="pointcut"/> <aop:advisor advice-ref="BeforeTuanZhan" pointcut-ref="pointcut"/> </aop:config>

execution(* com.spring.test.Battle.*(..))

这句话的含义就是,返回值为任意,com.spring.test包里面的Battle类,这个类里面所有的方法都需要切入。所谓的切入,就是在方法执行前,执行中,发生异常的时候执行某个其他的方法。执行中用的不多,一般就用另外三种情况。

现在,我们重新执行测试代码:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-aop.xml");
Battle battle = (Battle)context.getBean("Battle");
battle.tuan();

现在各位想一下,如果团战打赢了怎么办,是不是马上就该去推塔或者打龙啊,这个时候,如果队友团战打赢了就发呆,那就很坑了。所以呢,你这个时候就得提醒队友下一步该做什么,这个提醒的步骤是在团战方法执行结束后才发生的。

我们需要新建一个AfterTuanZhan类,实现AfterReturningAdvice接口。

/**
* Notice 定义一个团战结束后的类 - 团战之后
* @author Administrator
*/
public class AfterTuanZhan implements AfterReturningAdvice{ @Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
System.out.print(this.getClass().getName() + " -- ");
Luna luna = new Luna();
luna.setHeroName("露娜");
luna.setType("战士/法师");
luna.setDescription("月光女神");
luna.say("进攻敌方防御塔!");
} }

配置到spring-aop.xml中:

<bean id = 'AfterTuanZhan' class="com.spring.service.AfterTuanZhan"></bean>
<!-- 定义一个切面 -->
<aop:config> <!-- 定义所有可供露娜切入的点(方法) -->
<!-- 原则上只要时机正确,任何团战露娜都可以切进去! -->
<aop:pointcut expression="execution(* com.spring.test.Battle.*(..))" id="pointcut"/> <aop:advisor advice-ref="BeforeTuanZhan" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="AfterTuanZhan" pointcut-ref="pointcut"/> </aop:config>

现在,我们重新执行测试代码:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-aop.xml");
Battle battle = (Battle)context.getBean("Battle");
battle.tuan();

再来说说万一团战失利的情况,比如露娜断大了咋办,没错,这个时候就是团战发生了异常,我们在Battle类中手动设置一个异常:

/**
* 团战类
* @author Administrator
*
*/
public class Battle { public void tuan(){
Luna luna = new Luna();
luna.say("上去开团!");
luna.operation(); int i = 1 / 0 ; } }

然后,编写TuanZhanException类,实现ThrowsAdvice接口:

/**
* 定义一个团战异常类,万一出现情况就进入这个类
* @author Administrator
*
*/
public class TuanZhanException implements ThrowsAdvice { //该方法会在露娜团战出现异常后自动执行
public void afterThrowing(Method method, Object[] args,
Object target, Exception ex){
System.out.print(this.getClass().getName() + " -- ");
Luna luna = new Luna();
luna.run();
}
}

配置到spring-aop,xml:

<bean id = 'TuanZhanException' class="com.spring.service.TuanZhanException"></bean>
<!-- 定义一个切面 -->
<aop:config> <!-- 定义所有可供露娜切入的点(方法) -->
<!-- 原则上只要时机正确,任何团战露娜都可以切进去! -->
<aop:pointcut expression="execution(* com.spring.test.Battle.*(..))" id="pointcut"/> <aop:advisor advice-ref="BeforeTuanZhan" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="AfterTuanZhan" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="TuanZhanException" pointcut-ref="pointcut"/> </aop:config>

现在,我们重新执行测试代码:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-aop.xml");
Battle battle = (Battle)context.getBean("Battle");
battle.tuan();

总结:

1. aop面向切面,切的是什么,没错,切的是方法!
2. 怎么切,你记好了,就是你先自己规定哪些方法需要切,然后设置切入的方式:方法执行之前做什么,执行之后做什么,如果方法出现异常,又要做什么?另外还有一种方法执行的过程中做什么,只是用的比较少,反正我还没有见过在哪里用了。用的最多的就是发生异常后做什么,比如事务管理。

据说露娜要重做,玩个屁,劳资退游吃鸡去了,谢谢。

如果喜欢我的文章,还请点一波关注,谢谢老铁!

源码链接:http://pan.baidu.com/s/1o8zHMqe 密码:om9i

【Java框架型项目从入门到装逼】第二节 - Spring框架 AOP的丧心病狂解说,你喜欢露娜的月下无限连吗?的更多相关文章

  1. 【Java框架型项目从入门到装逼】第一节 - Spring框架 IOC的丧心病狂解说

    大家好,好久不见,今天我们来一起学习一下关于Spring框架的IOC技术. 控制反转--Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的 ...

  2. 【Java框架型项目从入门到装逼】第十二节 项目分层

    这一节我们开始对项目进行分层,一般来说,一个web项目的层次结构如下图所示: controller层为我们的控制层,用来接收用户的请求,比如新增一个学生的信息,新增的请求最先就是走到这一层.contr ...

  3. 【Java框架型项目从入门到装逼】第七节 - 学生管理系统项目搭建

    本次的教程是打算用Spring,SpringMVC以及传统的jdbc技术来制作一个简单的增删改查项目,对用户信息进行增删改查,就这么简单. 1.新建项目 首先,打开eclipse,新建一个web项目. ...

  4. 【Java框架型项目从入门到装逼】第五节 - 在Servlet中接收和返回数据

    在上一节的程序中,我们可以看到HttpServletRequest, HttpServletResponse这两个对象.可以说,这是JavaWeb中至关重要的两个对象.接下来,我们来做一个简短的说明: ...

  5. 【Java框架型项目从入门到装逼】第三节 - 如何用Tomcat发布web项目?

    啥叫Tomcat?有道词典是这么说的. 这个我们姑且不管,实际上呢,Tomcat是一种Web服务器,我们自己做好了一个Web项目,就可以通过Tomcat来发布.服务器呢,又分为硬件服务器和软件服务器. ...

  6. 【Java框架型项目从入门到装逼】第四节 - 编写第一个Servlet程序

    在开始这一节之前呢,我们还需要把Tomcat配置到Eclipse中,配置的方式很简单,打开Eclipse,Window,Preferences,进入到这个页面: 将Tomcat的安装目录配置到Ecli ...

  7. 【Java框架型项目从入门到装逼】第九节 - 数据库建表和CRUD操作

    1.新建学生表 这节课我们来把和数据库以及jdbc相关的内容完成,首先,进行数据库建表.数据库呢,我们采用MySQL数据库,我们可以通过navcat之类的管理工具来轻松建表. 首先,我们得建一个数据库 ...

  8. 【Java框架型项目从入门到装逼】第十四节 查询用户列表展现到页面

    这一节,我们来实现一下用户列表搜索,最终的效果如下: 这边我们要使用easyUI给我们提供的datagrid组件. HTML结构如下 <!-- 数据列表 --> <table id= ...

  9. 【Java框架型项目从入门到装逼】第八节 - 用EasyUI绘制主界面

    1.引入资源包 在上一节中,我们把基本的框架都搭好了,用了Spring,SPringMVC.这一节,我们先来画页面,前端框架采用EasyUI来实现. easyui是一种基于jQuery的用户界面插件集 ...

  10. 【Java框架型项目从入门到装逼】第十三节 用户新增功能完结篇

    这一节,我们把用户新增的功能继续做一个完善.首先,新增成功后,需要给前台返回一个信息,就是告诉浏览器,这次用户新增的操作到底是成功了呢,还是失败了呢?为此,我们需要专门引入一个结果类,里面只有两个属性 ...

随机推荐

  1. MySQL基础函数

    MySQL数据库提供了很多函数包括: 数学函数: 字符串函数: 日期和时间函数: 条件判断函数: 系统信息函数: 加密函数: 格式化函数: 一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ...

  2. C#编译器和CLI的安装

    为了完成C#程序编译和运行,需要安装代码对应版本的编译器和CLI(公共语言框架)平台. (部分内容摘自<C#本质论>) 针对主流的CLI平台(Microsoft .NET),有两种安装方案 ...

  3. 2D特效和3D特效

    2D居中效果 div{ width: height: backgroundcolor: position:absolute; left:50%; top:50%; transform:translat ...

  4. 自学 Python 3 最好的 入门 书籍 推荐(附 免费 在线阅读 下载链接)

    请大家根据自己的实际情况对号入座,挑选适合自己的 Python 入门书籍: 完全没有任何编程基础:01 号书 少量编程基础,不求全,只希望能以最快的速度入门:02 号书 少量编程基础,有一定的英文阅读 ...

  5. Golang开发者常见的坑

    Golang开发者常见的坑 目录 [−] 初级 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 偶然的变量隐藏Accid ...

  6. 使用Angularjs和Vue.js对比

    使用Angularjs和Vue.js对比 之前项目都是使用Angularjs,(注明此处主要讲Angularjs 1)在初步使用Vue.js后做一个简答的对比笔记. 首先从理论上简单说一下各自的特点, ...

  7. LeetCode 219. Contains Duplicate II (包含重复项之二)

    Given an array of integers and an integer k, find out whether there are two distinct indices i and j ...

  8. SimpleDateFormat 常规用法

    public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (d ...

  9. xml入门视频

    XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.您可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识 ...

  10. 脱壳第三讲,UPX压缩壳,以及补充壳知识

    脱壳第三讲,UPX压缩壳,以及补充壳知识 一丶什么是压缩壳.以及壳的原理 在理解什么是压缩壳的时候,我们先了解一下什么是壳 1.什么是壳 壳可以简单理解为就是在自己的PE文件中包含了代码.而有不影响我 ...