具体问题请看   https://q.cnblogs.com/q/108101/

研究了两天: 经过上文中的排除法: 造成问题的原因是要获取的bean 中 有被切入的方法。。

  就是可能该类会使用反射生成一个类。。

怎么测试呢?

  想到 @Autowired  和 @Resource  这两个注解。。

他们会通过 类型 和 名称去找容器中对应 的 bean 。。

于是在controller 中使用 这个注解 注入 zaService;

报错了  :

  

Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'zaSerivce' is expected to be of type 'com.mytest.context.impl.ZaSerivce' but was actually of type 'com.sun.proxy.$Proxy15'
at org.springframework.beans.factory.support.DefaultListableBeanFactory.checkBeanNotOfRequiredType(DefaultListableBeanFactory.java:1510)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.checkBeanNotOfRequiredType(DefaultListableBeanFactory.java:1517)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1489)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
... 67 more

  这就说明了两个问题: 1. 为什么 byTpe 无法获取bean ,,因为它的类型根本就不是  com.mytest.context.impl.ZaSerivce 而是    com.sun.proxy.$Proxy15

            2.  byName 虽然可以获取但是会发现它的类型也已经不是 ZaService 了。。

ApplicationContext context =  ApplicationContextUtils.context;
ZaService z = (ZaService) context.getBean("zaService"); java.lang.ClassCastException: com.sun.proxy.$Proxy15 cannot be cast to com.mytest.context.impl.ZaService

  

解决办法: 1. 通过byType 获取bean 时参数传 接口类的class ..    不足: 只能有一个实现类。

      2.  byName 可以正常传参数 bean 的首字母小写。。 但是只能转换为接口类

          IZaService z = (IZaService) context.getBean("zaService");

  而我的业务参数是  实现类的全路径名,所以特别适合 class.forName();  然后 byType .. 可惜用不了。。 只能退而求其次了把参数 调整为 接口的全路径名。。但是只能有一个实现类。。

至于为什么被 切 的 类 在spring 容器中的 type 变了, 那可能要考虑代理反射,个人观点是 spring 默认使用jdk 动态代理,这种方式会生成一个全新的类,比如本例的

$Proxy15, 然后通过这个代理类方法前后编入代码,然后调用原始类的方法。。 说远了,。。。。 

注意 : spring 还有一种代理方式: CGLIB 是不会生成新的类,那如果不生成新的类,就不会出现上述的问题了,,现在验证下(spring 对没有实现接口的类的代理方式是 CGLib )

我们只要把 IZaServiec 去掉就行了不要Zaserivce 实现它,试试,,日,,真的正常了。。 
      
@Service
public class ZaService { @TestAnn
/*@Override*/
public void aa() { }
} @ResponseBody
@RequestMapping("/context")
public String context(){
ApplicationContext context = ApplicationContextUtils.context;
ZaService z = (ZaService) context.getBean(ZaService.class);
System.out.println(z);
z.aa();
return "context";
} com.mytest.context.impl.ZaService@7cb0dfee
<>>>>>>>>>>>>>>>>>>>>>>>after<><><><><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  

												

spring 的 ApplicationContext.getBean(type) 无法获取bean,报错的更多相关文章

  1. spring JMS在接收消息的时候总是报错

    spring JMS在接收消息的时候总是报错 org.springframework.jms.UncategorizedJmsException: Uncategorized exception oc ...

  2. [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. spring中IOC容器注册和获取bean的实例

    spring中常用的功能主要的是ioc和aop,此处主要说明下,实例注册和使用的方法,此为学习后的笔记记录总结 1.使用xml文件配置 在idea中创建maven工程,然后创建实例Person,然后在 ...

  4. spring加载bean报错:expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

    看具体报错日志: 警告: Unable to proxy interface-implementing method [public final void cn.wlf.selection.proto ...

  5. Spring:解决因@Async引起的循环依赖报错

    最近项目中使用@Async注解在方法上引起了循环依赖报错: org.springframework.beans.factory.BeanCurrentlyInCreationException: Er ...

  6. 微信网页授权 通过code获取openid 报错40163 code been used

    使用好好的微信功能,突然安卓无法正常使用了,苹果的正常. 安卓报错内容: 40163,code been used. 题外话:微信的东西,为何报英文错误呢,装什么13. 实测结果:安卓获取用户信息时 ...

  7. 在spring添加注解时,第一行package报错configure build path

    练习spring的ioc的注解的时候写上注解就会在第一行package报错configure build path. 用的spring4.2.4的jar包.经过上网查阅资料,可能是jar包冲突,解决办 ...

  8. 多线程中实现ApplicationContextAware接口获取需要的bean,applicationContext.getBea未返回也未报错

    唉,面试失败了有点难过. https://q.cnblogs.com/q/95168/#a_208239

  9. Spring 使用@Async出现循环依赖Bean报错的解决方案

    初现端倪 Caused by:org.springframework.beans.factory.BeanCurrentlyInCreationException: Errorcreating bea ...

随机推荐

  1. EasyUI值的清空与获取

    清空: 一般值 $("#searchx").val(""); 时间选择框 $('#starttime').datetimebox('setValue', '') ...

  2. asp.net之发送邮件2

    public void SendMail(string from, string to, List<string> cc, string subject, string body) { M ...

  3. 五、Singleton 单例模式

    需求:保证对象只创建一次 说明: 分为懒汉式.饿汉式,通过是否一开始就创建静态对象.饿汉式需要考虑线程并发的安全 懒汉式: public class Singleton { private stati ...

  4. The hyperlink for cell A2 references relation rId1, but that didn't exist!

    excel单元格中存在超链接,去掉 可以参考 https://www.cnblogs.com/songyunxinQQ529616136/p/6599523.html

  5. 九 configparser模块

    配置文件如下: # 注释1 ; 注释2 [section1] k1 = v1 k2:v2 user=egon age=18 is_admin=true salary=31 [section2] k1 ...

  6. Codeforces977D ---Divide by three, multiply by two 深搜+map存出现的数

    传送门:点我 题意:给定n长度的序列,重排成后一个数是前一个数除以三,或者后一个数是前一个数乘二,要求输出这个序列. 思路:大力深搜,对每个数搜除3的和乘2的是否出现过,然后继续搜下去.如果有一个数搜 ...

  7. 模板】AC自动机(简单版)

    模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P3808 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保 ...

  8. 在IDEA中使用gradle配置打可执行jar包[可执行jar与其所依赖的jar分离]

    下面是我的项目的build.gradle文件的所有内容,注意高亮部分是关键: group 'com.xbs' version '1.0-SNAPSHOT' apply plugin: 'java' a ...

  9. lendinghome oa 准备

    hardcode版本 估计只能过一个吧 import java.util.*; public class NextServer { Map<Integer, Integer> server ...

  10. 项目打包 TestFlight用法

    TestFlight用法 包教包会(iOS APP官方测试工具) https://www.jianshu.com/p/4be185e4069c