Конфигурация:
<tx:annotation-driven transaction-manager="txManager" />
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- (this dependency is defined somewhere else) -->
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springjdbc?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>
Класс:
@Component
public class SomeNumbersMySQLDao{
public JdbcTemplate jdbcTemplate;
@Autowired
public SomeNumbersMySQLDao self;
@Autowired
public SomeNumbersMySQLDao(DataSource dataSource){
jdbcTemplate = new JdbcTemplate(dataSource);
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
SomeNumbersMySQLDao dao = context.getBean("someNumbersMySQLDao", SomeNumbersMySQLDao.class);
dao.cleanTable();
dao.outer(123);
//dao.printTable();
}
@Transactional(propagation=Propagation.REQUIRED)
public void outer(int number) {
System.out.println(TransactionSynchronizationManager.isActualTransactionActive());
jdbcTemplate.update("INSERT INTO someNumbers (number) VALUES (?)", new Object[] {number});
self.withNever(number);
}
@Transactional(propagation=Propagation.NEVER)
public void withNever(int numberToInsertInInnerMethod) {
System.out.println(TransactionSynchronizationManager.isActualTransactionActive());
jdbcTemplate.update("INSERT INTO someNumbers (number) VALUES (?)", new Object[] {numberToInsertInInnerMethod});
jdbcTemplate.update("asdfghjkl;'qwertyuiop[]zxcvbnm,./");
}
}
И это будет работать. Вывод:
true
Exception in thread "main" org.springframework.transaction.IllegalTransactionStateException: Existing transaction found for transaction marked with propagation 'never'
Однако мне надо, чтобы я мог вызывать не метод внедренного класса, а метод самого класса изнутри. То есть не
self.withNever(number), а
withNever(number). Что мне нужно добавить в файл конфигурации, чтобы я мог достичь этого
эффекта?