Spring的AOP开发

小编 2026-07-09 阅读:1952 评论:0
1 AspectJ的XML的方式 1.1创建web项目,引入jar包 除了基本包外(https://blog.csdn.net/W2612888/article/details/85217984),还需...

1 AspectJ的XML的方式

1.1创建web项目,引入jar包

除了基本包外(https://blog.csdn.net/W2612888/article/details/85217984),还需要引入下面的包:

  • com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar:AspectJ的包
  • 弹簧方面,4.2.4.RELEASE.jar:春季和AspectJ的整合的包
  • 弹簧AOP-4.2.4.RELEASE.jar:春天的AOP的包
  • com.springsource.org.aopalliance-1.0.0.jar:AOP联盟包

1.2创建Spring的配置文件并引入aop约束

XSD-configuration.xml文件中找到AOP的约束,并引入applicationContext.xml中

1.3配置编写接口和实现类

  • 接口
package com.itykd.dao;

public interface UserDao {
	void save();
	void update();
	void find();
	void delete();
}
  • 实现类
package com.itykd.dao.impl;

import com.itykd.dao.UserDao;

public class UserDaoImpl implements UserDao {

	@Override
	public void save() {
		System.out.println(\"UserDaoImpl的save方法执行了.....\");
		
	}

	@Override
	public void update() {
		System.out.println(\"UserDaoImpl的update方法执行了.....\");
		
	}

	@Override
	public void find() {
		System.out.println(\"UserDaoImpl的find方法执行了.....\");
		
	}

	@Override
	public void delete() {
		System.out.println(\"UserDaoImpl的delete方法执行了.....\");
		
	}

}
  • 目标类的配置 
<bean id=\"userDao\" class=\"com.itykd.dao.impl.UserDaoImpl\" />

1.4编写一个切面类并交给Spring管理

  • 编写切面
package com.itykd.aspect;

public class MyAspectXML {
	
	public void checkPri() {
		System.out.println(\"权限校验.......\");
	}
}
  • 将切面交给春
<bean id=\"myAspect\" class=\"com.itykd.aspect.MyAspectXML\"/>

1.5通过AOP配置实现增强(这里以前置通知为例)

	<!-- 通过AOP的配置完成对目标产生代理 -->
	<aop:config>
	    <!-- 表达式配置哪些类型的方法需要增强 -->
	    <aop:pointcut expression=\"execution(* com.itykd.dao.impl.UserDaoImpl.save(..))\" id=\"pointcut1\"/>	    
	    <!-- 配置切面 -->
	    <aop:aspect ref=\"myAspect\">
	        <aop:before method=\"checkPri\" pointcut-ref=\"pointcut1\"/>	    
	    </aop:aspect>	
	</aop:config>

1.5编写测试类 

Spring能够整合Junit测试,但是需要引入spring-test-4.2.4.RELEASE.jar

package com.itykd.spring;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.itykd.dao.UserDao;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(\"classpath:applicationContext.xml\")
public class SpringAopDemo {

	@Resource(name=\"userDao\")
	private UserDao userDao;
	@Test
	public void demo() {
		userDao.save();
		userDao.find();
		userDao.update();
		userDao.delete();
	}
}

Spring的其他通知和切入表达式的写法见:https://blog.csdn.net/W2612888/article/details/85229101 

2 基于AspectJ的注解的AOP开发

2.1 创建项目,引入jar包

  • 引入跟上述xml方式开发的jar包

2.2 引入配置文件

  • 引入applicationContext.xml文件

2.3 编写并配置配置目标类

  • spring的aop底层采用了JDK动态代理和cglib,上述xml方式的增强采用了接口,因此Spring的底层会选择JDK的动态代理作为实现;这里选择另一种实现方法:cglib
  • 目标类
package com.itykd.dao;

public class OrderDao {
	public void save() {
		System.out.println(\"保存订单....\");
	}
	public void update() {
		System.out.println(\"修改订单....\");
	}
	public void find() {
		System.out.println(\"查询订单....\");
	}
	public void delete() {
		System.out.println(\"删除订单....\");
	}
}
  • 配置目标类
<bean id=\"orderDao\" class=\"com.itykd.dao.OrderDao\"/>

2.4 编写切面类并配置

  • 这里还是以前置通知为例

  • 编写切面类

package com.itykd.aspect;

public class MyAspect {
	
	public void before() {
		System.out.println(\"前置增强===\");
	}
}
  • 配置切面类
<bean id=\"myAspect\" class=\"com.itykd.aspect.MyAspect\"/>

2.5 使用注解的AOP对目标类进行增强

  • 配置文件中打开注解的aop开发
	<!-- 在配置文件中开启注解的AOP的开发 -->
	<aop:aspectj-autoproxy />
  • 这里以为OrderDao的save方法提供前置增强为例:在切面类上使用注解@Aspect,在方法前加入前置增强的注解@Before
package com.itykd.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class MyAspect {
	@Before(value=\"execution(* com.itykd.dao.OrderDao.save(..))\")
	public void before() {
		System.out.println(\"前置增强===\");
	}
}

2.6 编写测试类

spring整合Junit测试

package com.itykd.spring.aop;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.itykd.dao.OrderDao;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(\"classpath:applicationContext.xml\")
public class SpringAOPDemo {
		
	@Resource(name=\"orderDao\")
	private OrderDao orderDao;
	@Test
	public void aopAnnotationDemo() {
		orderDao.save();
		orderDao.delete();
		orderDao.update();
		orderDao.find();
	}
}

注解的通知类型和aop的切入点的配置见:https://blog.csdn.net/W2612888/article/details/85229101

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表