在我正在开发的当前应用程序中,我们觉得需要动态地重新评估一些DAO逻辑,而无需进行新的部署。
为此,我选择尝试Spring-Groovy集成。
我已经连接了bean,在Groovy脚本中我可以获得javax.sql.Datasource对象的句柄。
但是当事务操作发生时我遇到了问题,例如,如果我在某个java风格的DAO中插入,那么在groovy风格的DAO中行是不可见的,即使它是从标记为@Transactional
的同一服务中调用的。
如果我需要提供其他任何细节,我会尝试提供一些相关的代码。
public class App {
public static void main(String[] args) {
final AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(BaseConfig.class);
TestService ts = ctx.getBean(TestService.class);
ts.testGroovy();
}
}
@Service
@Transactional
public class TestServiceImpl implements TestService {
@Autowired
private HibernateDAO hibernateDAO;
@Autowired
private OtherDAO otherDAO;
@Autowired
private Groovy groovy;
@Override
public void testGroovy() {
hibernateDAO.makeInsert(); //actually now it makes a jdbc insert, no need for flush session
//throw new RuntimeException("error");
groovy.testInjection();
otherDAO.verifyInsert();
}
}
java DAO:
@Repository
public class HibernateDAOImpl implements HibernateDAO{
@Autowired
private DataSource dataSource;
@Override
public void makeInsert() {
Connection connection = DataSourceUtils.getConnection(dataSource);
try {
PreparedStatement ps = connection.prepareStatement("insert into GROOVY_TEST values(?,?)");
ps.setLong(1, System.currentTimeMillis());
ps.setString(2, UUID.randomUUID().toString());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
用于代理的接口:
public interface Groovy {
void testInjection();
}
为了在Groovy中注入Datasource,我扩展了一个自动装配Datasource实例的java类。
public abstract class GroovyHelper implements Groovy{
@Autowired
private DataSource dataSource;
public DataSource getDataSource() {
return dataSource;
}
}
groovy文件:
import ro.asf.groovy.GroovyHelper
import javax.sql.DataSource
import groovy.sql.Sql
class GroovyImpl extends GroovyHelper {
void testInjection() {
//throw new RuntimeException("error")
Sql sql = new Sql(dataSource)
sql.eachRow('''SELECT * FROM GROOVY_TEST ''', { article ->
println article.value
})
}
}
用于将groovy脚本连接到spring的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">
<lang:groovy id="groovy" script-source="file:scripts/Groovy.groovy" />
</beans>
在验证DAO层中,插入符被视为预期。
谢谢,
丹尼尔