• Spring框架之环绕增强


    环绕增强的功能比较强大

    环绕增强的特点:

      目标方法前后都可织入增强处理

      功能最强大的增强处理

      可获取或修改目标方法的参数、返回值,可对他进行异常处理,甚至可以决定目标方法是否执行。

    <aop:around> 定义坏绕增强

    还是接着上一个案例的代码进行改造

    UserServiceLogger.java

     1     //环绕增强
     2     public void aroundLogger(ProceedingJoinPoint joinPoint) {
     3         //下面是目标方法的前面执行的处理
     4         logger.info("调用" + joinPoint.getTarget() + "的"
     5                 + joinPoint.getSignature() + "方法,方法参数是:"
     6                 + Arrays.toString(joinPoint.getArgs()));
     7         Object result;//这个相当于是目标方法  
     8         try {
     9             //下面是目标方法之后进行的处理
    10                 result = joinPoint.proceed();
    11                 logger.info("调用"+joinPoint.getTarget()+"的"+joinPoint.getSignature()+"方法,方法返回值:"+result);
    12             
    13         } catch (Throwable e) {
    14             logger.error(joinPoint.getSignature().getName()+"方法发生异常"+e);
    15             e.printStackTrace();
    16         } finally{
    17             
    18         }
    19     }

    UserDaoImpl.java

     1 package dao.impl;
     2 
     3 import dao.UserDao;
     4 import entity.User;
     5 
     6 /**
     7  * 用户DAO类,实现IDao接口,负责User类的持久化操作
     8  */
     9 public class UserDaoImpl implements UserDao {
    10 
    11     public void save(User user) {
    12         // 这里并未实现完整的数据库操作,仅为说明问题
    13         System.out.println("保存用户信息到数据库");
    14         //throw new RuntimeException("为了测试程序异常");
    15     }
    16 }

    UserServiceImpl.java

     1 package service.impl;
     2 
     3 import service.UserService;
     4 import dao.UserDao;
     5 import entity.User;
     6 
     7 /**
     8  * 用户业务类,实现对User功能的业务管理
     9  */
    10 public class UserServiceImpl implements UserService {
    11 
    12     // 声明接口类型的引用,和具体实现类解耦合
    13     private UserDao dao;
    14 
    15     
    16 
    17     // 生成无参构造方法
    18     public UserServiceImpl() {
    19 
    20     }
    21 
    22     // 带参数构造方法   为dao进行赋值
    23     public UserServiceImpl(UserDao dao) {
    24         this.dao = dao;
    25     }
    26 
    27 
    28     public UserDao getDao() {
    29         return dao;
    30     }
    31 
    32     // dao 属性的setter访问器,会被Spring调用,实现设值注入
    33     public void setDao(UserDao dao) {
    34         this.dao = dao;
    35     }
    36 
    37     public void addNewUser(User user) {
    38         // 调用用户DAO的方法保存用户信息
    39         dao.save(user);
    40         System.out.println("注入进去的user对象的信息是:"+user.toString());
    41     }
    42 }

    在核心配置文件中配置环绕增强

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
     4     xsi:schemaLocation="http://www.springframework.org/schema/beans
     5     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
     6     http://www.springframework.org/schema/aop
     7     http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
     8     <!--以上是Spring框架的头信息 使用p命名空间注入 -->
     9     <bean id="dao" class="dao.impl.UserDaoImpl"></bean>
    10     <bean id="service" class="service.impl.UserServiceImpl">
    11         <property name="dao" ref="dao"></property>
    12     </bean>
    13     <!-- 声明增强方法所在的Bean -->
    14     <bean id="theLogger" class="aop.UserServiceLogger"></bean>
    15     <aop:config>
    16         <!--定义切入点 -->
    17         <aop:pointcut expression="execution(public void addNewUser(entity.User))"
    18             id="pointcut" />
    19         <aop:aspect ref="theLogger">
    20             <aop:around method="aroundLogger"
    21                 pointcut-ref="pointcut"  />
    22         </aop:aspect>
    23     </aop:config>
    24 </beans>

    编写测试方法

     1 public class AopTest {
     2 
     3     @Test
     4     public void aopTest() {
     5         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
     6         UserService a = (UserService) ctx.getBean("service");
     7         User user=new User();
     8         user.setUsername("丫丫");
     9         a.addNewUser(user);
    10     }
    11 
    12 }

    运行结果:

    12-30 18:14:52[INFO]aop.UserServiceLogger
    -调用service.impl.UserServiceImpl@460d0a57的void service.UserService.addNewUser(User)方法,方法参数是:[entity.User@36c88a32]
    保存用户信息到数据库
    注入进去的user对象的信息是:entity.User@36c88a32
    12-30 18:14:52[INFO]aop.UserServiceLogger
    -调用service.impl.UserServiceImpl@460d0a57的void service.UserService.addNewUser(User)方法,方法返回值:null

  • 相关阅读:
    图片延迟加载
    JS 数组操作
    XML转成dataset
    Android的layout_weight使用方法
    Android五大布局学习笔记【转 有改动】
    JSONP
    Android中dip、dp、sp、pt和px的区别和使用
    捕鱼和分鱼
    Android中可能导致ActivityNotFoundException的一些问题总结
    一张图片引发的思考——Android图片加载
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/12119224.html
Copyright © 2020-2023  润新知