spring的基于注解的AOP配置案例

配置方法类

第一步:导入需要的jar包坐标


    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.7</version>
        </dependency>
    </dependencies>

第二步:在配置文件中导入context的名称空间

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:aop="http://www.springframework.org/schema/aop"                                  
 xmlns:context="http://www.springframework.org/schema/context"     
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     
 xsi:schemaLocation="http://www.springframework.org/schema/beans             
   http://www.springframework.org/schema/beans/spring-beans.xsd             
   http://www.springframework.org/schema/aop                 
   http://www.springframework.org/schema/aop/spring-aop.xsd 
   http://www.springframework.org/schema/context                     
   http://www.springframework.org/schema/context/spring-context.xsd"> 


 <!-- 配置数据库操作对象 -->  
<bean id="dbAssit" class="com.itheima.dbassit.DBAssit">   
    <property name="dataSource" ref="dataSource"></property> 
      <!-- 指定 connection 和线程绑定 -->   
    <property name="useCurrentConnection" value="true"></property>  
</bean>   
 <!-- 配置数据源 --> 
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>   
    <property name="jdbcUrl" value="jdbc:mysql:///spring_day02"></property>   
    <property name="user" value="root"></property>   
    <property name="password" value="1234"></property>  
  </bean> 
</beans> 

第三步:把资源使用注解配置

/** 
 * 账户的业务层实现类 
 * @author 黑马程序员 
 * @Company http://www.ithiema.com  * @Version 1.0  
*/ 
@Service("accountService") 
public class AccountServiceImpl implements IAccountService {    
    @Autowired 
    private IAccountDao accountDao; 
}
/** 
 * 账户的持久层实现类 
 * @author 黑马程序员  
* @Company http://www.ithiema.com 
 * @Version 1.0  
*/ 
@Repository("accountDao") 
public class AccountDaoImpl  implements IAccountDao { 
 
     @Autowired  
    private DBAssit dbAssit ;
 } 

第四步:在配置文件中指定 spring 要扫描的包 

<!-- 告知 spring,在创建容器时要扫描的包 --> 
<context:component-scan base-package="com.itheima"></context:component-scan>

配置通知类

第一步:把通知类也使用注解配置 

/** 
 * 事务控制类  * @author 黑马程序员 
 * @Company http://www.ithiema.com 
 * @Version 1.0  
*/ 
@Component("txManager") 
public class TransactionManager { 
     //定义一个 DBAssit 
     @Autowired 
     private DBAssit dbAssit ; 
 } 

第二步:在通知类上使用@Aspect 注解声明为切面 

/** 
 * 事务控制类  
* @author 黑马程序员  
* @Company http://www.ithiema.com  * @Version 1.0  
*/ 
@Component("txManager") 
@Aspect//表明当前类是一个切面类 
public class TransactionManager {   
     //定义一个 DBAssit  
     @Autowired 
     private DBAssit dbAssit ; 
} 

第三步:在增强的方法上使用注解配置通知 

@Before 
 作用:  
 把当前方法看成是前置通知。  
属性:   value:用于指定切入点表达式,还可以指定切入点表达式的引用。   
 
//开启事务  
@Before("execution(* com.itheima.service.impl.*.*(..))") 
 public void beginTransaction() { 
  try {    
    dbAssit.getCurrentConnection().setAutoCommit(false);   
} catch (SQLException e) {    
    e.printStackTrace();   
    }  
} 
 
 
 @AfterReturning 
 作用:   把当前方法看成是后置通知。  
属性:   
value:用于指定切入点表达式,还可以指定切入点表达式的引用 
 
 //提交事务  
@AfterReturning("execution(* com.itheima.service.impl.*.*(..))")  
public void commit() { 
 try {    
    dbAssit.getCurrentConnection().commit();   
} catch (SQLException e) {    
    e.printStackTrace();   
    } 
} 



 @AfterThrowing 
 作用:   把当前方法看成是异常通知。  
属性:    value:用于指定切入点表达式,还可以指定切入点表达式的引用  
//回滚事务  
@AfterThrowing("execution(* com.itheima.service.impl.*.*(..))")  
public void rollback() { 
  try {    
    dbAssit.getCurrentConnection().rollback();   
} catch (SQLException e) {    
    e.printStackTrace();  
     } 
} 
 
@After 
 作用:   把当前方法看成是最终通知。  
属性:   value:用于指定切入点表达式,还可以指定切入点表达式的引用  
//释放资源  
@After("execution(* com.itheima.service.impl.*.*(..))")  
public void release() {   
try {   
     dbAssit.releaseConnection();   
} catch (Exception e) {   
     e.printStackTrace();   
    }  
} 

 第四步:在 spring 配置文件中开启 spring 对注解 AOP 的支持 

<!-- 开启 spring 对注解 AOP 的支持 --> 
<aop:aspectj-autoproxy/>

环绕通知注解配置 

@Around 
作用:  把当前方法看成是环绕通知。 
属性:  value:用于指定切入点表达式,还可以指定切入点表达式的引用。 
 
/** 
  * 环绕通知   
* @param pjp   
* @return   
*/  
@Around("execution(* com.itheima.service.impl.*.*(..))")  
public Object transactionAround(ProceedingJoinPoint pjp) { 
  //定义返回值  
     Object rtValue = null;   
try { 
   //获取方法执行所需的参数    
    Object[] args = pjp.getArgs(); 
   //前置通知:开启事务    
    beginTransaction(); 
   //执行方法    
    rtValue = pjp.proceed(args); 
   //后置通知:提交事务   
     commit();   
}catch(Throwable e) { 
   //异常通知:回滚事务    
    rollback();    
    e.printStackTrace();   
}finally {    
    //最终通知:释放资源    
    release();   
}   
    return rtValue;  
} 

 切入点表达式注解 

@Pointcut 
作用:  指定切入点表达式 、
属性: 
value:指定表达式的内容 
 
@Pointcut("execution(* com.itheima.service.impl.*.*(..))") 
private void pt1() {
} 
 
引用方式:
  /** 
  * 环绕通知   
* @param pjp  
 * @return   
*/ 
 @Around("pt1()")//注意:千万别忘了写括号 
 public Object transactionAround(ProceedingJoinPoint pjp) {   
    //定义返回值   
    Object rtValue = null;  
 try { 
      //获取方法执行所需的参数    
    Object[] args = pjp.getArgs(); 
   //前置通知:开启事务    
    beginTransaction(); 
   //执行方法    
    rtValue = pjp.proceed(args); 
   //后置通知:提交事务    
    commit();   
}catch(Throwable e) { 
   //异常通知:回滚事务    
    rollback();    
    e.printStackTrace();  
 }finally {   
     //最终通知:释放资源    
    release();  
 }   
    return rtValue;  
} 

不使用 XML的配置方式 
 

@Configuration 
@ComponentScan(basePackages="com.itheima") 
@EnableAspectJAutoProxy 
public class SpringConfiguration {
 } 
 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值