配置切面出現問題,執行監聽前後方法執行兩次情況
阿新 • • 發佈:2019-02-09
import java.sql.Connection; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.zy.dev.dao.impl.JdbcDao; @Aspect @Component public class TxAop { @Autowired JdbcDao jdbcDao; Connection conn; @Before("execution(public * com.zy.dev.service.UserService.*(..))") public void before(JoinPoint joinPoint) throws Exception { conn = jdbcDao.getJdbcTemplate().getDataSource().getConnection(); conn.setAutoCommit(false); Object[] args = joinPoint.getArgs(); String name = joinPoint.getSignature().getName(); System.out.println("執行" + name + "前執行---日誌"); } @After("execution(public * com.zy.dev.service.UserService.*(..))") public void atfer(JoinPoint joinPoint) throws Exception { //conn.commit(); conn.commit(); String name = joinPoint.getSignature().getName(); System.out.println("執行" + name + "後執行---日誌"); } @AfterThrowing(value = "execution(public * com.zy.dev.service.UserService.*(..))", throwing = "e") public void atfer(JoinPoint joinPoint, Throwable e) throws Exception { conn.rollback(); e.printStackTrace(); String name = joinPoint.getSignature().getName(); System.out.println("執行" + name); } }
配置檔案
<aop:aspectj-autoproxy proxy-target-class="true" />
如果其中切面呼叫方法有兩次執行,那麼檢視spring的切面這類配置了註解和xml兩種,去掉其中一種就可以
<bean class="com.zy.dev.service.TxAop"></bean>和
@Aspect
@Component
public class TxAop {
只能要一種