Spring笔记(五)--注解方式实现AOP

包:aspectjrt.jar、aspectjweaver.jar

AOP:面向切面的编程

1.XML配置;

2.注解。

一、注解方式:

打开注解处理器:

<aop:aspectj-autoproxy/>

接口:
1 package com.dwr.spring.proxy;
2
3 public interface UserManager {
4     public void addUser(String username,String password);
5     public void deleteUser(int userid);
6     public void modifyUser(int userid,String username,String password);
7     public void findUser(int userid);
8 }

实现类:

 1 package com.dwr.spring.proxy;
 2
 3 public class UserManagerImpl implements UserManager {
 4     @Override
 5     public void addUser(String username, String password) {
 6         System.out.println("--------UserManagerImpl.addUser()----------");
 7     }
 8
 9     @Override
10     public void deleteUser(int userid) {
11         System.out.println("--------UserManagerImpl.deleteUser()----------");
12     }
13
14     @Override
15     public void modifyUser(int userid, String username, String password) {
16         System.out.println("--------UserManagerImpl.modifyUser()----------");
17     }
18
19     @Override
20     public void findUser(int userid) {
21         System.out.println("--------UserManagerImpl.findUser()----------");
22     }
23 }

切面类:使用@Aspect来标识

在切面类中定义切入点(定义要拦截的方法)

@Pointcut("execution(* com.dwr.spring..*.*(..))")

execution:代表执行;

第一个*:返回值类型;

com.dwr.spring:包名;

..:对子包也拦截

第二个*:代表所有类;

第三个*:代表所有方法。

最后的..:代表方法的参数可有可无。

定义切面类:注意注解的写法,通知。注意切入点的名称包括括号

 1 package com.dwr.spring.test;
 2
 3 import org.aspectj.lang.ProceedingJoinPoint;
 4 import org.aspectj.lang.annotation.*;
 5
 6 @Aspect
 7 public class Interceptor {
 8
 9     //定义切入点:对UserManagerImpl类的所有方法进行拦截
10     @Pointcut("execution(* com.dwr.spring.proxy.UserManagerImpl.*(..))")
11     private void anyMethod(){   //切入点的名称:anyMethod()
12
13     }
14
15     @Before("anyMethod()")
16     public void doBefore(){
17         System.out.println("执行前通知");
18     }
19
20     @AfterReturning("anyMethod()")
21     public void doAfterReturning(){
22         System.out.println("执行后通知");
23     }
24
25     @After("anyMethod()")
26     public void doAfter(){
27         System.out.println("执行最终通知");
28     }
29     @AfterThrowing("anyMethod()")
30     public void afterThrowing(){
31         System.out.println("意外通知");
32     }
33
34     @Around("anyMethod()")
35     public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
36         System.out.println("进入环绕判断方法");
37         Object result = proceedingJoinPoint.proceed();
38         System.out.println("退出环绕判断方法");
39         return result;
40     }
41 }

配置xml文件:打开注解处理器、配置bean

1     <aop:aspectj-autoproxy/>
2
3     <bean id="userManagerImpl" class="com.dwr.spring.proxy.UserManagerImpl"></bean>
4     <bean id="interceptor" class="com.dwr.spring.test.Interceptor"></bean>

测试:

 1 package com.dwr.spring.test;
 2
 3 import com.dwr.spring.proxy.UserManager;
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6
 7 public class TestInterceptor {
 8
 9     public static void main(String[] args){
10
11         ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
12         UserManager userManager = (UserManager) context.getBean("userManagerImpl");
13         userManager.addUser("Jack","123456");
14     }
15 }

结果:

进入环绕判断方法
执行前通知
--------UserManagerImpl.addUser()----------
退出环绕判断方法
执行最终通知
执行后通知

二、配置文件方式:

类:

 1 package com.dwr.spring.test;
 2
 3 import org.aspectj.lang.ProceedingJoinPoint;
 4
 5 public class NewInterceptor {
 6     public void doBefore(){
 7         System.out.println("执行前通知");
 8     }
 9     public void doAfterReturning(){
10         System.out.println("执行后通知");
11     }
12     public void doAfter(){
13         System.out.println("执行最终通知");
14     }
15     public void afterThrowing(){
16         System.out.println("意外通知");
17     }
18     public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
19         System.out.println("进入环绕判断方法");
20         Object result = proceedingJoinPoint.proceed();
21         System.out.println("退出环绕判断方法");
22         return result;
23     }
24 }

