1、切面
事务、日志、安全性框架、权限等都是切面(就是类,事务有事务类,日志有日志类,权限有权限类)
2、通知
切面中的方法就是通知(类中针对目标方法所要插入的方法,即事务类中执行事务的方法,日志类中执行日志操作的方法)
3、目标类 (你想要侵入修改的方法所在的类,诸如我们想在查询存款时加入一些其他操作,存款管理类就是目标类)
4、切入点
只有符合切入点,才能让通知和目标方法结合在一起 (就是你想要加强的方法,就是查看工资的方法showSalary())
5、织入:
形成代理对象的方法的过程
此表达式的作用是用于指定切入点:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <bean id="salaryManager" class="cn.itcast.spring.aop.sh.aspects.SalaryManagerImpl"></bean> <bean id="logger" class="cn.itcast.spring.aop.sh.aspects.Logger"></bean> <bean id="security" class="cn.itcast.spring.aop.sh.aspects.Security"></bean> <bean id="privilege" class="cn.itcast.spring.aop.sh.aspects.Privilege"> <property name="access" value="afds"></property> </bean> <aop:config> <aop:pointcut expression="execution(* cn.itcast.spring.aop.sh.aspects.SalaryManagerImpl.*(..))" id="perform"/> <aop:aspect ref="logger"> <aop:before method="logging" pointcut-ref="perform"/> </aop:aspect> <aop:aspect ref="security"> <aop:before method="security" pointcut-ref="perform"/> </aop:aspect> <aop:aspect ref="privilege"> <aop:around method="isAccess" pointcut-ref="perform"/> </aop:aspect> </aop:config> </beans>
首先在配置文件中加入
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
1、当spring容器启动的时候,加载了spring的配置文件
2、为配置文件中所有的bean创建对象
3、spring容器会解析aop:config的配置
1、解析切入点表达式,用切入点表达式和纳入spring容器中的bean做匹配
如果匹配成功,则会为该bean创建代理对象,代理对象的方法=目标方法+通知
如果匹配不成功,不会创建代理对象
4、在客户端利用context.getBean获取对象时,如果该对象有代理对象则返回代理对象,如果无代理对象,则返回目标对象
说明:如果目标类没有实现接口,则spring容器会采用cglib的方式产生代理对象,如果实现了接口,会采用jdk的方式
原文:http://blog.csdn.net/kingherooo/article/details/39212799