Grails 2.5.6:如何用XML/DSL创建请求作用域Bean及工厂Bean
Grails 2.5.6 注解转XML/DSL配置方案
一、XML配置方式
在grails-app/conf/spring/resources.xml中添加以下配置:
1. 配置请求作用域的MelHeaders Bean
<!-- 请求作用域的MelHeaders,构造注入HttpServletRequest --> <bean id="melHeaders" class="com.yourpackage.MelHeaders" scope="request"> <constructor-arg type="javax.servlet.http.HttpServletRequest"/> <!-- 启用代理,确保跨作用域引用正常工作 --> <aop:scoped-proxy proxy-target-class="true"/> </bean>
2. 配置工厂Bean(Function<HttpServletRequest, MelHeaders>)
XML无法直接定义Lambda,需先封装一个工厂类:
// 自定义工厂类,实现Function接口 public class HeaderHandlerFactory implements Function<HttpServletRequest, MelHeaders> { @Autowired private ApplicationContext applicationContext; @Override public MelHeaders apply(HttpServletRequest request) { return applicationContext.getBean(MelHeaders.class, request); } }
然后在XML中配置该工厂类的Bean:
<bean id="headerHandlerFactory" class="com.yourpackage.HeaderHandlerFactory"/>
二、Grails DSL配置方式(resources.groovy)
在grails-app/conf/spring/resources.groovy中直接配置,无需额外类:
import javax.servlet.http.HttpServletRequest import org.springframework.web.context.WebApplicationContext // 配置请求作用域的MelHeaders,构造注入request melHeaders(MelHeaders, ref('request')) { scope = WebApplicationContext.SCOPE_REQUEST scopedProxy = true // 启用代理解决跨作用域引用问题 } // 配置工厂Bean,直接用Lambda实现Function接口 headerHandlerFactory = { HttpServletRequest request -> applicationContext.getBean(MelHeaders, request) } as Function<HttpServletRequest, MelHeaders>
注意事项
- 替换代码中的
com.yourpackage为实际的包路径 - 确保
MelHeaders类存在接收HttpServletRequest的构造函数 - 请求作用域Bean必须启用
scopedProxy,否则单例Bean引用时会抛出作用域不匹配异常 - Grails 2.5.6基于Spring 4.1.x,上述配置完全兼容该版本
内容的提问来源于stack exchange,提问作者SebasRios94
相关产品推荐
相关产品推荐

