Java中被调用方法内部使用的对象的Alter属性

时间:2018-11-14 10:09:48

标签: java spring hibernate reflection aop

我有一个使用maven作为构建机制的Java春季Web应用程序。考虑以下代码(我的情况的过度简化版本),其中控制器调用服务以执行某些操作,然后又调用某些DAO方法来执行DB中的某些操作。

class MyController extends Controller {
    public ModelAndView handleRequest(... request) {
        boolean performCheck = Boolean.valueOf(request.getParameter("doCheck"));
        myService.doSomeAction(object)
        return ...; 
    } 
}

class MyService {
    public void doSomeAction(Object o){
        myDao.doSomething(o);
    }
}

class MyDao exterds HibernateDaoSuppot {
    boolean check;

    public void doSomething(Object o){
        if(check == true){
            // some action
        } else {
            // some other action
        }

    }
}

我的问题是,如何根据我在控制器中收到的值,在Dao方法中更改检查布尔值,而无需在所有层中都明确传递布尔值?我使用的是具有许多业务逻辑的遗留代码,并且业务团队没有信心对现有代码进行太多修改。但是,我可以随意添加任何类或方面来执行相同的操作。

我尝试读取DAO方法中的调用堆栈并确定上面的几层布尔值,但是我对使用调用堆栈并不满意,而且我担心将来应用程序体系结构或JVM更改可能会有所变化弄乱了调用堆栈。

4 个答案:

答案 0 :(得分:1)

当然最好是传递布尔变量。但反而;您可以声明两个函数,一个用于perfromCheck == true,另一个用于performCheck == false,然后根据performCheck的值从控制器调用。

答案 1 :(得分:1)

您可以在对象中添加一个瞬态(仅当对象是一个持久对象时才是瞬态的)布尔字段。

在将对象传递给服务之前,在控制器中设置布尔值。 您甚至不需要在DAO层中维护单独的检查变量。

您的控制器可能如下所示:

class MyController extends Controller {
    public ModelAndView handleRequest(... request) {
        object.setPerform(Boolean.valueOf(request.getParameter("doCheck"))); // object has a boolean field named 'perform'
        myService.doSomeAction(object)
        return ...; 
    } 
}

您的MyDao可能如下所示:

class MyDao exterds HibernateDaoSuppot {
    //boolean check; wont need this

    public void doSomething(Object o){
        if(o.getPerform() == true){
            // some action
        } else {
            // some other action
        }
    }
}

答案 2 :(得分:1)

以您的情况为例:“ check”是MyDao的属性,您想从方法范围动态更改它,如果您使用单个实例,则可能会导致并发问题,不建议这样做。

如上述用户所述,您可以在应用中使用两个MyDao实例,一个实例使用True声明,另一个实例使用False,然后由您的控制器确定要使用哪个实例。

答案 3 :(得分:0)

您可以在控制器中将布尔值设为私有类属性,然后使用getter从Dao中访问其值。