1、在JDKDynamicObject(代理类,代理其他类的动作)中传入Object的被代理类,这样泛化被代理类,后面可以传入多种继承相同接口的类,实现动态的代理
2、在JDKDynamicObject(代理类,代理其他类的动作)中可以代理执行被代理类中的方法
3、(1)定义一个注解PersonAnnotation,(2)用这个PersonAnnotation设置切面PersonAspect,在切面里设置切入点@Pointcut("@annotation(com.chinamobile.cmss.service.aop.PersonAnnotation)")。在切点前@Before("pointCut()")后@After("pointCut()")可以做一些操作。
(3)在执行的方法上@PersonAnnotation(name="Chinese")会解析出需要调用切面的相关信息
参https://www.cnblogs.com/onlymate/p/9630788.html,自己留个笔记
public interface Person {
String say(String name);
void eat(String food);
}
public @interface PersonAnnotation {
String name();
}
@Aspect
@Component
public class PersonAspect {
private Loggerlogger = LoggerFactory.getLogger(PersonAspect.class);
@Pointcut("@annotation(com.chinamobile.cmss.service.aop.PersonAnnotation)")
public void pointCut(){
}
@Before("pointCut()")
public void before(JoinPoint joinPoint) {
logger.info("PersonAspect ==> before method : {}", joinPoint.getClass());
}
@After("pointCut()")
public void after(JoinPoint joinPoint){
logger.info("PersonAspect ==> after method : {}", joinPoint.getClass());
}
}
@Component
public class Chinese implements Person {
private Loggerlogger = LoggerFactory.getLogger(Person.class);
public Chinese() {
super();
logger.info("Chinese ==> Chinese method : 正在生成一个Chinese实例");
}
@Override
@PersonAnnotation(name="Chinese")//该注解是用来定义切点
public Stringsay(String name) {
logger.info("Chinese ==> say method : say {}", name);
return name +" hello, JDK implement AOP";
}
@Override
public void eat(String food) {
logger.info("Chinese ==> eat method : eat {}", food);
}
}
@Component
public class American {
private Logger logger = LoggerFactory.getLogger(American.class);
public American() {
super();
logger.info("American ==> American method : 正在生成一个American实例");
}
@PersonAnnotation(name="American")//该注解是用来定义切点
public String say(String name) {
logger.info("American ==> say method : say {}", name);
return name +" hello, CGLIB implement AOP";
}
public void eat(String food) {
logger.info("American ==> eat method : eat {}", food);
}
}
public class JDKDynamicObject implements InvocationHandler {
private Loggerlogger = LoggerFactory.getLogger(JDKDynamicObject.class);
private Objecttarget;
public JDKDynamicObject() {
}
/**
* @Description: 绑定对象,并生成代理对象
* @Title: bind
* @author OnlyMate
* @Date 2018年9月11日 下午4:48:31
* @param target
* @return
*/
public Objectbind(Object target) {
this.target = target;
// 取得代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
@Override
public Objectinvoke(Object proxy, Method method, Object[] args)throws Throwable {
logger.info("JDKDynamicObject ==> invoke method : {},{},{}", proxy.getClass(), method.getName(),
args.toString());
method.invoke(target, args);
return null;
}
}
public class CGLIBDynamicObject implements InvocationHandler {
private Loggerlogger = LoggerFactory.getLogger(CGLIBDynamicObject.class);
private Objecttarget;
public CGLIBDynamicObject() {
}
/**
* @Description: 绑定对象,并生成代理对象
* @Title: bind
* @author OnlyMate
* @Date 2018年9月11日 下午4:48:31
* @param target
* @return
*/
public Objectbind(Object target) {
this.target = target;
Enhancer enhancer =new Enhancer();
enhancer.setSuperclass(this.target.getClass());
// 回调方法
enhancer.setCallback(this);
// 创建代理对象
return enhancer.create();
}
@Override
public Objectinvoke(Object arg0, Method arg1, Object[] arg2)throws Throwable {
logger.info("CGLIBDynamicObject ==> invoke method : {},{},{}", arg0.getClass(), arg1.getName(),
arg2.toString());
arg1.invoke(target, arg2);
return null;
}
}