美文网首页
Java实训(3) -- Spring核心之AOP -- 201

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

作者: 空心老竹 | 来源:发表于2018-06-08 19:17 被阅读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("新增失败");
            }
            
        }
    }
    
    

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

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

    相关文章

      网友评论

          本文标题:Java实训(3) -- Spring核心之AOP -- 201

          本文链接:https://www.haomeiwen.com/subject/dwzasftx.html