Spring之AOP:我行之我见

本文详细介绍了面向切面编程(AOP)的概念及其在软件开发中的应用价值,通过实例展示了如何使用AOP技术在Java程序中实现不修改源代码情况下添加功能,如日志记录、权限验证等。

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。也叫面向方面:Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。为啥吗要用AOP通俗的解释就是:好比高速公路的收费站,我相信不会有傻逼的人为每个车都建个收费站,一个收费站就够了,别管你是神马车,没有牌照统统滚蛋。这就是AOP的功能。他不属是与这个公路本身的一部分,而是我加上的,专门对于那些无照驾驶的。

下面我们来看看AOP在普通Java程序的实现:

public class UserDaoImp implements UserDao {

	private User user;
	public UserDaoImp(){}
	public UserDaoImp(User user)
	{
		this.user=user;
	}
	public User getUser() {
		return user;
	}
	
	public void delete(User user) {
		System.out.println("delete....");

	}

	public void select(User user) {
		// TODO Auto-generated method stub
		System.out.println("select....");

	}

	public void update(User user) {
		// TODO Auto-generated method stub
		System.out.println("update....");

	}

}


public class AopInterceptor implements InvocationHandler{

	private Object targetObject;//目标对象
	public Object createObjectProxy(Object targetObject)//创建代理对象
	{
		this.targetObject=targetObject;
		//加载目标类,目标类实现的接口,切面类
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this);
	}
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// 环绕advice
		System.out.println("环绕advice.....");
		UserDaoImp userDaoImp=(UserDaoImp)this.targetObject;
		if(userDaoImp.getUser()!=null)
		{
			
			//返回目标类方法
			try
			{
				//前置advice
				System.out.println("前置advice.....");
				return method.invoke(targetObject, args);
				//后置advice
				
			}
			
			catch(Exception e)
			{
				//异常advice
				System.out.println("异常advice.....");
			}
			finally
			{
				//最终advice
				System.out.println("最终advice.....");
			}
			
		}
		return null;
	}

}



<think> 首先,用户的问题是:“讲解下:这是不加事务的注解吗?” 并提供了XML配置片段。我需要用中文回答。 用户的问题是关于XML配置中的事务注解,具体是问“这是不加事务的注解吗?” 但问题是中文的,所以回答也要用中文。 配置片段是: ```xml <aop:config> <aop:pointcut id="transationMethod" expression="(execution(* com.huawei..*Service.*(..)) and !@annotation(com.huawei.it.jalor5.core.annotation.NoJalorTransation))"/> <aop:advisor advice-ref="linkageOperLogAdvice" pointcut="@annotation(com.huawei.it.hr.hcm.epm.domain.common.logaop.LinkageOperLog)" /> <aop:advisor order="100" advice-ref="txAdvice" pointcut-ref="transationMethod"/> </aop:config> ``` 关键点是:用户问“这是不加事务的注解吗?” 这可能指的是`NoJalorTransation`注解。我需要解释这个配置。 分析配置: - `<aop:pointcut id="transationMethod" expression="..."/>`:定义切入点。 - expression:`(execution(* com.huawei..*Service.*(..)) and !@annotation(com.huawei.it.jalor5.core.annotation.NoJalorTransation))` - 意思是:匹配所有`com.huawei`包下的`*Service`类的任何方法,但排除那些带有`@NoJalorTransation`注解的方法。 - `<aop:advisor advice-ref="linkageOperLogAdvice" pointcut="@annotation(LinkageOperLog)"/>`:这似乎是添加一个通知(advice)用于日志记录或其他操作,基于`@LinkageOperLog`注解。 - `<aop:advisor order="100" advice-ref="txAdvice" pointcut-ref="transationMethod"/>`:这将事务通知(`txAdvice`)应用到上面定义的切入点`transationMethod`。所以,对于匹配`transationMethod`的方法,会应用事务。 现在,用户的问题是“这是不加事务的注解吗?” 我认为用户可能在问`@NoJalorTransation`是否是表示不加事务的注解。 从配置看: - 切入点`transationMethod`排除了带有`@NoJalorTransation`注解的方法。 - 然后,事务通知(`txAdvice`)被应用到`transationMethod`切入点。 - 因此,带有`@NoJalorTransation`注解的方法**不会**应用事务通知,因为它们被排除在切入点之外。 所以,是的,`@NoJalorTransation`注解是用于标记那些不应该应用事务的方法。 回答应该包括: - 解释配置的含义。 - 确认`@NoJalorTransation`是用于不加事务的注解。 - 用中文简洁地表达。 基于规则,回答后必须提出3-5个相关问题,以“§§相关问题§§”开头,并在同一行。 相关问题应该基于用户的问题和我的回答。可能的主题: 1. 关于`@NoJalorTransation`注解的更多细节。 2. 如何自定义事务行为。 3. AOP配置的替代方案。 4. 事务通知的实现。 5. 排除事务的其他方式。 确保3-5个问题。 最终回答结构: 1. 回答用户的问题。 2. 提供代码解释(如果需要)。 3. 以“§§相关问题§§”开头,后跟3-5个问题。 用户提供了XML片段,所以不需要写代码,但可以解释。 在回答中,解释配置。 </think> ### 讲解:关于事务注解的配置分析 您提供的XML配置片段是Spring AOP的配置,用于定义事务管理的行为。核心关注点是`@NoJalorTransation`注解是否表示“不加事务”。以下是关键解读: 1. **切入点定义(pointcut)**: - `<aop:pointcut id="transationMethod" expression="(execution(* com.huawei..*Service.*(..)) and !@annotation(com.huawei.it.jalor5.core.annotation.NoJalorTransation))"/>` - 该切入点匹配所有`com.huawei`包下`*Service`类的任意方法(`*Service.*(..)`),但**排除**了带有`@NoJalorTransation`注解的方法(`!@annotation(...)`)。 - 因此,带有`@NoJalorTransation`注解的方法不会被此切入点捕获。 2. **事务通知应用(advisor)**: - `<aop:advisor order="100" advice-ref="txAdvice" pointcut-ref="transationMethod"/>` - 这表示名为`txAdvice`的事务通知(通常对应Spring的事务管理器)会应用到`transationMethod`切入点匹配的方法上。 - 由于`transationMethod`**排除了**`@NoJalorTransation`注解的方法,这些方法将**不会应用事务通知**。 **结论**: - **是的,`@NoJalorTransation`注解是用于标记“不加事务”的方法**。它被显式排除在事务切入点之外,确保了带有此注解的方法不会启用事务管理。 - 其他部分(如`<aop:advisor advice-ref="linkageOperLogAdvice".../>`)是独立的日志通知,与事务无关,不影响事务行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值