是否有一种优雅的方式将spring托管bean注入java自定义/简单标记

我有一堆使用spring托管bean的java自定义标签..因为我无法找到注入自定义标签的方法,我创建了一个帮助类,为所有spring bean对象提供静态方法“getTheObjectINeedBean()”需要..我根本不喜欢这种方法。

我真的希望能够将spring托管bean注入自定义标记

有办法吗? 就我的研究而言,我知道没有办法做到这一点,因为自定义标签是容器管理的

谢谢,

比利

你是对的,没有一种简单的方法在jstl标签中使用dependency injection,因为它们不是由spring管理的,也不可能。 但是(至少)有两种解决方法:

  • @Configurable – aspectJ允许您在加载时/编译时插入编织器,这样即使是没有弹簧实例化的对象也可以弹出。 看到这里

  • 您可以为项目创建基本标记类,并从每个doStartTag(..)方法调用init(..) doStartTag(..)方法。 在那里,您可以从pageContext获取ServletContext ,从而获得spring ApplicationContext (通过ApplicationContextUtils )。 然后:

     AutowireCapableBeanFactory factory = appCtx.getAutowireCapableBeanFactory(); factory.autowireBean(this); 

这些选项都不是完美的,因为它们需要一些额外的代码或一些“黑魔法”

为了扩展@ Bozho的post,我得到了这样的工作:(在Spring 3.0中没有我能找到的ApplicationContextUtils)

 public class LocationTag extends RequestContextAwareTag { @Autowired PathComponent path; ... @Override protected int doStartTagInternal() throws Exception { if (path == null) { log.debug("Autowiring the bean"); WebApplicationContext wac = getRequestContext().getWebApplicationContext(); AutowireCapableBeanFactory acbf = wac.getAutowireCapableBeanFactory(); acbf.autowireBean(this); } return SKIP_BODY; } } 

如上所述的解决方案有效但一些背景和附加代码片段很可能是有用的。

1)从doStartTag方法调用doStartTagInternal方法。 2)在调用doStartTag之前,我被迫先设置pageContext 3)我查找了bean而不是自动assembly。 对我来说,这似乎更直接:(YourBeanProxy)autowireCapableBeanFactory.getBean(“yourBeanName”)

希望这些附加信息很有用。