Java实训(3) -- Spring核心之AOP -- 201

2018-06-08  本文已影响0人  空心老竹

Spring AOP编程

  1. 什么是 AOP 编程?

AOP是Aspect Oriented Programming的缩写,意思是面向方面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种编程思想。
从OOP角度分析,我们关注业务的处理逻辑,是属于纵向的行为,从AOP角度分析,我们关注对象行为发生时的问题,是属于横向的行为。

  1. AOP 包括什么?

切面

切入点

通知定义了切面的什么和何时,切点定义了何处,切点的定义会匹配通知所要织入的一个或多个连接点,我们通常使用明确的类的方法名称来指定这些切点,或是利用正则表达式定义匹配的类和方法名称来指定这些切点。

通知

前置通知

后置通知

异常通知

环绕通知

  1. AOP 开发步骤
  1. 新建一个切面类,实现通知接口

  2. 修改spring 配置文件或使用注解,把切面类交给 spring 进行管理

  3. 修改 spring 配置文件,引入 aop 名称空间配置

  4. 配置 aop:config

  5. 执行包含切入点的代码,切面自动执行

1. 新建一个工程,工程结构如下所示:
项目工程结构图

部分代码展示(Getting Setting 方法已省略):

Category.java :

package com.neuedu.springaop.bean
public class Category {
   private int id;
   private String name;
   
   public Category() {
       super();
   }
   
   public Category(int id) {
       super();
       this.id = id;
  
   public Category(int id, String name) {
       super();
       this.id = id;
       this.name = name;
   }
}

ICategoryDao.java (模拟数据库操作)

package com.neuedu.springaop.dao;

import java.util.List;

import com.neuedu.springaop.bean.Category;

public interface ICategoryDao {
    public boolean saveCategory(Category category);
    public boolean deleteCategory(Category category);
    public boolean editCategory(Category category);
    public Category findById(int id);
    public List<Category> searchByExample(Category category);
}

ICategoryService.java

package com.neuedu.springaop.service;

import java.util.List;

import com.neuedu.springaop.bean.Category;

    public interface ICategoryService {
    public boolean saveCategory(Category category);
    public boolean deleteCategory(Category category);
    public boolean editCategory(Category category);
    public Category findById(int id);
    public List<Category> searchByExample(Category category);
}

新建一个切面类 : Thranslation.java

package com.neuedu.springaop.aop;

import java.lang.reflect.Method;


import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;

/*
 * 模拟事务的类
 * 
 * 1.前置通知接口:MethodBeforeAdvice,对应切入点-表示在方法调用前切入
 * 2.后置通知接口:AfterReturningAdvice,对应切入点-表示在方法返回后执行
 */

public class Thranslation implements MethodBeforeAdvice,AfterReturningAdvice,ThrowsAdvice{

    @Override
    public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
       System.out.println("模拟事务开启......");
    }

    @Override
    public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
        System.out.println("模拟事务提交......");
    }

    public void afterThrowing(Exception e) {
        System.out.println("模拟事务回滚......");
    }
}

2-4. 修改后的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:aop="http://www.springframework.org/schema/aop" 
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.xsd">

    <!-- 配置aop切面 -->
    <!-- 把切面类交给spring进行管理 -->
    <bean id="Thranslation" class="com.neuedu.springaop.aop.Thranslation"></bean>
    <!-- 配置切面 -->
    <aop:config>
        <!-- 配置切入点 -->
        <!-- 切入点表达式说明:execution表示执行,第一个*号表示修饰符号,接着配置package包名.接口名或类名.方法名(参数列表) 
            *号表示多种情况,参数的两点表示不定参数(0-n个参数)
        -->
        <aop:pointcut expression="execution(* com.neuedu.springaop.service.ICategoryService.*(..))
        " id="txPointcut"/>
        <!-- 配置aop通知 -->
        <aop:advisor advice-ref="Thranslation" pointcut-ref="txPointcut"/>
    </aop:config>
 
    <!-- 表示层 -->
    
    <!-- 业务逻辑层 -->
    <bean id="CategoryServiceImpl" class="com.neuedu.springaop.service.impl.CategoryServiceImpl">
        <property name="categoryDao" ref="CategoryDaoImpl"></property>
    </bean>
    
    <!-- 数据访问层 -->
    <bean id="CategoryDaoImpl" class="com.neuedu.springaop.dao.impl.CategoryDaoImpl"></bean>
</beans>

5. 执行包含切入点的代码,切面自动执行

编写一个测试类 TestCategoryService.java

package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.neuedu.springaop.bean.Category;
import com.neuedu.springaop.service.ICategoryService;

public class TestCategoryService {
    public static void main(String[] args) {
        
        //1.配置spring环境
        String configLocation = "config/applicationContext.xml";
        ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
        
        //2.获取业务对象
        ICategoryService service = context.getBean(ICategoryService.class);

        //3.进行业务测试 
        Category category = new Category();  
        boolean res = service.saveCategory(category);
        if(res) {
            System.out.println("新增成功");
        }else {
            System.out.println("新增失败");
        }
        
    }
}

执行测试程序,获得执行结果 :

模拟事务开启......
执行新增功能...
模拟事务提交......
新增成功
上一篇下一篇

猜你喜欢

热点阅读