Spring AOP

     

Spring AOP

 

1. Spring AOP 概述 1-1

1.1. 何为AOP 1-1

1.2. AOP要解决什么问题? 1-1

1.3. AOP实际项目应用场景? 1-2

1.4. AOP底层原理实现分析? 1-2

2. Spring AOP 编程实现 2-2

2.1. AOP 基本步骤 2-2

2.2. AOP 基于xml实现 2-2

2.2.1. 创建项目添加依赖 2-3

2.2.2. 添加spring配置文件 2-3

2.2.3. 创建核心业务类 2-4

2.2.4. 创建日志处理类 2-4

2.2.5. 配置bean对象 2-5

2.2.6. 编写测试类 2-6

3. 总结 3-7

3.1. 重点和难点分析 3-7

3.2. 常见FAQ 3-7

 

1. Spring AOP 概述

1.1. 何为AOP

AOP 是软件设计领域中的面向切面编程,它是面向对象编程的一种补充和完善

实际项目中我们通常将面向对象理解为一个静态过程(例如一个系统有多少模块,一个模块有哪些对象,对象有哪些属性),面向切面理解为一个动态过程(

在对象运行时动态织入一些功能。)

 

1.2. AOP要解决什么问题?

实际项目中通常会将系统两大部分:核心关注点和非核心关注点

思考?

编程过程中首先要完成的是什么?核心关注点(核心业务)

非核心关注点如何切入到系统中?硬编码(违背OCP)AOP(推荐)

 

AOP就是要在基于OCP在不改变原有系统核心业务代码的基础上动态添加一些扩展功能。

 

1.3. AOP实际项目应用场景?

 

AOP 通常应用于日志的处理,事务处理,权限处理,缓存处理等等。

 

 

1.4. AOP底层原理实现分析?

 

AOP底层基于代理机制实现功能扩展:(了解)

1) 假如目标对象(被代理对象)实现接口,则底层默认采用JDK动态代理机制为目标对象创建代理对象(目标类和代理类会实现共同接口)

2) 假如目标对象(被代理对象)没有实现接口,则底层默认采用CGLIB代理机制为目标对象创建代理对象(默认创建的代理类会继承目标对象类型)。

 

2. Spring AOP 编程实现

 

2.1. AOP 基本步骤

 

step1:创建maven java 项目

step2:添加aop依赖

step3:配置aop 核心(基于xml,基于注解)

step4:定义核心业务(核心关注点):推荐先写接口再写实现类

step5:定义扩展业务(非核心关注点)

step6:基于配置实现非核心业务的切入

step7:编写测试类进行单元测试

 

2.2. AOP 基于xml实现

 

通过AOP为核心业务类添加日志处理

2.2.1. 创建项目添加依赖

创建maven java 项目然后添加依赖

 

       <dependency>

  <groupId>org.springframework</groupId>

  <artifactId>spring-context</artifactId>

  <version>4.3.9.RELEASE</version>

   </dependency>

<!--

Spring AOP的实现依托于Aspect框架

所以要引用1.8.5有问题

-->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

<version>1.8.9</version>

</dependency>

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>1.8.9</version>

</dependency>

 

2.2.2. 添加spring配置文件

 

<?xml version="1.0" encoding="UTF-8"?>

<beans 

    default-lazy-init="true"

    xmlns="http://www.springframework.org/schema/beans" 

    xmlns:p="http://www.springframework.org/schema/p"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:aop="http://www.springframework.org/schema/aop" 

    xmlns:mvc="http://www.springframework.org/schema/mvc"

    xmlns:util="http://www.springframework.org/schema/util"

    xmlns:jpa="http://www.springframework.org/schema/data/jpa"

    xsi:schemaLocation="  

       http://www.springframework.org/schema/beans   

       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  

       http://www.springframework.org/schema/mvc   

       http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd   

       http://www.springframework.org/schema/tx   

       http://www.springframework.org/schema/tx/spring-tx-4.3.xsd   

       http://www.springframework.org/schema/aop

       http://www.springframework.org/schema/aop/spring-aop-4.3.xsd

       http://www.springframework.org/schema/util

       http://www.springframework.org/schema/util/spring-util-4.3.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/context

       http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 

   

</beans>

 

2.2.3. 创建核心业务类

创建接口

public interface HelloService {

 void sayHello(String msg);

}

 

创建接口实现类

public class HelloServiceImpl implements HelloService {

public void sayHello(String msg) {

//假设这条语句是我们系统中的核心业务

System.out.println(msg);

}

}

 

2.2.4. 创建日志处理类

 

public class LoggingAspect {

 public void beforeMethod(){

 System.out.println("method start");

 }

 public void afterMethod(){

 System.out.println("method end");

 }

}

 

2.2.5. 配置bean对象

 

<?xml version="1.0" encoding="UTF-8"?>

<beans 

    default-lazy-init="true"

    xmlns="http://www.springframework.org/schema/beans" 

    xmlns:p="http://www.springframework.org/schema/p"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:aop="http://www.springframework.org/schema/aop" 

    xmlns:mvc="http://www.springframework.org/schema/mvc"

    xmlns:util="http://www.springframework.org/schema/util"

    xmlns:jpa="http://www.springframework.org/schema/data/jpa"

    xsi:schemaLocation="  

       http://www.springframework.org/schema/beans   

       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  

       http://www.springframework.org/schema/mvc   

       http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd   

       http://www.springframework.org/schema/tx   

       http://www.springframework.org/schema/tx/spring-tx-4.3.xsd   

       http://www.springframework.org/schema/aop

       http://www.springframework.org/schema/aop/spring-aop-4.3.xsd

       http://www.springframework.org/schema/util

       http://www.springframework.org/schema/util/spring-util-4.3.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/context

       http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 

   

    <!-- 核心业务对象 -->

    <bean id="helloService"

          class="spring.beans.HelloServiceImpl"/>

    <!-- 配置非核心业务对象(日志处理对象):切面 -->

    <bean id="log" 

          class="spring.aop.LoggingAspect"/>

    <!-- AOP配置(切入点,切面) -->  

    <aop:config>

       <!-- 配置切入点 -->

       <aop:pointcut 

            expression="within(spring.beans.HelloServiceImpl)" 

            id="logPointCut"/>

       <!-- 配置日志处理 -->

       <aop:aspect ref="log" >

           <aop:before method="beforeMethod" 

                       pointcut-ref="logPointCut"/>

           <aop:after  method="afterMethod"

                       pointcut-ref="logPointCut"/>

       </aop:aspect>

    </aop:config>

</beans>

 

2.2.6. 编写测试类

 

//1.初始化spring容器

ClassPathXmlApplicationContext ctx=

new ClassPathXmlApplicationContext(

"applicationContext.xml");

//2.获取Bean对象

HelloService helloService=

ctx.getBean("helloService",HelloService.class);

//3.执行业务

helloService.sayHello("CGB1710");//proxy的方法

//4.释放资源

ctx.close();

 

2.3. AOP 基于注解实现

先参考AOP参考文档进行整理,后续上传

 

 

 

3. 总结

3.1. 重点和难点分析

 

 

3.2. 常见FAQ

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值