手写SpringAOP
CG are superficial brothers, you will have an evaluation of any behavior, do not ask simple questions, solve the best independently
talk is cheap, show me the code,make a better result.
目录
概述
首先我们先考虑Spring,其中最重要的就是AOP。
需求:
需求整理如下:
1.由Spring来负责控制对象的生命周期和对象之间的关系。
2.切面控制事务
设计思路
为了方面也为了规范,我们使用UML工具啦,符合软件工程的标准了
实现思路分析
1.获取所有的切面类
获取的对应的切面类
2.遍历容器管理的类
遍历bean属性
3.筛选出匹配容器管理类的切面aspectlist
4.尝试进行Aspect的织入 生成动态代理对象 并替换beancontainer中原先class对应所对应的实例对象
拓展Demo实现
相关代码如下:
1.定义默认切面类
/**
* 定义默认切面类
*/
public abstract class DefaultAspect {
/**
* 事前拦截
* @param targetClass 被代理的目标类
* @param method 被代理的目标方法
* @param args 被代理的目标方法对应的参数列表
* @throws Throwable
*/
public void before(Class<?> targetClass, Method method, Object[] args) throws Throwable{
}
/**
* 事后拦截
* @param targetClass 被代理的目标类
* @param method 被代理的目标方法
* @param args 被代理的目标方法对应的参数列表
* @param returnValue 被代理的目标方法执行后的返回值
* @throws Throwable
*/
public Object afterReturning(Class<?> targetClass, Method method, Object[] args, Object returnValue) throws Throwable{
return returnValue;
}
/**
*
* @param targetClass 被代理的目标类
* @param method 被代理的目标方法
* @param args 被代理的目标方法对应的参数列表
* @param e 被代理的目标方法抛出的异常
* @throws Throwable
*/
public void afterThrowing(Class<?> targetClass, Method method, Object[] args, Throwable e) throws Throwable{
}
}
2.将bean放入bean容器
public ConcurrentHashMap<String,Object>initBean(List<Class>classes) throws IllegalAccessException,InstantiationException{
ConcurrentHashMap<String,Object> map = new ConcurrentHashMap<String, Object>();
String beanId="";
for(Class clazz :classes){
Object object = clazz.newInstance();
IocService annotation =(IocService)clazz.getDeclaredAnnotation(IocService.class);
if (annotation!=null){
//如果定义了name属性 以实现的name属性为主否则以默认的规则为主
String value = annotation.name();
if (value!=null && !value.equals("")){
beanId = value;
}
else {
beanId = toLowerCaseFirstOne(clazz.getSimpleName());
}
}
//存储值
map.put(beanId,object);
}
return map;
}
3.定义切面织入器
private List<AspectInfo> collectRoughMatchedAspectListForSpecificClass(List<AspectInfo> aspectInfoList, Class<?> targetClass) {
List<AspectInfo> roughMatchedAspectList = new ArrayList<>();
for(AspectInfo aspectInfo : aspectInfoList){
//粗筛
if(aspectInfo.getPointcutLocator().roughMatches(targetClass)){
roughMatchedAspectList.add(aspectInfo);
}
}
return roughMatchedAspectList;
}
实验效果:
略
分析:
待补充
小结:
主要讲述了SpringAOP原理和简单实现,里面有许多不足,请大家指正~
参考资料和推荐阅读
欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~