目录结构
—-
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
后:日志