因为xml配置aop太过繁琐,所以aopalliance 中出现了一种AspectJ技术。
基本流程:
1)通过注解配置切点
2)自动生产代理对象
怎么使用aspect技术
第1步:创建AppConfig.java
package com.jr.aspectJ;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration //标示为配置类 相当于xml文件//扫描指定包下包含@Component注解的类,将这个类加入spring bean工程@ComponentScan(value= {"com.jr.aspectJ","com.jr.dao.impl"})@EnableAspectJAutoProxy//启动aspectJ注解aoppublic class AppConfig {
}123456789101112
第2步:创建@Aspect 切面类
package com.jr.aspectJ;import java.util.Arrays;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;@Component@Aspect //aspect注解public class LogAspect {
//切点
@Pointcut("execution(public int com.jr.dao.impl.ScoreDaoImpl.abc(..))")
public void pointCut() {}
//环绕通知
@Around("pointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("1.鉴权");
//调用目标方法
Object result = joinPoint.proceed();
System.out.println("1.日志留痕");
return result;
}
//@Before在调用目标方法之前切入;切入点表达式(指定在哪个方法切入)
@Before("execution(public int com.jr.dao.impl.ScoreDaoImpl.minus(..) )")
public void logStart(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是:{"+Arrays.asList(args)+"}");
}}1234567891011121314151617181920212223242526272829303132
第3步:测试
package com.jr.proxy;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.test.context.junit4.SpringJUnit4ClassRunner;import com.jr.aspectJ.AppConfig;import com.jr.dao.impl.ScoreDaoImpl;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes=AppConfig.class)public class AspectTest {
@Autowired
ScoreDaoImpl scoreDao;
@Test
public void TestscoreDao() {
System.out.println(scoreDao.abc(3, 4));
System.out.println(scoreDao.minus(3, 4));
}}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)