Using spring @Transactional by a method that also uses aop: after consultation

I tried to see if there was already a similar question, but could not find it, here it is.

we have legacy code where one BO calls method calls for many DAOs using reflection. I changed the code for simplicity.

@Transactional
class EndpointData1DAO implements DAO{
  void inserData() {
   // insert data 1
  }
}

@Transactional
class EndpointData2DAO implements DAO{
  void inserData() {
    // insert data 2
  }
}

class MachoBO {
 void handleEverything(String daoName) {
   DAO dao = getDAOUsingReflection(daoName);
   dao.insertData();
 }
}

the problem is that the requirement has changed, so when insertData () is called in EndpointData1DAO, EndpointData2DAO must also be specified in insertData.

I could just add EndpointData2DAO as a member of EndpointData1DAO, but this greatly violates SRP and makes it ugly.

@ExecuteAfter (clazz = EndpointData2DAO.class, method = "insertData" ), EndpointData2DAO insertData(), , , , aop: after,

@Transactional
@ExecuteAfter(clazz=EndpointData2DAO.class, method="insertData") 
class EndpointData1DAO implements DAO{
  void inserData() {
   System.out.println("insert1");
  }
}

@Transactional
class EndpointData2DAO implements DAO{
  void inserData() {
   System.out.println("insert2");
  }
}

class MachoBO {
 void handleEverything(String daoName) {
   DAO dao = getDAOUsingReflection(daoName);
   dao.insertData();
 }

1 2 machoBO.handleEverthing( "Data1" );

: Data() EndpointData1DAO EndpointData2DAO ? , EndpointData2DAO insertData() , EndpointData1DAO 'insertData()?

thanx ~!!

+3
1

, .

, .

ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
        Class tsmClass = contextClassLoader.loadClass("org.springframework.transaction.support.TransactionSynchronizationManager");
        String transactionName = (String) tsmClass.getMethod("getCurrentTransactionName", null).invoke(null, null);
        System.out.println(transactionName);

, @Transactional MachoBO, ,

@Transactional
class MachoBO {
 void handleEverything(String daoName) {
   DAO dao = getDAOUsingReflection(daoName);
   dao.insertData();
 }

@Transactional " ", machoBO.handleEverthing("Data1"); , inserData() DAO "MachoBO.handleEverthing".

, MachoBO @Transactional, inserData() DAO , , , "EndpointData1DAO.inserData" "EndpointData2DAO.insertData".

, ( ), , DAO @Transactional REQUIRES_NEW, insertData() DAO .

0

All Articles