zoukankan      html  css  js  c++  java
  • xml的方式配置AOP:Aspect Oriented Programming

    在某些类中, 什么时机, 做什么事情
     切入点(point-cut): 在某些类中(Class<?>[] itfc = new Class<?>[] { IStudentService.class })
     通知: 什么时机, 做什么事情(InvocationHandler的invoke方法)
     切面: 切入点 + 通知
     织入(weaver): Proxy.newProxyInstance: 把切入点和通知施加到具体的业务逻辑上的过程

    XML配置AOP步骤:
     1,准备了一个实现接口的bean, 还有一个事务的碎片化方法的类;
     2,把这两个类配置到Spring容器中;
     3,配置springAOP
      1)引入aop命名空间;
      2)配置AOP,格式如下
      <aop:config>
          <aop:point-cut expression=""  id="sample" />
          <aop:aspect ref="">
               <aop:before method="" pointcut-ref="sample">
               <aop:after-returning method="" pointcut-ref="sample">
               <aop:after-throwing method="" pointcut-ref="sample">
          </aop:aspect>
      </aop:config>
       1] aop:config: AOP配置
       2] aop:point-cut: AOP切入点
       3] aop:aspect: AOP切面配置
       4] aop:* 都是一个AOP切面

     4,在接口文件中配置一个业务逻辑对象的接口,DI注入,并在test方法中直接调用该接口的具体业务逻辑

    //接口:
    package com.xk.spring.kp04_aop.aop.s01_xml;
    
    public interface IStudentService {
        public void save(Student stu);
        public void update(Student stu);
    }
    //Dao 实现类(service) 实现业务逻辑
    package com.xk.spring.kp04_aop.aop.s01_xml;
    
    public class StudentServiceImpl implements IStudentService {
        @Override
        public void save(Student stu) {
            System.out.println("调用Dao的save方法....");
        }
        @Override
        public void update(Student stu) {
            System.out.println("调用Dao的update方法...");
            @SuppressWarnings("unused")
            int i = 10/0;
        }
    }
    //事物管理:将代码中的污染源抽出一个类,专门处理事物
    package com.xk.spring.kp04_aop.aop.s01_xml;
    
    public class TransactionManager {
        /**
         * 事物开始
         */
        public void begin(){
            System.out.println("TransactionManager.begin()");
        }
        /**
         * 事物提交
         */
        public void commit(){
            System.out.println("TransactionManager.commit()");
        }
        /**
         * 事物回滚
         */
        public void rollback(Throwable e){
            System.out.println("TransactionManager.rollback()");
            System.out.println("rollback()");
        }
        
        /**
         * 事物结束
         */
        public void finished(){
            System.out.println("TransactionManager.close()");
        }
    }
    //Bean
    //将bean注入就是指将数据注入Spring
    package com.xk.spring.kp04_aop.aop.s01_xml;
    
    public class Student {
    	private String name;
    	private Integer age;
    
    	public Student() {
    
    	}
    
    	public Student(String name, Integer age) {
    		this.name = name;
    		this.age = age;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public Integer getAge() {
    		return age;
    	}
    
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    
    	@Override
    	public String toString() {
    		return "Student [name=" + name + ", age=" + age + "]";
    	}
    }
    

      

    //测试类
    package com.xk.spring.kp04_aop.aop.s01_xml;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration
    public class AOPXMLTest {
        @Autowired
        IStudentService seriver;
    
        @Test
        public void testAOPXML() throws Exception {
            seriver.save(new Student("张三", 18));
            seriver.update(new Student("张4", 18));
        }
    }
    <!-- xml配置aop -->
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context.xsd
               http://www.springframework.org/schema/aop
               http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <bean id="service" class="com.xk.spring.kp04_aop.aop.s01_xml.StudentServiceImpl" />
        <bean id="manager" class="com.xk.spring.kp04_aop.aop.s01_xml.TransactionManager" />
        <aop:config>
            <!-- 需要导入两个依赖包 com.springsource.org.aopalliance-1.0.0.jar
                    和com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar 
            -->
            <aop:pointcut
                expression="execution(* com.xk.spring.kp04_aop.aop.s01_xml.*Service.*(..))"
                id="stuService" />
            <aop:aspect ref="manager">
                <aop:before method="begin" pointcut-ref="stuService" />
                <!-- 回滚:在回滚的时候 throwing是要在TransactionManager类中配置的 参数"(throwable e)" -->
                <aop:after-throwing method="rollback"
                    pointcut-ref="stuService" throwing="e" />
            </aop:aspect>
        </aop:config>
    </beans>
    
    <!-- 错误:Pointcut is not well-formed: expecting 'name pattern' at character 
        position 配置aop报错:原因是配置切点表达式的时候报错了, 星号后面没有加空格: <aop:config> <aop:pointcut 
        id="transactionPointcut" expression="execution(* project.mybatis.service.*.*(..))" 
        /> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="omsMTransactionAdvice" 
        /> </aop:config> 其中,切入点表达式的使用规则: 1、execution(): 表达式主体。 2、第一个*号:表示返回类型,*号表示所有的类型。 
        3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。 
        4、第二个*号:表示类名,*号表示所有的类。 5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。 -->
  • 相关阅读:
    python 中的subprocess
    Pandas 的基本操作
    mongodb的基本操作
    Mongodb的安装
    Mysql has gone way (Django 下的解决方法)
    python 中的魔法类
    python2与python3共存时的pip问题
    Tango with django 1.9 中文——3.Django基础
    bootstrap日期范围选择插件daterangepicker详细使用方法
    Django Static与Media
  • 原文地址:https://www.cnblogs.com/huike/p/6636731.html
Copyright © 2011-2022 走看看