package com.xk.spring.kp04_aop.aop.s02_annotation;

public interface IStudentService {
    public void save(Student stu);
    public void update(Student stu);
}
package com.xk.spring.kp04_aop.aop.s02_annotation;

import org.springframework.stereotype.Service;

@Service
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.s02_annotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

//自定义切面
@Aspect
@Component //一般写在工具类上面
public class TransactionManager {
    @Pointcut("execution(* com.xk.spring.kp04_aop.aop.s02_annotation.*Service.*(..))")
    public void stuService(){}//此方法名为execution表达式的别名,即id="";
    /**
     * 事物开始
     */
    @Before("stuService()")//
    public void begin(){
        System.out.println("TransactionManager.begin()");
    }
    /**
     * 事物提交
     */
    @AfterReturning("stuService()")
    public void commit(){
        System.out.println("TransactionManager.commit()");
    }
    /**
     * 事物回滚
     */
    @AfterThrowing(value = "stuService()",throwing = "e")
    public void rollback(Throwable e){
        System.out.println("TransactionManager.rollback()");
        System.out.println("rollback()");
    }
    
    /**
     * 事物结束
     */
    @After("stuService()")
    public void finished(){
        System.out.println("TransactionManager.close()");
    }
    @Around("stuService()")
    public void all(ProceedingJoinPoint point){
        try {
            begin();
            point.proceed();//此处有连接,必须写,不然执行到此将不再向下执行
            commit();
        } catch (Throwable e) {
            rollback(e);
        }finally{
            finished();
        }
        
    }
}
package com.xk.spring.kp04_aop.aop.s02_annotation;

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 + "]";
    }
}
<?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">
     <!-- 自动生成代理 -->
    <aop:aspectj-autoproxy />
    <!-- 指定IOC扫描的包 -->
    <context:component-scan 
                base-package="com.xk.spring.kp04_aop.aop.s02_annotation"/>
</beans>
package com.xk.spring.kp04_aop.aop.s02_annotation;

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 AOPAnnoationTest {
    @Autowired
    IStudentService seriver;

    @Test
    public void testAOPXML() throws Exception {
        seriver.save(new Student("张三", 18));
        seriver.update(new Student("张4", 18));
    }
}

 

posted on 2017-03-28 21:34  小手撬地球  阅读(524)  评论(0编辑  收藏  举报