Spring AOP对于刚開始学习spring的同学来说有点难以理解。我刚工作的时候都没怎么理解,如今略微理解了一点,所以在这里我将用嘴简单的样例,最通俗易懂的话语来说出我的理解,可能因为我对Spring AOP理解还不够深入。有些地方理解还有误,各位大神要是看出来了请指正。

1.AOP介绍

AOP就是面向切面编程,是面向对象编程的一种补充。

假设面向对象编程中产生的一个个对象,看成是一个个珍珠的话,那么面向切面编程中的切面能够说是串起每一个珍珠的细线了。

以下是AOP的一些基本概念。可能和你曾经看到的不太一样。也不是那么准确。但很好理解(呵呵。由于是我自己的一些理解)。

比方有老师,学生这两个类,学生有读书。玩游戏这两个方法,老师有上课,管理学生这两个方法。但我想记录老师和学生的一举一动。

假设没有面向切面编程的话。可能我们我们会将记录动作这种方法加在学生和老师这两个类里面的每一个方法前面,这样就会导致大量的代码冗余,也会造成记录动作和所做的动作之间的关系的耦合度很之高。

假设用面向切面编程的思想来解决这一问题的话,我们能够将记录动作这个行为给封装起来产生一个新的类。

再在学生或是老师有动作要发生的时候,调用记录动作这个类里面的记录动作方法。有人要问了。你这样和前面的有什么差别,如今看确实没什么差别,可是当我们将这个调用记录动作这种方法交给程序自己来完毕,不须要我们一个个手动加入的时候是不是会认为非常方便,并且我们想要改动记录动作的效果。比方想记录慢动作。那我们仅仅需改动一个地方。这样看起来是不是非常方面。并且他俩者之间的关联性也减少了。

前面举的一个样例仅仅是为了更好的理解AOP里面的那些概念。当把AOP里面的一个个概念摆出来的时候,你即使背住了它,也非常难将这些概念和我们实际运用联系在一起。

方面:就是将那些与业务无关,却为业务逻辑模块所共同调用的逻辑封装组成一个新的模块,这个模块就能够看成是哟个方面。上面的样例里记录动作的这个类就能够看成是一个方面。

通知: 在切面类中,声明对业务方法做额外处理的方法。

业务类中指定的方法。作为切面切入的点。

各种类型的通知包含“around”、“before”和“throws”通知。能够将记录动作里面的记录动作这种方法看做是一个通知。

切入点:业务类中指定的方法,作为切面切入的点,能够将学生读书这个动作作为一个切入点。由于学生在做读书这个动作的时候会记录这个动作。

目标对象:要被切面横切的对象。

比方学生或老师这两个对象都能够看做是一个目标对象。

代理对象:能够将织入了通知的目标对象形成新的对象看成是代理对象。这个对象是实际中不存在的。是spring容器生成的。比方学生这个对象本来仅仅有读书和玩游戏这两个动作的。可是要记录学生的这两个动作,那么在这两个动作的前面都会加上记录动作这种方法,这就生成了一个新的对象,能够将这个看成是代理对象。

另一点:当目标对象不是某个接口的实现的话,会用cglib代理,否则就会使用jdk动态代理

2.代码:

package spring.test;

public interface Student {

	public void selfIntruction(String name,String home);

	public void startGoClass();

	public void endGoClass();

}
package spring.test;

public class StudentImpl implements Student{

	private Teacher teacher;

	public Teacher getTeacher() {
return teacher;
} public void setTeacher(Teacher teacher) {
this.teacher = teacher;
} public void selfIntruction(String name,String home){
System.out.println("学生:大家好。我叫"+name+",来自"+home);
} public void startGoClass(){
teacher.sartClass();
System.out.println("学生:我要開始认真听讲了");
teacher.classing();
} public void endGoClass(){
System.out.println("学生:快要下课了");
teacher.endClass();
} }
package spring.test;

public class Teacher {
public void selfIntruduction(){
System.out.println("老师:我是李易峰,在三合中学教数学");
} public void sartClass(){
System.out.println("老师:同学们開始上课了");
} public void classing(){
System.out.println("老师:同学们:1+1=? ");
} public void endClass(){
System.out.println("老师:同学们能够下课歇息了");
} }
package spring.test;

/**
*方面类
* @author user
* 2015-07-09
*
*/ public class aopDAO { /**
* 通知方法
*/
public void doBefore(){
System.out.println("今天的天气真好!");
} public void doAfter(){
System.out.println("今天最终忙完了。能够歇息了");
} public void doAround(){
System.out.println("尽管忙还是要吃饭的!");
} }

applicationContext.xml

<?

xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<bean id="teacher" class="spring.test.Teacher"></bean> <bean id="student" class="spring.test.StudentImpl">
<property name="teacher" ref="teacher"></property>
</bean>
<!-- 定义方面 -->
<bean id="aopdao" class="spring.test.aopDAO"></bean>
<aop:config>
<!--
切入点。定义目标 execution(* spring.test.*.*(..))表示spring.test包下的全部类的全部方法,
第二个*代表全部类。第三个*代表着这个类的全部方法,(..)代表传入方法的參数为0个或多个
-->
<aop:pointcut expression="execution(* spring.test.*.*(..))" id="pointcut"/>
<aop:aspect id="testAspect" ref="aopdao">
<!-- 通知 -->
<aop:before method="doBefore" pointcut-ref="pointcut"/>
<aop:after method="doAfter" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
<!--
总体解读就是当程序在运行spring.test包下的某个类里面的某个方法时。程序会先运行aopDAO类里面的doBefore方法,
当pring.test包下的某个类里面的某个方法运行完成后。程序还会运行aopDAO类里面的doAfter方法。够直观了吧,我相信你一定懂了
-->
</beans>
package spring.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class springTest {
public static void main(String[] args){
String conf = "/spring/test/applicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(conf);
Student student = context.getBean("student",Student.class);
student.startGoClass();
System.out.println("***************************************");
Teacher teacher = context.getBean("teacher",Teacher.class);
teacher.sartClass(); } }

