AOP的实现方式之二(自定义类)及注解实现AOP

一.自定义类实现AOP

自定义类来实现AOP,首先真正的代理对象就是这个自定义类,这个自定义类中的方法就是对service的拓展。

接口:

package top.lostyou.service;

public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();
}

 

真实对象:

package top.lostyou.service;

public class UserServiceImp implements UserService {
    public void add() {
        System.out.println("增加了一个用户!");
    }

    public void delete() {
        System.out.println("删除了一个用户");
    }

    public void update() {
        System.out.println("更新了一个用户");
    }

    public void query() {
        System.out.println("查询了一个用户");
    }
}

 

自定义类:

package top.lostyou.log;

import java.util.Date;

public class Diy {
    public void start(){
        System.out.println("此方法开始运行"+ new Date());
    }
    public void last(){
        System.out.println("此方法运行完成"+new Date());
    }
}

 

spring配置(自定义类配置模板):

    <bean id="diy" class="top.lostyou.log.Diy"/>
    <aop:config>
        <!-- 切点 -->
        <aop:pointcut id="cut" expression="execution(* top.lostyou.service.UserServiceImp.*(..))"/>
        <!--自定义切面,ref,引入代理类-->
        <aop:aspect ref="diy">
            <!--通知,及代理对象的方法-->
            <aop:before method="start" pointcut-ref="cut"/>
            <aop:after method="last" pointcut-ref="cut"/>
        </aop:aspect>
    </aop:config>

 

二.注解实现AOP

接口:

package top.lostyou.service;

public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();
}

 

真实对象:

package top.lostyou.service;

public class UserServiceImp implements UserService {
    public void add() {
        System.out.println("增加了一个用户!");
    }

    public void delete() {
        System.out.println("删除了一个用户");
    }

    public void update() {
        System.out.println("更新了一个用户");
    }

    public void query() {
        System.out.println("查询了一个用户");
    }
}

 

注解AOP(即AOP代理)

package top.lostyou.log;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect  //标志这是一个切面
public class annotionBean {
    @Before("execution(* top.lostyou.service.UserServiceImp.*(..))")
    public void before(){
        System.out.println("----方法执行前");
    }
    @After("execution(* top.lostyou.service.UserServiceImp.*(..))")
    public void after(){
        System.out.println("----方法执行后");
    }

    //环绕增强
    @Around("execution(* top.lostyou.service.UserServiceImp.*(..))")
    public void arode(ProceedingJoinPoint jp) throws Throwable {
        System.out.println("环绕前");
        Signature signature = jp.getSignature();//获得签名
        System.out.println(signature);
        Object proceed = jp.proceed();  //这个公式代表的是 真实对象执行方法,即userServiceImp中的方法
        System.out.println("环绕后");
    }
}

 

spring中注册配置:

    <!--方式三:使用注解-->
    <bean id="ann" class="top.lostyou.log.annotionBean"/>
    <!--开启注解支持-->
    <aop:aspectj-autoproxy/>

 

这里一定要注意开启注解支持!!!

 

posted @ 2023-02-21 21:37  回忆也交给时间  阅读(137)  评论(0编辑  收藏  举报