Spring的AOP中相关术语的介绍
Spring的AOP开发:hello_world
A:(xml方式)
1.导入AOP开发所需的包
AOP联盟的jar包:com.springsource.org.aopalliance-1.0.0.jar
Spring提供的AOP的jar包:spring-aop-4.2.4.RELEASE.jar
AspectJ的jar包:com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
Spring整合AspectJ的jar包:spring-aspects-4.2.4.RELEASE.jar
maven配置:
<!-- https://mvnrepository.com/artifact/org.aspectj/com.springsource.org.aspectj.weaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>com.springsource.org.aspectj.weaver</artifactId>
<version>1.6.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
<scope>test</scope>
</dependency>
2.ProductDao接口:
public interface ProductDao {
/**
* 持久层:产品保存
*/
public void save();
}
ProductDaoImpl实现类:
public class ProductDaoImpl implements ProductDao {
@Override
public void save() {
System.out.println("持久层:产品保存...");
}
public int delete(){
System.out.println("持久层:产品删除...");
return 100;
}
@Override
public void update() {
System.out.println("持久层:产品更新");
}
@Override
public void find() {
System.out.println("持久层:查询");
int i = 10/0;
}
切面类:
public class MyAspectXml {
public void checkPrivilege(JoinPoint point){
System.out.println("权限校验..." + point);
}
public void afterReturn(Object result){
System.out.println("后置通知:" + result);
}
public Object around(ProceedingJoinPoint joinpoint){
System.out.println("环绕前执行");
Object obj = null;
try {
obj = joinpoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("环绕后执行");
return obj;
}
public void afterThrowing(Exception ex){
System.out.println("抛出异常通知:" + ex.getMessage());
}
public void after(){
System.out.println("最终通知");
}
}
配置:
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(* cn.icbc.dao.impl.ProductDaoImpl.save(..))" id="pointcut1"/>
<aop:pointcut expression="execution(* cn.icbc.dao.impl.ProductDaoImpl.delete(..))" id="pointcut2"/>
<aop:pointcut expression="execution(* cn.icbc.dao.impl.ProductDaoImpl.update(..))" id="pointcut3"/>
<aop:pointcut expression="execution(* cn.icbc.dao.impl.ProductDaoImpl.find(..))" id="pointcut4"/>
<!-- 配置切面 -->
<aop:aspect ref="myAspectXml">
<!-- 前置通知 -->
<aop:before method="checkPrivilege" pointcut-ref="pointcut1"/>
<!-- 后置通知 -->
<aop:after-returning method="afterReturn" pointcut-ref="pointcut2" returning="result"/>
<!-- 环绕通知 -->
<aop:around method="around" pointcut-ref="pointcut3"/>
<!-- 抛出异常通知 -->
<aop:after-throwing method="afterThrowing" pointcut-ref="pointcut4" throwing="ex"/>
</aop:aspect>
</aop:config>
B:注解形式的AOP : hello_world
1.引入jar包
2.创建核心配置文件
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="cn.itcast"></context:component-scan>
<!-- 开启自动代理注解 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
3.创建接口
package com.icbc.spring.study3_2;
public interface ProductDao {
/**
* 持久层:产品保存
*/
public void save();
public int delete();
public void update();
public void find();
}
-
实现类
package com.icbc.spring.study3_2;
import org.springframework.stereotype.Repository; @Repository("ProductDao") public class ProductDaoImpl implements ProductDao { @Override public void save() { System.out.println("持久层:产品保存..."); } public int delete(){ System.out.println("持久层:产品删除..."); return 100; } @Override public void update() { System.out.println("持久层:产品更新"); } @Override public void find() { System.out.println("持久层:查询"); }}
5 .编写切面类
package com.icbc.spring.study3_2;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component("MyAspect")
@Aspect
public class MyAspect {
@Before("execution(* com.icbc.spring.study3_2.ProductDaoImpl.save(..))")
public void checkPrivilege(JoinPoint joinPoint){
System.out.println("权限校验..." + joinPoint.toString());
}
@AfterReturning(value="execution(* com.icbc.spring.study3_2.ProductDaoImpl.delete(..))",returning="result")
public void afterReturning(Object result){
System.out.println("后置通知:" + result);
}
@Around("execution(* com.icbc.spring.study3_2.ProductDaoImpl.update(..))")
public Object after(ProceedingJoinPoint joinpoint) throws Throwable{
System.out.println("环绕通知前增强");
Object obj = joinpoint.proceed();
System.out.println("环绕通知后增强");
return obj;
}}
6.测试:
package com.icbc.spring.study3_2;
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;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestAOP {
@Autowired
private ProductDao productDao;
@Test
public void test1(){
// productDao.save();
// productDao.afterReturning();
// productDao.delete();
productDao.update();
}
}
c.3.注解形式的AOP入门
1.注意applicaton.xml的配置是否引入正确。(ps 修改很久才解决错误)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.icbc.study"></context:component-scan>
<!-- 启动@aspectj的自动代理支持-->
<aop:aspectj-autoproxy />
</beans>
2.接口
public interface ProductDao {
public void save();
public int delete();
public void update();
public void find();
}
3.实现类
@Repository("productDao")
public class ProductDaoImpl implements ProductDao {
@Override
public void save() {
System.out.println("持久层:产品保存...");
}
public int delete(){
System.out.println("持久层:产品删除...");
return 100;
}
@Override
public void update() {
System.out.println("持久层:产品更新");
}
@Override
public void find() {
int i=1/0;
System.out.println("持久层:查询");
}
}
3.切面类
@Component("myAspectXml")
@Aspect
public class MyAspectXml {
@Before("execution(* com.icbc.study.dao.impl.ProductDaoImpl.save(..))")
public void checkPrivilege(){
System.out.println("权限校验...");
}
@AfterReturning(value="execution(* com.icbc.study.dao.impl.ProductDaoImpl.delete(..))",returning="result")
public void afterReturning(Object result){
System.out.println("后置通知:" + result);
}
@Around("execution(* com.icbc.study.dao.impl.ProductDaoImpl.update(..))")
public Object after(ProceedingJoinPoint joinpoint) throws Throwable{
System.out.println("环绕通知前增强");
Object obj = joinpoint.proceed();
System.out.println("环绕通知后增强");
return obj;
}
@AfterThrowing(value="execution(* com.icbc.study.dao.impl.ProductDaoImpl.find(..))",throwing="ex")
public void afterThrowing(Exception ex){
System.out.println("抛出异常通知");
}
@After("execution(* com.icbc.study.dao.impl.ProductDaoImpl.find(..))")
public void after(){
System.out.println("最终通知");
}
4.测试即可