使用注解创建通知
前面讲了创建通知,现在用注解来创建通知
具体案例分析
public interface Service {
/**去公司*/
public void goCompany();
/**签到*/
public void signIn();
/**请假*/
public void leave(Exception ex);
/**回家*/
public void goHome();
}
@Aspect//@Aspect是声明切面
public class ServiceImpl implements Service{
/**
* 第一个* 代表方法的返回值
* 第二个work()代表的是方法的名称
* */
//前置通知
@Before("execution(* work())")
public void goCompany() {System.out.println("去公司。。。");}
//前置通知
@Before("execution(* EmpServiceImpl.*(..))")
public void signIn() {
System.out.println("签到");
}
/**
* 第一个*代表的是方法的返回值
* 第二个cn.csdn.service.Emp* 位于cn.csdn.service包中前缀是Emp的所有类
* 第三个Emp*.后的*代表的是这个类中的所有方法
* 第四个(..)代表的是方法的参数可以是可变的参数
* */
//后置通知
@After("execution(* cn.csdn.service.Emp*.*(..))")
public void goHome() {
System.out.println("回家。。。");
}
//异常通知
@AfterThrowing(pointcut="execution(* *..EmpService*.*(..))",throwing="ex")
public void leave(Exception ex) {
System.out.println("请假"+ex.getMessage());
}
}
public interface EmpService {
void work();
}
public class EmpServiceImpl implements EmpService{
@Override
public void work() {
System.out.println("员工正在工作。。。。");
}
}
public interface AroundService {
public Object eat(ProceedingJoinPoint pj);
}
//环绕通知切面的具体实现
@Aspect
public class AroundServiceImpl implements AroundService{
@Around("execution(* EmpService.*(..))")
public Object eat(ProceedingJoinPoint pj) {
System.out.println("吃完饭就去上班。。。");
try {
Object ob=pj.proceed();
// 注:proceed()方法会调用目标方法
System.out.println("工作后要签到的。。。");
return ob;
} catch (Throwable e) {
System.out.println("下班回家喽。。。");
e.printStackTrace();
}
return null;
}
}
public class App {
@Test
public void test(){
/*解析xml文件创建容器对象*/
ApplicationContext ac=new ClassPathXmlApplicationContext("app*.xml");
/*接口代理*/
EmpService empService=(EmpService)ac.getBean("empServiceImpl");
empService.work();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ">
<!—注意一定要配xmlns:aop="http://www.springframework.org/schema/aop"-->
<!-- aspectj的bean -->
<bean id="serviceImpl" class="cn.csdn.service.ServiceImpl"/>
<!-- 环绕通知的切面的具体实现的bean -->
<bean id="aroundServiceImpl" class="cn.csdn.service.AroundServiceImpl"/>
<!-- 业务操作的bean -->
<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl"/>
<!—注意:一定要启用Spring对@AspectJ的支持 -->
<aop:aspectj-autoproxy/>
</beans>
分享到:
相关推荐
通过以上内容,我们可以看出,Spring使用注解实现通知,极大地简化了AOP的使用,使得切面逻辑与业务逻辑更易于分离,同时也提高了代码的可读性和可维护性。在实际开发中,合理运用这些通知类型,可以有效提升代码的...
在Java中,Spring框架提供了对AOP的强大支持,包括使用注解进行自动装配通知的功能。 标题"AOP中的注解自动装配通知"主要涉及两个关键概念:AOP和注解自动装配。首先,让我们详细了解一下这两个概念: **面向切面...
在Spring中,我们可以使用注解来声明切面、切点和通知。下面将详细介绍这些关键组件: 1. **@Aspect**: 这个注解用于标记一个类作为切面,这个类通常会包含切点和通知。 ```java @Aspect public class ...
1. **创建Aspect(切面)**:定义一个类,并使用`@Aspect`注解标记它。 2. **定义切入点(Pointcut)**:使用`@Pointcut`注解定义切入点表达式,匹配需要拦截的方法。 3. **编写通知(Advice)**:使用`@Before`、`@...
【Android消息推送通知栏】是Android系统中一个重要的特性,用于在用户不直接与应用程序交互时,向...通过阅读、理解和修改源码,开发者可以深入掌握通知的使用,从而在自己的项目中实现更高效、更个性化的通知功能。
然后创建一个切面类,并使用`@AspectJ`和`@DeclareParents`注解来实现引入: ```java @Aspect public class DebuggableAspect { @DeclareParents(value = "com.example.Calculator+", defaultImpl = ...
例如,我们可以使用`@Before`注解实现一个简单的方法调用前的日志记录: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore...
在Java世界中,Spring框架提供了基于注解的AOP实现,大大简化了AOP的使用。本篇文章将深入探讨如何使用注解实现AOP,以及其背后的原理。 首先,我们需要了解Spring AOP中的几个核心概念: 1. 切面(Aspect):切面...
1. **创建通知**:创建通知通常涉及创建`NotificationCompat.Builder`对象,设置通知的各种属性,如标题、内容、图标、优先级等。然后调用`build()`方法来构建`Notification`对象。 2. **通知频道(Notification ...
1. `@Aspect`:这个注解用于定义一个切面类,该类包含了若干个通知(advice)。 2. `@Before`:在目标方法执行前执行的通知,相当于传统的“前置通知”。 3. `@After`:在目标方法执行后总是执行的通知,无论目标...
最后,Spring会自动扫描并处理所有相关的注解,创建代理对象,并在适当的时间点执行通知。 总结一下,注解方式实现AOP编程主要包括以下几个步骤: 1. 创建一个`@Aspect`注解的类来定义切面。 2. 使用`@Pointcut`...
创建通知** 发布通知通常涉及到以下几步: - 定义通知名称:一个字符串常量,作为通知的唯一标识。 - 创建NSNotification对象:可以包含额外的用户信息。 - 使用NotificationCenter的`post`方法发布通知。 ```...
它们可以通过实现`org.springframework.aop.AfterReturningAdvice`和`org.springframework.aop.ThrowsAdvice`接口来创建,或者使用`@AfterReturning`和`@AfterThrowing`注解。 ```java @Aspect public class ...
6. **切点与通知的关联**:使用`@Before`, `@After`, `@AfterReturning`, `@AfterThrowing`或`@Around`注解,将通知与之前定义的切入点关联起来。注解中的`value`属性是切入点表达式,也可以直接引用已定义的`@...
创建通知的基本步骤如下: 1. **构建Notification对象**:使用`NotificationCompat.Builder`类创建一个通知构建器,设置通知的标题、内容、图标等属性。 2. **设置通知行为**:你可以设置通知的点击行为,比如启动...
定义注解涉及到创建一个注解类型,这可以通过@interface关键字完成。处理注解是指解析和执行注解中包含的信息,这通常是通过编译器或自定义注解处理器实现的。最后,使用注解就是在代码中合适的位置应用定义好的注解...
创建通知通常涉及以下几个步骤: 1. 创建`NotificationCompat.Builder`实例:这是构建通知的构造器,兼容不同的Android版本。例如: ```java NotificationCompat.Builder builder = new NotificationCompat.Builder...
在LabVIEW中,你可以从函数选板的“编程”类别中找到“创建通知器”函数,这将创建一个唯一的通知器句柄。接着,你可以用“发布”(Post)函数向通知器发送数据或状态,而“订阅”(Subscribe)函数则用于注册接收...
使用`@Aspect`注解创建切面,然后在切面内定义`@Before`、`@After`、`@Around`等通知。 6. **Spring的事务管理**: - DWR调用的方法如果涉及到数据库操作,可以通过Spring的`@Transactional`注解来实现事务控制。 ...
接下来,我们可以使用`@Around`注解创建环绕通知,以控制方法的执行流程,包括内部方法: ```java @Around("myServiceMethods()") public Object profileService(ProceedingJoinPoint pjp) throws Throwable { long...