Spring之注解实现aop(面向切面编程)

1:Aop(aspect object programming)面向切面编程,名词解释:
1.1:功能:让关注点代码与业务逻辑代码分离
1.2:关注点
重复代码就叫做关注点
1.3:切面
关注点形成的类,就叫做切面(类)
面向切面编程,就是指对很多功能都有的重复代码抽取,再在运行的时候往业务方法上动态植入"切面类代码";
1.4:切入点
执行目标对象方法,动态植入切面代码
可以通过切入点表达式,指定拦截那些类的那些方法,给指定的类在运行的时候植入切面类代码;
2:注解方式实现aop编程
2.1:开发步骤
(1):先引入aop相关的jar文件
spring-aop-3.2.5.RELEASE.jar【去spring3.2源码里面找】
aopalliance.jar【去spring2.5源码/lib/aopalliance文件里面找】
aspectjweaver.jar【去spring2.5源码/lib/aspectj文件里面找】或者【aspectj-1.8.2/lib/aspectjweaver.jar】
aspectjrt.jar【去spring2.5源码/lib/aspectj文件里面找】或者【aspectj-1.8.2/lib/aspectjrt.jar】

《注意:用到的spring2.5版本的jar本舰,如果用jd1.7版本可能会出现问题,
需要升级以下aspectj组件,即使用aspectj-1.8.2版本中提供的jar文件aspectjweaver.jar和aspectjrt.jar》
(2)bean.xml中引入aop名称空间
      技巧:找到文件spring-framework-3.2.5.RELEASE/docs/spring-framework-reference/htmlsingle
         打开index.html搜索xmlns:aop然后找到下面红色三句话,分别拷贝到bean.xml中
         <?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

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">

拷贝之后的bean.xml如下所示:
      <?xml version="1.0" encoding="UTF-8"?>

(3):bean.xml中开启aop注解扫描,如下配置所示:

<?xml version="1.0" encoding="UTF-8"?>

  <!-- 开启注解扫描 -->
  <context:component-scan base-package="com.bie.aop"></context:component-scan>   
    
  <!-- 开启aop注解方式,默认为false -->    
  <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

(4):开始写一个切面类,源码如下所示:

package com.bie.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**

  • @author BieHongLi

  • @version 创建时间:2017年3月28日 下午9:10:43

  • @Aspect:指定当前类为切面类
    */
    @Component //加入到IoC容器
    @Aspect //指定当前类为切面类
    public class Aop {

    //指定切入点表达式,拦截那些方法,即为那些类生成代理对象
    //@Pointcut(“execution(* com.bie.aop.UserDao.save(…))”) …代表所有参数
    //@Pointcut(“execution(* com.bie.aop.UserDao.())") 指定所有的方法
    //@Pointcut("execution(
    com.bie.aop.UserDao.save())”) 指定save方法

    @Pointcut(“execution(* com.bie.aop.UserDao.*(…))”)
    public void pointCut(){

    }

    @Before(“pointCut()”)
    public void begin(){
    System.out.println(“开启事务”);
    }

    @After(“pointCut()”)
    public void close(){
    System.out.println(“关闭事务”);
    }

}

(5):写好切面类就可以写执行目标对象方法,接口和实现类如下所示:

package com.bie.aop;

/**

  • @author BieHongLi
  • @version 创建时间:2017年3月28日 下午9:09:29

*/

public interface IUserDao {

public void save();

}

package com.bie.aop;

import org.springframework.stereotype.Component;

/**

  • @author BieHongLi

  • @version 创建时间:2017年3月28日 下午9:09:53

  • 目标对象
    */
    @Component
    public class UserDao implements IUserDao{

    @Override
    public void save() {
    System.out.println("…核心业务–核心业务…");
    }

}

(6):最后就可以进行进行测试了,源码如下所示:

package com.bie.aop;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**

  • @author BieHongLi
  • @version 创建时间:2017年3月28日 下午9:13:18

*/
public class AopTest {

ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

//目标对象有实现接口,spring会自动选择"jdk代理【动态代理】"
//动态代理的标识:class com.sun.proxy.$Proxy10
@Test
public void test01(){
    IUserDao dao =  (IUserDao) ac.getBean("userDao");
    System.out.println(dao.getClass());
    dao.save();
}


//class com.bie.aop.OrderDao$$EnhancerByCGLIB$$4952a60a
//目标对象没有实现接口,spring会用"cglib代理哦"
@Test
public void testCglib(){
    OrderDao dao =  (OrderDao) ac.getBean("orderDao");
    System.out.println(dao.getClass());
    dao.save();
}

}

3:心得体会和报错解决:

3.1:虽然案例很简单很简单,但是我花了三四个小时,为什么呢!我用junit测试spring写的注解实现aop(面向切面编程)。

3.2:编辑环境:eclipse+tomcat8.0+jdk1.8,为什么说编辑环境呢,因为jdk1.8和spring好像有仇似的,开始我安装的jdk是1.8版本的,总之包很多很多错,主要的caused by:java.lang.IllegalArgumentException【看错误主要看caused by】

3.3:这个错是UserDao dao = (UserDao) ac.getBean(“userDao”);—》

IUserDao dao = (IUserDao) ac.getBean(“userDao”);

意思就是说必须使用接口来接受从IoC容器获取的,不能使用实现类接受,不然报的错够你喝一壶了

原创请看:https://www.cnblogs.com/biehongli/p/6640406.html格式更好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值