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


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

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

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

谢谢,

比利


1105
2017-08-10 03:56


起源

重复 stackoverflow.com/questions/1296052/... - skaffman


答案:


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

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

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

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

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


7
2017-08-10 05:59





为了扩展@ 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;
    }
}

7
2018-03-02 19:56



谢谢“getRequestContext()。getWebApplicationContext()”解决了我的问题 - TrueCoke


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

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

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


0
2018-06-18 12:50