使用AOP的两种方法

一、使用Spring来定义POJO切面

(1)定义一个接口:
public interface IMemberService {
    public boolean insert(Member vo);
}

(2)定义一个接口的实现类:

@Service
public class MemberServiceImpl implements IMemberService {
    @Override
    public boolean insert(Member vo) {
        System.out.println("数据层调用 member = " + vo);
        return false;
    }
}

(3)定义一个Member类:

public class Member {
    private String id;
    private String name;

    public String getName() {
        return name;
    }

    public String getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "编号:" + this.id + ",姓名:" + this.name;
    }
}


(4)定义一个功能辅助类:

@Component
public class ServiceAspect {
    public void serviceBefore() {
        System.out.println("【aop切面】负责执行日志记录操作");
    }
    public void serviceAfter() {
        System.out.println("【aop切面】负责执行事务处理操作");
    }
}

(5)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:context="http://www.springframework.org/schema/context"
       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/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">
    <context:annotation-config/>
    <context:component-scan base-package="cn.libin"/>

    <aop:config>
        <!-- 首先定义程序的切入点 -->
        <aop:pointcut id="pointcut" expression="execution(* cn.libin.service.impl.*.*(..)))"/>
        <!--定义要使用的面向切面的处理类 -->
        <aop:aspect ref="serviceAspect">
            <aop:before method="serviceBefore" pointcut="execution(* cn.libin..*.*(..)))"/>
            <aop:after method="serviceAfter" pointcut="execution(* cn.libin..*.*(..)))"/>
        </aop:aspect>
    </aop:config>
</beans>

(6)测试类:

public class TestMemberService {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        IMemberService member = context.getBean("memberServiceImpl", IMemberService.class);
        Member vo = new Member();
        vo.setId("001");
        vo.setName("张三");
        System.out.println(member.insert(vo));
    }
}

(7)输出结果

【aop切面】负责执行日志记录操作
数据层调用 member = 编号:001,姓名:张三
【aop切面】负责执行事务处理操作
false

二、通过AspectJ提供的注解实现

(1)定义一个接口:
public interface IMemberService {
    public boolean insert(Member vo);
}

(2)定义一个接口的实现类:

@Service
public class MemberServiceImpl implements IMemberService {
    @Override
    public boolean insert(Member vo) {
        System.out.println("数据层调用 member = " + vo);
        return false;
    }
}

(3)定义一个Member类:

public class Member {
    private String id;
    private String name;

    public String getName() {
        return name;
    }

    public String getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "编号:" + this.id + ",姓名:" + this.name;
    }
}


(4)定义一个功能辅助类:

@Aspect
@Component
public class ServiceAspect {
    @Before(value = "execution(* cn.libin..*.*(..))")
    public void serviceBefore() {
        System.out.println("【aop切面】负责执行日志记录操作");
    }
    @After(value = "execution(* cn.libin..*.*(..))")
    public void serviceAfter() {
        System.out.println("【aop切面】负责执行事务处理操作");
    }
}

(5)配置文件

<?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:context="http://www.springframework.org/schema/context"
       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/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">
    <context:annotation-config/>
    <context:component-scan base-package="cn.libin"/>

    <aop:aspectj-autoproxy/>
</beans>

(6)测试类:

public class TestMemberService {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        IMemberService member = context.getBean("memberServiceImpl", IMemberService.class);
        Member vo = new Member();
        vo.setId("001");
        vo.setName("张三");
        System.out.println(member.insert(vo));
    }
}

(7)输出结果

【aop切面】负责执行日志记录操作
数据层调用 member = 编号:001,姓名:张三
【aop切面】负责执行事务处理操作
false






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值