ToB企服应用市场:ToB评测及商务社交产业平台

标题: springboot~InvocationHandler中为什么不能使用@Autowired [打印本页]

作者: 石小疯    时间: 2023-9-5 15:30
标题: springboot~InvocationHandler中为什么不能使用@Autowired
@Autowired 是 Spring Framework 中用于自动注入依赖的注解,通常情况下可以正常工作,但有一些情况下可能无法获取到 bean 对象:
总之,要解决 @Autowired 无法获取 bean 对象的问题,需要仔细检查你的 Spring 配置、包扫描、注解使用和 bean 的作用域等方面的问题,确保它们都正确配置和匹配。如果你遇到困难,可以通过查看错误消息和日志来获取更多的信息,以便更容易地找到问题的根本原因。
java.lang.reflect.InvocationHandler注意事项

java.lang.reflect.InvocationHandler 是 Java 中的一个接口,它属于反射机制的一部分,用于动态代理。该接口定义了一个方法 invoke,允许在运行时处理对代理对象的方法调用。它通常用于实现代理模式、AOP(面向切面编程)和其他动态编程技术。
InvocationHandler 接口的声明如下:
  1. public interface InvocationHandler {
  2.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
  3. }
复制代码
invoke 方法允许你在代理对象的方法被调用时干预和处理方法调用。你可以在方法调用前后执行额外的操作,例如记录日志、处理事务、验证权限等。
通常,你会使用 InvocationHandler 接口来创建动态代理,应该注意,在这个InvocationHandler的实现类中,直接使用@Autowired是不能注入bean对象的,我们应该使用统一的SpringContextUtils这种工具类(它是自建的,需要实现ApplicationContextAware接口,为ApplicationContext对象赋值),来统一获取需要的bean对象。
  1.     @Autowired
  2.         OtherBean otherBean;
  3.        
  4.         @Override
  5.         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  6.             otherBean.print();
  7.         }
复制代码
  1.         @Override
  2.         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  3.             SpringContextUtils.getBean(OtherBean.class).print();
  4.         }
复制代码
为什么在InvocationHandler 的实现类中,不能直接使用@Autowired来注入bean

在 InvocationHandler 的实现类中不能直接使用 @Autowired 注解来注入 bean,原因如下:
如果你希望在代理对象中使用依赖注入的功能,可以考虑以下两种方式:
总之,InvocationHandler 不是 Spring 管理的组件,因此不能直接使用 @Autowired 注解。你需要考虑其他方法来处理依赖注入,具体取决于你的应用程序架构和需求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4