Days13Spring的AOP
今天是千锋线上学习的第13天,早上上课老师将昨天学习的maven和Spring初识复习一遍。紧接着就马不停蹄的开始了今天的课程——Spring的AOP。
首先一点要区分三个概念:
类, 对象, 类对象
以用户(User)为例:
User u = new User();
User为一个类
u为一个User类的对象
User.class是User的类对象
1.IUserService.java
package com.qfedu.aop01;
import java.util.List;
public interface IUserService<T> {
/**
* 获取所有的用户对象列表
* @return
*/
List<T> getAllUser();
/**
* 保存用户
* @param user
* @return
*/
boolean saveUser(T user);
/**
* 根据用户uid删除该uid对应的用户信息
* @param uid
* @return
*/
boolean deleteUser(int uid);
/**
* 更新指定用户信息
* @param obj
* @return
*/
boolean updateUser(T obj);
}
2.UserFactory.java
package com.qfedu.aop01;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class UserFactory {
public static IUserService getUserService(){
IUserService us = new UserservcieImpl();
MyAspect ma = new MyAspect();
/**
*
* 使用Proxy类的静态方法newProxyInstance来实现对于目标对象us的代理
* 目的是在原本us可以做的事情之前和之后可以做额外的事情
*
*/
IUserService ius = (IUserService) Proxy.newProxyInstance(UserFactory.class.getClassLoader(), us.getClass().getInterfaces(), new InvocationHandler() {
/**
* 代理对象调用的回掉方法
* @param proxy 代理对象
* @param method 被代理的方法
* @param args 被代理方法的参数列表对象
* @return 每个方法的最终返回值
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
ma.before();
System.out.println("000000000" + method);
System.out.println("000001111" + args);
Object obj = method.invoke(us, args);
ma.after();
System.out.println("111111111" + obj);
return obj;
}
});
return ius;
}
}
3.UserFactory.java
package com.qfedu.aop02;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class UserFactory {
/**
* 使用Spring中的一个增强类来实现aop方式
* 1. 创建Enhancer对象
* 2. 设置增强类Enhancer的superClass
* 3. 设置Enhancer对象的回调
* 4. 通过eh对象的create()方法来得到指定的对象
* @return
*/
public static IUserService getUserService(){
// 1. 创建Enhancer对象
Enhancer eh = new Enhancer();
// 2. 设置增强类Enhancer的superClass
eh.setSuperclass(IUserService.class);
IUserService<Object> us = new UserServiceImpl<>();
MyAspect ma = new MyAspect();
// 3. 设置Enhancer对象的回调
eh.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
ma.before();
Object obj = method.invoke(us, objects);
ma.after();
return obj;
}
});
// 4. 通过eh对象的create()方法来得到指定的对象
IUserService<Object> ius = (IUserService<Object>) eh.create();
return ius;
}
}
通过课上内容的学习,以及作业的练习让我对SpringAOP有了一定的认识,同时对maven也有了一定的巩固。最后送每一个为自己未来奋斗的人一句话:既然选择 了远方,便只顾风雨兼程!