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

Bil*_*ory 11 java spring jstl inversion-of-control

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

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

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

谢谢,

比利

小智 8

为了扩展@ 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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 7

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

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

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

    AutowireCapableBeanFactory factory = appCtx.getAutowireCapableBeanFactory();
    factory.autowireBean(this);
    
    Run Code Online (Sandbox Code Playgroud)

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