xml文件的配置:

 1 <bean id="userManagerImpl" class="com.dwr.spring.proxy.UserManagerImpl"></bean>
 2     <bean id="aspectbean" class="com.dwr.spring.test.NewInterceptor"></bean>
 3     <aop:config>
 4        <aop:aspect id="aspect" ref="aspectbean">
 5            <aop:pointcut id="cut" expression="execution(* com.dwr.spring.proxy.UserManagerImpl.*(..))"/>
 6            <aop:before method="doBefore" pointcut-ref="cut"/>
 7            <aop:after-returning method="doAfterReturning" pointcut-ref="cut"/>
 8            <aop:after method="doAfter" pointcut-ref="cut"/>
 9            <aop:after-throwing method="afterThrowing" pointcut-ref="cut"/>
10            <aop:around method="doAround" pointcut-ref="cut"/>
11        </aop:aspect>
12      </aop:config>

测试代码与上面相同:

结果:

执行前通知
进入环绕判断方法
--------UserManagerImpl.addUser()----------
退出环绕判断方法
执行最终通知
执行后通知

时间: 2024-11-05 14:57:19

Spring笔记(五)--注解方式实现AOP的相关文章

使用Spring的注解方式实现AOP的细节

前面我们已经入门使用Spring的注解方式实现AOP了,现在我们再来学习使用Spring的注解方式实现AOP的一些细节.本文是建立在使用Spring的注解方式实现AOP入门的案例的基础之上的. 本文是来讲解使用Spring的注解方式实现AOP的一些细节,其实说白了就是学习如何使用各种通知而已,例如前置通知.后置通知.异常通知.最终通知.环绕通知等,之前我们已经学习了前置通知,现在就来学习剩余的通知. 我们先来看后置通知,此时须将MyInterceptor类的代码修改为: /** * 切面 * @

使用Spring的注解方式实现AOP入门

首先在Eclipse中新建一个普通的Java Project,名称为springAOP.为了使用Spring的注解方式进行面向切面编程,需要在springAOP项目中加入与AOP相关的jar包,spring aop需要额外的jar包有: com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar spring-aop-4.2.5.RELEASE.jar sprin

跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Respository:标识持久层组件 3.@Service:标识业务层组件 4.@Controller:标识表现层组件 Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称 当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件

springmvc3.2+spring+hibernate4全注解方式整合(一)

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.

使用注解方式实现 AOP和IoC

使用注解方式实现AOP和IoC IOC和DI的注解 IOC: @Component:实现Bean组件的定义 @Repository:用于标注DAO类,功能与@Component作用相当 @Service:用于标注业务类 @Controller:用于标注控制器 DI: @Resource(name="userService") 默认ByName方式,如果name确实默认按照ByType方式注入 @Autowired 默认ByType方式,如果出现同名类,则不能按照Type进行注入 需要使

一个简单的Spring定时器例子 注解方式

首先在applicationContext.xml中增加 文件头中增加一条 xmlns:task="http://www.springframework.org/schema/task"xsi:schemaLocation 中增加一条 http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd <beans xmlns:task=&quo

springmvc3.2+spring+hibernate4全注解方式整合(四)

以上是工程文件,下面开始测试 package test.testservice; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.t

springmvc3.2+spring+hibernate4全注解方式整合(三)

service接口 package com.fangjian.core.platform.service; import com.fangjian.core.platform.po.User; public interface UserService { void saveUser(User user); } service实现 package com.fangjian.core.platform.service.impl; import org.springframework.beans.fa

springmvc3.2+spring+hibernate4全注解方式整合(二)

jdbc.properties #hibernate settings hibernate.show_sql=true hibernate.format_sql=true hibernate.cache.use_query_cache=true hibernate.cache.provider_class=net.sf.ehcache.hibernate.SingletonEhCacheProvider #mysql version database setting jdbc.driver=co