首先,请原谅我的英语不好,我只是在努力学习英语:)。
由于我使用ActiveMQ作为面向消息的中间件,因此我试图找到一种使前端和后端之间的通信更简单的方法。因此XML字符串成为了请求的载体。
例如,前端向后端发送一个字符串请求,包括程序包名称,类名称,方法名称和参数列表,这样,后端就可以通过这些信息调用正确的方法,并发送将结果调用回前端。它有效,但并不完美。问题是,当我尝试在服务类中使用@Transational
和@Service
注解(这是连接数据库的常见做法)调用方法时,事务似乎没有打开,请求和既收到响应,又在mysql数据库进程中留下了很多休眠连接,每次都与ActiveMQ的使用者一样多。
服务类中的目标方法:
@Service
@Transactional
public class UserService {
@Autowired
private IUserDAO udao;
public User getUserByName(String username) {
return udao.findByUsername(username);
}
}
调用方法(某些代码已被省略):
@Component
public class ReflectTool {
public Object invokeMethod(String packageName,String className,String methodName,List paramList) {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext.xml");
Object obj = beanFactory.getBean(packageName+"."+className);
Class cla = obj.getClass();
Method method = findMethod(Class cla,String methodName);
return method.invoke(obj, params);
}
}
我搜索了很多答案,但是没有一个起作用。就像:使用代理对象而不是目标对象来调用,因为spring框架使用了带有@Transactional
注释的代理类而不是服务类来帮助我们管理事务,但是代码(AopUtils.isAopProxy(obj)
)返回true
,是否意味着该对象正是我从spring上下文中获得的代理对象?我对动态代理模型不是很熟悉。
感谢您的关注,请告诉我是否做错了事。
答案 0 :(得分:0)
我正要尝试以下方法:
不要使用BeanFactory,在ReflectTool中插入ApplicationContect:@Autowired私有ApplicationContext applicationContext;如果要恢复的bean实现了某个接口或扩展了一个类,则可以用Map替换此注入。春天将使之工作
尝试获取所需的bean对象。
关于方法和执行的捕获的行应该起作用,因为它是一个调用另一个bean的bean。
希望这会有所帮助。在类似的情况下,我需要调用@Transactional方法,并以与上述相同的方式进行修复。