最后执行的结果:

老师:同学们開始上课了

今天最终忙完了,能够歇息了

学生:我要開始认真听讲了

今天的天气真好!

老师:同学们:1+1=?

今天最终忙完了,能够歇息了

今天最终忙完了,能够歇息了

***************************************

今天的天气真好!

老师:同学们開始上课了

今天最终忙完了,能够歇息了

假设你看了这篇文章认为对你理解spring aop实用,请看在作者饿着肚子的情况下点个赞吧。下班了,回去咯。

SpringAOP 基础具体解释的更多相关文章

  1. SpringAOP基础

    例1.已知有这么一段代码,会打印出Hello public static void main(String[] args) { sayHello(); } public static void say ...

  2. Swift学习——Swift基础具体解释(一)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhenyu5211314/article/details/34807025 注:由于基础部分在Swi ...

  3. Spring知识点总结(四)之SpringAOP基础

        1. Spring aop中的基本概念        • 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候.在Spring AOP中,一个连接 ...

  4. Mysql基础之 基础知识解释

    Mysql基础知识 RDBMS:关系型数据库管理系统.是将数据组织成相关的行和列的系统 存储过程:是存储在数据库中的一段声明性语句.触发器.java.php等都可以调用其存储过程.早期的mysql版本 ...

  5. 自动化测试第一季-selenium + python(环境搭建与基础代码解释)

    # coding = utf-8              %%%%%%%%%%%%%%%%防止乱码(可加可不加) from selenium import webdriver             ...

  6. SpringAOP基础 - 静态代理设计模式

    代理模式在实现过程中,要创建一个接口(社交技巧-接口),代理类(经纪人 - 类)和真实类(范冰冰 - 类)同时实现这个接口. 举个例子: 我们想要找范冰冰吃饭,但是呢,她是大明星,不可能轻易见我们,我 ...

  7. Spring知识点总结(四)之SpringAOP基础 - 代理设计模式

        1. 分析程序中存在的问题(高内聚,低耦合)        通过springIOC DI) 以及注解的使用,成功解决了在程序中层与层之间出现的耦合的问题,但是在很多地方仍然存在非该层应该实现的 ...

  8. JDK版本基础知识解释

    感谢大佬:https://www.cnblogs.com/bjguanmu/articles/8710209.html jdk:java development kit,是程序员编写java程序需要的 ...

  9. 一篇文章带你掌握主流基础框架——Spring

    一篇文章带你掌握主流基础框架--Spring 这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容 那么简单说明一下Spring的必要性: Spring技 ...

随机推荐

  1. 开发者必须知道的HTML5十五大新特性

    HTML5想必大家都很熟悉了,因为太多的媒体在讨论这一技术.然而,你能准确地说出HTML5带来了哪些新特性吗?本文总结了HTML5带来的15项你必须知道的新特性. 一起来看下: 1.新的文档类型  ( ...

  2. hdu 2516(斐波拉切博弈)

    题意:容易理解. 分析:通过枚举寻找规律,这就是做1堆或者2堆石子博弈的技巧!当为2或者3时,肯定是第二个人赢,当为4时,先去一个石子,然后当对方面临3,于是第一个人赢, 当为5时,取1时,第二个人赢 ...

  3. 【转载】HBase基本概念和hbase shell常用命令用法

    1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...

  4. selenium中处理不带ID的弹出窗口

    在selenium中虽然有selectWindow(String windowID) 方法,但是对于一些窗口很难取得其window ID的话,如果开发人员没有在html代码中提供ID ,或者getAl ...

  5. 数往知来 CSS<十二>

    div+css基础 一.外部样式<!--外部样式可以使网页与样式分离,分工处理 1.写网页,主要提供内容,一般都会有固定的结构,具有id等属性的标签包括特定的内容 2.根据结构写样式另存为css ...

  6. 【C#】构造函数的特点

    1.它的函数名与类名相同:2.它可以重载:3.不能指定返回类型,即使是void也不行:4.虽然在一般情况下,构造函数不被显式调用,而是在创建对象时自动被调用.但是并不是不能被显示调用.有些时候是一定要 ...

  7. Code-first示例

    首先创建一个空数据库 在vs2013中添加数据库类,按提示操作一直下一步   添加完以后,数据库类的代码 namespace mvctest.Models { using System; using ...

  8. win7中protel99添加元件库

    protel打开时默认添加Miscellaneous Devices.lib,点击ADD/REMOVE按钮添加所需要的库时,弹出“文件无法识别”. 点击面板右下方“FIND”按钮,弹出如下对话框时不要 ...

  9. webservice注释

    @WebService 1.serviceName: 对外发布的服务名,指定 Web Service 的服务名称:wsdl:service.缺省值为 Java 类的简单名称 + Service.(字符 ...

  10. xargs 简单功能

    之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: find /sbin -perm +700 |ls -l       这个命 ...