spring aop注解与xml配置两种方式

spring aop切面两种使用方式:
1.使用xml配置文件的方式,个人感觉代码比较清晰,能够体现出明显的层次感

xml文件配置的方式开启aop

我创建的是普通java工程,用到的相关的jar包 和测试相关类:包可以创建maven配置依赖后下载下来自己归类使用
在这里插入图片描述
目的就是在指定切点运行指定切面,xml相关配置:
需要注意的是:切面的ref与bean的name属性一致
切点的expression写法比较多,可专门查询下写

 <bean name="aop" class="springaop.Aop"></bean> 
<bean name="springcut" class="springaopcut.SpringCut"></bean>
  //以上部分为spring容器创建后管理的bean
  //以下为开启aop的相关配置
  <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<aop:config>
	<aop:aspect ref="springcut">
		<aop:pointcut expression="execution(* springaop.*.*(..))" id="fir"/>
		<aop:before method="cu" pointcut-ref="fir"/>
	</aop:aspect>
</aop:config>

junit 测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:springs.xml")
public class Te {
	@Autowired
	private Aop ao;
	@Test
	public void t(){
		ao.ao();
	}
}
比较费解classpath:的相关内容有待了解

注解的配置方式

注解方式放弃了.xml文件,context加载采用了实体类的方式
@Configuration
@ConmpnentScan注解应用于实体类上,创建容器时使用

@Configuration
@ComponentScan(basePackages="com.neuedu.spring")
public class AppConfig 
{
	
}

接下来创建组件类,通过容器类扫描@Conponent

@Component
public class PayManager 
{
	public void wechatpay() throws InterruptedException{
		System.out.println("pay 1$");
		Thread.sleep(new Random().nextInt(1000));
	}
	
}

然后是定义切面类
这是配置的重灾区,相比较还是觉得.xml文件清晰一些

@Aspect
@Component
@EnableAspectJAutoProxy//开启切面自动代理
public class LogAspect
{
	private static final String pointcut="execution(* com.neuedu.spring.aoe.*.*(..))";
	@Before("execution(* com.neuedu.spring.aoe.*.*(..))")//定义切点  第一*表示返回值类型为所有类型
	public void before()									//第二个*表示该包下所有类第三个表示所有方法最后括号表示方法参数
	{
		System.out.println("方法在"+new Date()+"被调用");
	}
	//@After("execution(* com.neuedu.spring.aoe.*.*(..))")
	public void after()
	{
		System.out.println("方法在"+new Date()+"被调用结束");
	}
	//@Around(pointcut)
	public void around(ProceedingJoinPoint jp) throws Throwable //连接点被切入的方法
	{
		long start=System.currentTimeMillis();
		jp.proceed();//方法执行
		long end=System.currentTimeMillis();
		System.out.println("耗时"+(end-start)+"毫秒");
	}
	//@AfterThrowing(pointcut)
	public void exception(Exception ex)
	{
		System.out.println("出事了,赶紧看看"+ex.getMessage());
	}
	//@AfterReturning(pointcut)//after执行过程忽略异常执行到底,affterRunning 遇到异常停止执行
	public void affterreturnning(){
		System.out.println("返回通知");
	}
}

最后是测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=AppConfig.class)
public class SpringAopTest 
{
	@Autowired
	private OrderManager om;
	@Autowired
	private PayManager pm;
	@Test
	public void test() throws InterruptedException{
		om.create();
		
		pm.wechatpay();
	}
	
}

开启component-scan后还可以这么写

前半部分利用容器扫描创建bean对象,感觉这样比较简单.采用的@compoent(“pojo名字/可省略默认名字为类名小写”),后半部分对于aop的管理采用xml配置的方式.

 <context:component-scan base-package="spring"></context:component-scan>
 
<!--  <bean name="aop" class="springaop.Aop"></bean> 
<bean name="springcut" class="springaopcut.SpringCut"></bean> -->
  
 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<aop:config>
	<aop:aspect ref="aop">
		<aop:pointcut expression="execution(* spring.SpringCut.*(..))" id="fir"/>
		<aop:before method="ao" pointcut-ref="fir"/>
	</aop:aspect>
</aop:config>  

下面是切面:

@Component("aop")
public class Aop {
	public void ao(){
		System.out.println("我是切面");
	}
}

下面是切点

@Component(value="cut")
public class SpringCut {
	public void cu(){
		System.out.println("我是切点");
	}
}

最后是测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:springs.xml")
public class Te {
	@Autowired
	private SpringCut sp;
	@Test
	public void t(){
		sp.cu();
	}
}

可能是由于框架版本迭代,并且有相互兼容的部分导致,写法比较多样,找的适合自己的才是关键;

猜你喜欢

转载自blog.csdn.net/weixin_43671743/article/details/88967718