基于AspectJ实现AOP
来源:互联网 发布:两电一邮 知乎 编辑:程序博客网 时间:2024/06/08 18:00
package com.sw.spring.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target({ ElementType.METHOD })@Retention(RetentionPolicy.RUNTIME)public @interface Log { String value() default "";}
package com.sw.spring.dao;import com.sw.spring.annotation.Log;public interface IUserDao { @Log("添加了用户") //因为代理对象访问的是接口,注解要加在接口上而不是实现类 public void add(); void update(); void del(); void list();}
package com.sw.spring.dao;import org.springframework.stereotype.Repository;import com.sw.spring.annotation.Log;import com.sw.spring.log.Logger;@Repository("userDao")public class UserDao implements IUserDao{ public void add() { System.out.println("使用普通方式进行保存用户"); } public void update() { System.out.println("修改了用户"); } public void del() { System.out.println("删除用户"); } public void list() { System.out.println("显示用户列表"); }}
package com.sw.spring.log;import java.util.Date;import com.sun.org.apache.bcel.internal.generic.NEW;public class Logger { public static void log(String info){ System.out.println(new Date()+"---"+info); }}
package com.sw.spring.proxy;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.stereotype.Component;import com.sw.spring.log.Logger;@Component@Aspectpublic class LoggerProxy{ /** * 前置通知 * 第一个*代表 方法的修饰符 和返回值类型 * 第二个*service包下的任意类 * 第三个*service包下的任意类的方法 * (..)方法的参数 */ /*@Before("execution(* com.sw.spring.service.*.*(..))") public void beforeMethod(){ Logger.log("---在调用方法前执行"); }*/ /* * 如果只想一个方法或者两个方法加日志 可以直接写方法的名字 */ /*@Before("execution(* com.sw.spring.service.*.save(..)) ||" + "execution(* com.sw.spring.service.*.del(..))") public void beforeMethod(){ Logger.log("---在调用方法前执行"); }*/ /** * 后置通知 */ /*@After("execution(* com.sw.spring.service.*.*(..))") public void afterMethod(){ Logger.log("在方法调用后执行-----"); }*/ /** * 环绕通知 需要一个参数 * @throws Throwable */ /*@Around("execution(* com.sw.spring.service.*.*(..))") public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable{ Logger.log("环绕执行前"); pjp.proceed(); Logger.log("环绕执行后"); }*/ /** * 后置通知 测试异常 */ @After("execution(* com.sw.spring.service.*.*(..))") public void afterMethod(JoinPoint jp){ //获取执行的方法名 需要导aopalliance-1.0.jar包 System.out.println("正在执行的方法是"+jp.getSignature().getName()); Logger.log("在方法调用后执行-----"); } /** * 方法正常运行通过之后才会调用 */ /*@AfterReturning("execution(* com.sw.spring.service.*.*(..))") public void afterReturningMethod(){ Logger.log("方法正常执行后调用"); }*/ /** * 方法运行异常才会调用 */ /*@AfterThrowing("execution(* com.sw.spring.service.*.*(..))") public void afterThrowingMethod(){ Logger.log("方法运行异常才能看到我"); }*/}
package com.sw.spring.service;public interface IUserService { void save(); void update(); void del(); void list();}
package com.sw.spring.service;import javax.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Service;import com.sw.spring.dao.IUserDao;@Servicepublic class UserService implements IUserService{ //默认根据类型装配 但有两个实现类会报错,所以要指定bean的类型 通过@Qualifier //@Qualifier("userProxyDao") /*@Autowired() @Qualifier("loggerProxy") private IUserDao userDao; public void save(){ userDao.add(); } */ /** * 第二种方法 需要加@resource */ private IUserDao userDao; //@Resource(name="userjdbcDao") //@Resource(name="userProxyDao") @Resource(name="userDao") public void setUserDao(IUserDao userDao) { this.userDao = userDao; } public void save() { userDao.add(); } public void update() { userDao.update(); } public void del() { userDao.del(); } public void list() { userDao.list(); }}
<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- 扫描加入注解的包 --> <context:component-scan base-package="com.sw.spring"></context:component-scan> <!-- 开启spring aop支持 --> <aop:aspectj-autoproxy /></beans>
package com.sw.spring;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.sw.spring.service.IBookService;import com.sw.spring.service.IUserService;public class SpringTest { static ApplicationContext ac=null; static{ ac=new ClassPathXmlApplicationContext("spring.xml"); } @Test public void test(){ IUserService us = ac.getBean("userService", IUserService.class); us.save(); us.update(); us.del(); us.list(); }}
阅读全文
0 0
- 基于AspectJ实现AOP
- 基于@AspectJ的AOP
- 基于@AspectJ的AOP
- AOP的annotation实现方式是基于AspectJ的实现
- AOP-AspectJ-基于XML的实现——各种通知
- AspectJ如何实现AOP
- AspectJ AOP实现
- Spring @AspectJ 实现AOP
- AspectJ框架实现AOP
- Spring AOP的实现机制(三)---@AspectJ形式的Spring AOP和基于Schema的AOP
- 基于@AspectJ配置Spring AOP
- spring aop(四)--基于@AspectJ
- 基于aspectj的注解aop
- 基于aspectj的aop操作
- Spring AOP基于@AspectJ开发
- Spring-AOP:基于AspectJ注解的AOP
- Spring Aop(二)——基于Aspectj注解的Aop简单实现
- AOP注解实现(AspectJ)
- codeforces 835C Star sky(二维树状数组)
- extends,with关键字的区别
- Linux下的常用命令(三)-scp,lsof
- Codeforces 835C
- MySQL插入中文字符不成功问题解决
- 基于AspectJ实现AOP
- 设计模式之策略模式
- webpack性能优化
- 数据结构顺序表的“增删改查”功能实现
- 使用ssh正向连接、反向连接、做socks代理的方法
- HDU 1002 A + B Problem II
- JS中数组有关知识点
- proxychins+ssh使用socks5代理
- WebGL之旅(十七) 带纹理的立方体