在我学习到aop面向切面编程思想,练习运行程序时
AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext(SpringConfig.class);
aopService bean = ioc.getBean(aopServiceimpl.class);
bean.forSout();
程序抛出以下异常
起初我以为是因为bean的配置存在问题或者时SpringConfig配置类没将我获取的bean扫描到,更换bean所在类的注解也没有用。后面我反复观看我学习的课程视频,发现老师获取bean使用的是实现类的接口类,尝试使用接口获取bean对象,程序运行成功。
aopService bean = ioc.getBean(aopService.class);
对于此我很疑惑,课程老师也没做过多的讲解,在之后我还是执着于通过实现类来获取bean对象,尝试多次,发现问题出现在被切面类切入点控制的类spring获取不到可用bean,于是拿着这个问题去寻找解决方法,发现几个和我存在同样问题的帖子,但还是没有找到解决的方案,但却认识到异常出现的原因。
SpringAOP本质:代理模式
在使用Spring AOP进行代理时,代理类通常是在运行时动态创建的,由原始类自动生成,原始类仍然存在,但在运行时通常无法直接访问。
所以我们通过类型获取bean,想要获取被切面类切入点控制的类的bean对象,就要通过实现类的代理类类型来获取或者通过接口来获取bean对象。通过接口来获取bean对象,缺点就是实现类只能有一个。
aop的核心概念
目标对象(
Target
):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的
代理(
Proxy
):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现
下面链接的帖子博主讲解的更全面,想了解的可以参考
转载研究原文连接