我正在尝试学习 groovy 并将其与现有的 Java jar 集成。 java代码使用了DI,但我似乎无法让它从我的groovy脚本中工作。
Java 应用程序包含使用 Mybatis 的数据访问层。该层由许多接口(interface)(例如 IUser)和 Controller 组成 例如
@Service
public class UserController implements IUser
Controller 使用 Mybatis Mapper 类。
整个事情是使用 Spring 和 default-autowire="byName"> 组合在一起的
它设置为使用注释来访问 Controller 内的映射器。
Mybatis在Spring中配置为扫描并注入(inject)映射器
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.directski.data.mapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
所以当我在 java 中运行我的应用程序时,一切正常。包括我使用
调用的任何映射器@Autowired
private UserMapper userMapper;
当我尝试将这个 jar 作为常规脚本的一部分包含时,我开始遇到一些问题。我对 Spring 使用相同的 applicationContext 文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("controller-layer-applicationContext.xml");
当我作为脚本运行时,我可以从日志中看到组件已被扫描。我的一些 Controller 包含一个被调用的 @PostConstruct 方法,并且数据库查询被成功执行。但是,当尝试从脚本调用我的 Controller 时,我收到空指针错误。
我尝试使用 @Autowired 在 groovy 中创建我的 Controller ,但它们似乎没有被注入(inject)。我还按照http://groovy.codehaus.org/Using+Spring+Factories+with+Groovy中的示例实现了factory.registerBeanDefinition() 然而,这似乎确实让我的 Controller 被创建,但我的 Controller 中的 Mybatis 映射器返回 null
我如何确保我的 Controller 能够从 Groovy 正确自动连接?
最佳答案
好的,所以我有一些可以工作的东西。摘自答案 5 How to programmatically create bean definition with injected properties?
public class AppContextExtendingBean implements ApplicationContextAware{
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{
AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();
version1(beanFactory);
}
private void version1(AutowireCapableBeanFactory beanFactory){
IUser userController= (UserController) beanFactory.createBean(UserController,AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
beanFactory.initializeBean(userController, "user");
User testuser = userController.getUser(3);
}
}
ApplicationContext ctx = new ClassPathXmlApplicationContext("controller-layer-applicationContext.xml");
AppContextExtendingBean bean = new AppContextExtendingBean();
bean.setApplicationContext(ctx);
关于java - 如何从 Groovy Spring 注入(inject)我的 Controller 层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17588810/