У меня было требование, где мне нужно установить идентификатор Oracle через Spring AOP. Итак, я наткнулся на один кусок кода, который работает нормально, но я не могу понять, как именно он работает
Аспект класса
@RequiredArgsConstructor
@Component
@Aspect
public class ConnectionPreparerAspect {
@AfterReturning(value = "execution(java.sql.Connection javax.sql.DataSource.getConnection(..))", returning = "connection")
public void prepare(Connection connection) throws SQLException {
CallableStatement cs = connection.prepareCall("{ call DBMS_SESSION.SET_IDENTIFIER(?) }");
cs.setString(1, "identifier");
cs.execute();
cs.close();
}
}
DataSource
@Bean
@Primary
@FlywayDataSource
public DataSource dataSource() {
JndiDataSourceLookup orchestratorDataSourceLookUp = new JndiDataSourceLookup();
orchestratorDataSourceLookUp.setResourceRef(true);
final DataSource dataSource = orchestratorDataSourceLookUp.getDataSource("datasource/url");
return new DelegatingDataSource(dataSource);
}
Так вот, мой вопрос
- Если я создаю JNDI DataSource, то PointCut не работает, но с делегированием Data Source он работает. Почему?
- Поскольку я использую загрузку Spring, и я установил свойство «spring.datasource.jndi-name» в файле свойств, который автоматически создает JSDI dataSource, тогда снова мне нужно создать DelegatingDataSource с именем dataSource.
- В чем разница между DelegatingDataSource и JndiDataSourceLookup DataSource.