IOC和AOP使用拓展 (3)

Spring AOP配置元素

AOP配置元素 描 述
  AOP配置的顶层元素,大多数的<aop:*>元素必须包含在  
  定义切点  
  定义切点  
  定义最终增强(不管被通知的方法是否执行成功)  
  定义after-returning增强  
  定义after-throwing增强  
  定义环绕增强  
  定义前置增强  
  启动@AspectJ注解驱动的切面  
使用注解实现IOC的配置

前面我们说过用xml的形式配置IOC,那种方式是比较麻烦的,在Spring2.0以后的版本我们就可以使用注解来配置,进一步减少了配置文件的代码
使用注解定义Bean

/** * 用户业务类,实现对User功能的业务管理 */ @Service("userService") public class UserServiceImpl implements UserService { @Autowired // 默认按类型匹配 @Qualifier("userDao") // 按指定名称匹配 private UserDao dao; // 使用@Autowired直接为属性注入,可以省略setter方法 /*public void setDao(UserDao dao) { this.dao = dao; }*/ public void addNewUser(User user) { // 调用用户DAO的方法保存用户信息 dao.save(user); } }

上面代码我们通过注解定义了一个名为userDao的Bean@Autowired的作用和在xml文件中编写

<!--扫描包中注解标注的类--> <context:component-scan base-package="service,dao"/> <!--多个包之前用逗号隔开-->

Spring还提供了其他的注解
@Componet:实现Bean组件的定义
@Repository:用于标注DAO类
@Service:用于标注业务类
@Controller:用于标注控制器类
@Autowired:实现Bean的自动装配
@Qualifier:指定Bean的名称
@Resource:实现Bean的组件装配
大家可以查看Spring的开发手册 进一步了解他们的用法

使用注解定义切面

AspectJ
面向切面的框架,它扩展了Java语言,定义了AOP 语法,能够在编译期提供代码的织入
@AspectJ
AspectJ 5新增的功能,使用JDK 5.0 注解技术和正规的AspectJ切点表达式语言描述切面
Spring通过集成AspectJ实现了以注解的方式定义增强类,大大减少了配置文件中的工作量
利用轻量级的字节码处理框架asm处理@AspectJ中所描述的方法参数名
使用注解定义切面实现日志功能

/** * 使用注解定义切面 */ @Aspect public class UserServiceLogger { private static final Logger log = Logger.getLogger(UserServiceLogger.class); @Pointcut("execution(* service.UserService.*(..))") public void pointcut() {} @Before("pointcut()") public void before(JoinPoint jp) { log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName() + " 方法。方法入参:" + Arrays.toString(jp.getArgs())); } @AfterReturning(pointcut = "pointcut()", returning = "returnValue") public void afterReturning(JoinPoint jp, Object returnValue) { log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName() + " 方法。方法返回值:" + returnValue); } }

切入点表达式使用@Pointcut注解来表示,而切入点签名则需要一个普通的方法定义来提供,
如上面代码中的pointcut()方法,作为切入点签名的方法必须返回void类型,切入点定义好后,就可以使用pointcut()签名进行引用
定义完切面后,还需要在Spring配置文件中完成织入工作

<context:component-scan base-package="service,dao" /> <bean></bean> <aop:aspectj-autoproxy />

配置文件中首先要导入aop命名空间,只需要在配置文件中添加

使用注解定义其他类型增强

异常抛出增强

/** * 通过注解实现异常抛出增强 */ @Aspect public class ErrorLogger { private static final Logger log = Logger.getLogger(ErrorLogger.class); @AfterThrowing(pointcut = "execution(* service.UserService.*(..))", throwing = "e") public void afterThrowing(JoinPoint jp, RuntimeException e) { log.error(jp.getSignature().getName() + " 方法发生异常:" + e); } }

使用AfterThrowing注解可以定义异常抛出增强,如果需要获取抛出的异常,可以为增强方法声明相关类型的参数,并通过@AfterThrowing注解的throwing属性指定该参数名称,Spring会为其注入从目标方法抛出的异常实例
其他的方法都是大同小异,大家可以自己动手试一试
@Aspect(定义一个切面 )
@Before(前置增强)
@AfterReturning(后置增强)
@Around (环绕增强)
@AfterThrowing(异常抛出增强)
@After(最终增强)

在配置文件中添加

写的不好还有不懂的地方,大家可以留言一下 我会尽量解决
by安心

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjszd.html