Java中被调用方法内部使用的对象的Alter属性
我有一个java、SpringWeb应用程序,使用maven作为构建机制。考虑下面的代码(在我的情况下过于简单化),其中一个控制器调用一个服务来执行一些操作,并调用DAO方法在DB中执行一些动作。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
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
进行检查。