如何通过反射调用带有@transactional和@service批注的服务类中的方法?

时间:2019-04-11 01:45:43

标签: java spring hibernate reflection

首先,请原谅我的英语不好,我只是在努力学习英语:)。

由于我使用ActiveMQ作为面向消息的中间件,因此我试图找到一种使前端和后端之间的通信更简单的方法。因此XML字符串成为了请求的载体。

例如,前端向后端发送一个字符串请求,包括程序包名称,类名称,方法名称和参数列表,这样,后端就可以通过这些信息调用正确的方法,并发送将结果调用回前端。它有效,但并不完美。问题是,当我尝试在服务类中使用@Transational@Service注解(这是连接数据库的常见做法)调用方法时,事务似乎没有打开,请求和既收到响应,又在mysql数据库进程中留下了很多休眠连接,每次都与ActiveMQ的使用者一样多。

enter image description here

服务类中的目标方法:

@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上下文中获得的代理对象?我对动态代理模型不是很熟悉。

感谢您的关注,请告诉我是否做错了事。

1 个答案:

答案 0 :(得分:0)

我正要尝试以下方法:

不要使用BeanFactory,在ReflectTool中插入ApplicationContect:@Autowired私有ApplicationContext applicationContext;如果要恢复的bean实现了某个接口或扩展了一个类,则可以用Map替换此注入。春天将使之工作

尝试获取所需的bean对象。

关于方法和执行的捕获的行应该起作用,因为它是一个调用另一个bean的bean。

希望这会有所帮助。在类似的情况下,我需要调用@Transactional方法,并以与上述相同的方式进行修复。