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

Java中被调用方法内部使用的对象的Alter属性,java,spring,hibernate,reflection,aop,Java,Spring,Hibernate,Reflection,Aop,我有一个java、SpringWeb应用程序,使用maven作为构建机制。考虑下面的代码(在我的情况下过于简单化),其中一个控制器调用一个服务来执行一些操作,并调用DAO方法在DB中执行一些动作。 class MyController extends Controller { public ModelAndView handleRequest(... request) { boolean performCheck = Boolean.valueOf(request.get

我有一个java、SpringWeb应用程序,使用maven作为构建机制。考虑下面的代码(在我的情况下过于简单化),其中一个控制器调用一个服务来执行一些操作,并调用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更改会打乱调用堆栈。

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

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

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

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

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

在将对象传递给服务之前,在控制器中设置布尔值。 您甚至不需要在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 ...; 
    } 
}
class MyDao exterds HibernateDaoSuppot {
    //boolean check; wont need this

    public void doSomething(Object o){
        if(o.getPerform() == true){
            // some action
        } else {
            // some other action
        }
    }
}
您的MyDao可能看起来像:

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 ...; 
    } 
}
class MyDao exterds HibernateDaoSuppot {
    //boolean check; wont need this

    public void doSomething(Object o){
        if(o.getPerform() == true){
            // some action
        } else {
            // some other action
        }
    }
}
您可以在对象中添加一个瞬态(仅当对象是持久对象时才是瞬态)布尔字段

在将对象传递给服务之前,在控制器中设置布尔值。 您甚至不需要在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 ...; 
    } 
}
class MyDao exterds HibernateDaoSuppot {
    //boolean check; wont need this

    public void doSomething(Object o){
        if(o.getPerform() == true){
            // some action
        } else {
            // some other action
        }
    }
}
您的MyDao可能看起来像:

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 ...; 
    } 
}
class MyDao exterds HibernateDaoSuppot {
    //boolean check; wont need this

    public void doSomething(Object o){
        if(o.getPerform() == true){
            // some action
        } else {
            // some other action
        }
    }
}
就您的情况而言:“check”是MyDao的属性,您希望从方法范围动态更改它,如果您使用单个实例,这可能会导致并发问题,这是不推荐的

如上用户所述,您可以在应用程序中使用两个MyDao实例,一个声明为True,另一个声明为False,您的控制器决定使用哪个实例。

根据您的情况:“check”是MyDao的属性,您希望从方法范围动态更改它,如果使用单个实例,可能会导致并发问题,这是不可取的


如上用户所述,您可以在应用程序中使用两个MyDao实例,一个声明为True,另一个声明为False,您的控制器决定使用哪一个。

不确定您为什么需要从RestController更改singleton类字段的值。这可能会导致无法识别的错误。@SukhpalSingh是的,你是对的。但在DAO层中,我没有任何其他选项来执行两个不同的操作。正如我所说,这是一个我没有编写的代码,但是我被要求在没有任何主要代码更改的情况下执行此检查。如果
check
变量是由您引入的,那么创建一个类型为
CheckObject
的新对象(请说出更好的名称),并从您的控制器层使用它。然后可以使用
instanceof
进行检查。不确定为什么需要从RestController更改singleton类字段的值。这可能会导致无法识别的错误。@SukhpalSingh是的,你是对的。但在DAO层中,我没有任何其他选项来执行两个不同的操作。正如我所说,这是一个我没有编写的代码,但是我被要求在没有任何主要代码更改的情况下执行此检查。如果
check
变量是由您引入的,那么创建一个类型为
CheckObject
的新对象(请说出更好的名称),并从您的控制器层使用它。然后您可以使用
instanceof
进行检查。