我正在尝试学习groovy并将其与现有的Java jar集成。 java代码使用了DI,但我似乎无法从我的groovy脚本中使用它。
Java应用程序包含使用Mybatis的数据访问层。该层由许多接口(例如IUser)和控制器组成 e.g。
@Service
public class UserController implements IUser
控制器使用Mybatis Mapper类。
使用Spring并使用default-autowire =“byName”>
将整个事物拉到一起它设置为使用注释来访问控制器内的映射器。
在Spring中配置Mybatis来扫描和注入映射器
<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包含在groovy脚本中时,我开始遇到一些问题。我为Spring使用相同的applicationContext文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("controller-layer-applicationContext.xml");
当我作为脚本运行时,我可以从日志中看到组件被扫描。我的一些控制器包含一个被调用的@PostConstruct方法,并且成功执行了数据库查询。但是,当我尝试从我的脚本调用我的控制器时,我得到空指针错误。
我尝试使用@Autowired在groovy中创建我的控制器,但它们似乎没有被注入。我已根据http://groovy.codehaus.org/Using+Spring+Factories+with+Groovy中的示例实现了factory.registerBeanDefinition() 但是这似乎可以创建我的控制器,但我的控制器中的Mybatis Mappers返回null
如何确保我的控制器从Groovy正确自动装配?
答案 0 :(得分:0)
好的,我有一些有用的东西。取自答案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);