Spring中的AOP(掌握)
一:AOP的相关术语
1. JoinPoint(连接点):表示需要增强的类所对应的方法
2. PoinfCut(切入点):表示需要对一些方法进行增强的定义(本质上就是那些连接点)
3. Advice(通知/增强):表示增强所需要的方法,就是需要扩展的方法,再拦截到JoinPoint需要做的事,通知类型分为:前置通知、后置、异常、最终、环绕
4. Proxy(代理):一个类被AOP织入增强后,就产生了一个结果代理类
5. Aspect(切面):是切入点和通知的结合
二:基于XML的AOP配置
- 依赖的jar包:略 spring的ioc和aop核心的炸包,都需要导入
- 配置bean.xml,spring的ioc
<bean id="accountService" class="com.ityouxin.service.impl.AccountServiceImpl">
<!--给AccountServiceImpl中定义的accountDao注入一个值,值是accountDao bean对象-->
<property name="accountDao" ref="accountDao" />
</bean>
<bean id="accountDao" class="com.ityouxin.dao.impl.AccountDaoImpl">
<!--在AccountDaoImpl类中调用runner的方法执行sql语句,操作数据库-->
<property name="runner" ref="runner" />
<property name="connectionUtils" ref="connectionUtils" />
</bean>
<bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
<!--runner里面需要一个数据源,因为runner要操作这个数据库-->
<constructor-arg name="ds" ref="dataSource"/>
</bean>
<!--配置获取连接的工具类-->
<bean id="connectionUtils" class="com.ityouxin.dbutils.ConnectionUtils" >
<!--把连接池注入给connectionUtils-->
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring01" />
<property name="user" value="root" />
<property name="password" value="root" />
</bean>
</beans>
-
抽取公共类,此类中定义了事务的管理器,其中包括开启,关闭,回滚,释放等通知方法,具体实现省略。。。。
这里要说一下环绕通知的方法,返回类型Object,传入一个ProceedingJoinPoint类型的
pjp参数,其中主要的方法pjp.proceed(args);其中参数args是通过pjp.getArgs();得到 -
配置公共类(通知类/切面类):
<bean id=“txManager” class=“com.ityouxin.dbutils.TransactionManager”>
<property name=“connectionUtils” ref=“connectionUtils”/>
</bean> -
配置AOP,使用aop:config
<aop:config>
<--!作用:用于声明开始 aop 的配置 -->
<aop:aspect id="txAdvice" ref="txManager">
属性:id:切面类的唯一标识
ref:引用切面的bean的id
<--!作用:用于声明aop 的切面的配置 -->
</aop:aspect>
<aop:pointcut>
作用:配置切入点表达式,用于指定对那些类中的那些方法进行增强
属性:expression:用于定义切入点表达式 id : 切入点唯一标识
<aop:pointcut expression="execution(* com.ityouxin.service.*.*(..))" id="pt1" />
切入点表达式说明:语法:execution([修饰符] 返回值类型 包名.类名.方法名(参数类型))
</aop:pointcut>
</aop:congig>
- 使用aop:xxx配置对应的通知类型
aop:before
作用:
用于配置前置通知,指定增强的方法再切入点方法执行之前执行
属性:
method:用于指定通知增强方法的名称
pointcut-ref:用于指定切入点表达式的应用
pointcut:用于指定切入点表达式
aop:after-returning
作用:后置通知
aop:after-throwing
异常通知
aop:after
最终通知
三:基于注解的配置
1. 于xml方式基本类似
2. dao的实现类:bean->@Repository , service->@Service 属性注入:@Autowired
3. 在xml配置文件中指定需要扫描的包:<**context:component-scan base-package="com.ityouxin"** />
4. 其他类(通知类):@Component(“txManager”)(切面类)@Aspect(“txManager”)
5. 增强的方法上使用注解: @Before(**"execution(\* com.ityouxin.service.impl.\*.\*(..))"**)。。。
6. 最后(重要):开启spring'对注解AOP的支持:<**aop:aspectj-autoproxy** />