如何Spring从Groovy注入我的控制器层

时间:2013-07-11 08:39:14

标签: java spring groovy mybatis

我正在尝试学习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正确自动装配?

1 个答案:

答案 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);