Spring?切面(@Pointcut)

目录结构
—-这里写图片描述

package OA.Dao;

import OA.Proxy.Action;

public interface IUserDao<T> {
    @Action(name="注解式Add操作")
    public void Add(T T);

    public void Delete(int id);
}
package OA.Dao;

import org.springframework.stereotype.Repository;

import OA.Proxy.Action;
import OA.Entity.User;

@Repository("mDao")
public class UserDao implements IUserDao<User> {

    @Override
    @Action(name="注解式Add操作")
    public void Add(User T) {
        System.out.println("数据层:添加动作" + T.getName() + T.getId());
    }

    @Override
    public void Delete(int id) {
        System.out.println("数据层:删除动作");
    }

}
package OA.Entity;

public class User {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

}
package OA.Proxy;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Action {
    String name();
}
package OA.Service;

public interface IUserService<T> {
    public void Add(T T);

    public void Delete(int id);
}
package OA.Service;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import OA.Dao.IUserDao;
import OA.Entity.User;

@Service("mService")
public class UserService implements IUserService<User> {
    private IUserDao<User> IUserDao;

    public IUserDao<User> getIUserDao() {
        return IUserDao;
    }

    @Resource
    public void setIUserDao(IUserDao<User> iUserDao) {
        IUserDao = iUserDao;
    }

    @Override
    public void Add(User T) {
        System.out.println("service:添加" + T.getName() + T.getId());
        IUserDao.Add(T);
    }

    @Override
    public void Delete(int id) {
        System.out.println("service:删除");
        IUserDao.Delete(id);
    }

}
package OA.Proxy;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
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.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import OA.Entity.Logger;

@Component("logAspect")
@Aspect
public class LogerAspect {
    // 第一个* 表示任意返回类型
    // 任意类
    // 以add开头的任意方法
    // ..代表任意参数
    // /**
    // * 在程序运行之前运行
    // */
    // @Before("execution(* OA.Dao.*.Add*(..))||execution(*
    // OA.Service.*.Delete*(..))")
    // public void Before() {
    // Logger.info("前:日志");
    // }
    // /**
    // * 在程序运行之后运行
    // */
    // @After("execution(* OA.Service.*.Delete*(..))")
    // public void After() {
    // Logger.info("后:日志");
    // }
    // @Around("execution( * OA.Dao.*.Add*(..))")
    @Pointcut("@annotation(OA.Proxy.Action)")
    public void annotationPointcut() {
    }

    @Before("annotationPointcut()")
    public void Before(JoinPoint JoinPoint) {
        System.out.println("运行");
        MethodSignature methodSignature = (MethodSignature) JoinPoint.getSignature();
        Method method = methodSignature.getMethod();
        Annotation[] totp=method.getDeclaredAnnotations();
        System.out.println(totp.length);
        for (Annotation annotation : totp) {
            System.out.println(annotation);
        }
        if (method.isAnnotationPresent(Action.class)) {
            System.out.println("进入IF");

            System.out.println(method.getAnnotation(Action.class));
        }
        System.out.println("方法名:"+method.getName());
    }

    @After("execution( * OA.Dao.*.Add*(..))")
    public void After() {
        Logger.info("后:日志");
    }

    public void logAround(ProceedingJoinPoint pj) throws Throwable {
        Logger.info("前:日志");
        pj.proceed();
        System.out.println(pj.getTarget());
        System.out.println(pj.getSignature().getName());
        Logger.info("后:日志");
    }
}
package OA.Service;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import OA.Action.UserAction;
import OA.Dao.UserDao;
import OA.Entity.User;

public class Test {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        User u = new User();
        u.setId(1);
        u.setName("name");
        /* 读取文件 */
        BeanFactory factory = new ClassPathXmlApplicationContext("beas.xml");
        /* 读取mAction Id的节点 */
        // UserAction UserAction = (UserAction) factory.getBean(UserAction.class, "mAction");
        UserAction UserAction = (UserAction) factory.getBean(UserAction.class);
        UserAction.setUser(u);
        UserAction.Add();
    }
}
/*console*/
action:添加name1
service:添加name1
运行
1
@OA.Proxy.Action(name=注解式Add操作)
进入IF
@OA.Proxy.Action(name=注解式Add操作)
方法名:Add
数据层:添加动作name1
后:日志
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值