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

时间:2010-08-10 03:56:22

标签: java spring inversion-of-control jstl

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

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

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

谢谢,

比利

3 个答案:

答案 0 :(得分:7)

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

  • @Configurable - aspectJ允许您在加载时/编译时插入编织器,这样即使没有弹簧实例化的对象也可以弹出。请参阅here

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

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

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

答案 1 :(得分:7)

为了扩展@ Bozho的帖子,我已经让它像这样工作:(在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;
    }
}

答案 2 :(得分:0)

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

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

希望这些额外的信息很有用。