Spring入门(4)

Pointcut:
实现之一:NameMatchMethodPointcut,根据方法名字进行匹配
成员变量:mappedNames,匹配的方法名集合
aop的api实现方式,不是基于xml配置的方式,通过java代码pointcut的实现方式

配置文件中< list>< /list>表明:当前这个property是一个集合,list里面可以写< value>
切入点环绕通知:
Interceptor(拦截器)
Interception around advice
.Srping 的切入点模型使得切入点可以独立于advice重用,以针对不同的advice可以使用相同的切入点

Before advice:
Throws advice:异常说明
After Returning advice:后置通知
Interception around advice:
实现这几个接口就相当于以前配置文件中指定增强位置 aop:after aop:before等等,实现接口后配置文件就不用指定增强位置 比如实现AfterReturingAdvice接口后,这个类中的方法就是一个后置增强

在传统AOP的实现中,需要在XML文档中手动引入ProxyFactoryBean.
通过getBean()方法获取该bean对应的id不是ProxyFactoryBean的实例本身,而是这个类的getObject()方法创建的对象.
getObject()方法将创建一个AOP代理的目标对象.
< aop:aspectj-autoproxy >< /aop:aspectj>标签中与ProxyFactoryBean中有proxyTargetClass属性,当该属性设置为true时,会强制使用CGLIB动态代理,默认为false.
如果ProxyFactoryBean的proxyInterfacs属性没有被设置,但是目标类实现了一个(或者更多)接口,那么ProxyFactoryBean将自动检测到这个目标类已经实现了至少一个接口,创建一个基于JDK的代理.

在Spring实现AOP的方式中,不需要引入ProxyBeanFactory类了,直接使用< aop:config>标签与注解来进行配置即可.

在Spring的AOP当中:
若目标实体类是没有实现接口的,那么这种情况下Spring会使用CGLIB来进行代理,当有实现某个接口,那么便会采用JDK动态代理.
也可以在< aop:aspectj-autoproxy proxy-target-class=”true”>标签中把proxy-target-class属性设置为true,来强制在任何情况下使用CGLIB的方式,即使目标类有实现某个接口.
CGLIB的代理对用户是透明的,需要注意的是:
-final方法不能被通知,因为它们不能被覆盖
-不用把CGLIB的jar包添加到classpath中,在Spring3.2中,CGLIB被重新包装并包含在Spring核心的JAR包中(即不用手动引入CGLIB包,通过CGLIB实现动态代理的代码实现,Spring都处理好了)
用*做通配符,匹配所有拦截器加入通知链,只会匹配拦截器(Interceptor ),beforeAdvice,afterReturningAdvice等不会匹配到,所以还得挨个加入通知链。
使用“auto-proxy”
.Spring也允许使用“自动代理”的bean定义,它可以自动代理选定的bean,这是建立在Spring的“bean post processor”功能基础上的(在加载bean的时候就可以修改)
.BeanNameAutoProxyCreator
使用“auto-proxy”.DefaultAdvisorAutoProxyCreator,当前IoC容器中自动应用,不用显示声明应用advisor的bean定义

@Aspect注解
Spring可以使用AspectJ来做切入点的解析
AOP的运行时仍旧是纯的Spring AOP,对AspectJ的编译器或者织入无依赖性.
使用AOP注解需要导入aspectjweaver.jar与AspectJ.jar包.
aspect
@Aspect注解是不能够通过类路径自动检测发现的,所以需要配合使用@Component注解或者在XML配置bean
一个类中AspectJ注解表示它为一个切面,并且将自己从自动代理中排除
p
ointcut
.一个切入点通过一个普通的方法定义来提供,并且切入点表达式使用@Pointcut注解,方法返回类型必须为void
.定义一个名为‘anyOldTransfer’,这个切入点将匹配任何名为“transfer”的方法执行

@Pointcut(“execution(* transfer(..))”)// the pointcut expression
private void anyOldTransfer() {}// the pointcut signature

组合pointcut
.切入点表达式可以通过&&、||和!进行组合,也可以通过名字引入切入点表达式
.通过组合,可以建立更加复杂的切入点表达式

@Pointcut(“execution(public * (..))”)
private void anyPublicOperation() {}
@Pointcut(“within(com.xyz.someapp.trading..)”)
private void inTrading() {}
@Pointcut(“anyPublicOperation() && inTrading()”)
private void tradingOperation() {}

1.Spring对AspectJ的支持
Spring中配置@AspectJ
.对@AspectJ支持可以使用XML或Java风格的配置
.确保AspectJ的aspectjweaver.jar库包含在应用程序(版本1.6.8或更高版本)的classpath中
@AspectJ的风格类似纯java注解的普通java类
Spring可以使用AspectJ来做切入点解析
AOP的运行时仍旧是纯的SpringAOP,对AspectJ的编译器或者织入无依赖性
2.对@AspectJ支持可以使用XML或Java风格的配置
@Configuration
@EnableAspectJAutoProxy
public class AppConfig{}
< aop:aspectj-autoproxy/>
3.@AspectJ切面使用@AspectJ注解配置,拥有@Aspect的任何bean将被Spring自动识别并应用。
用@AspectJ注解的类可以有方法和字段,他们也可能包括切入点(pointcut),通知(Advice)和引入(introduction)声明
4.@AspectJ注解是不能够通过类路径自动检测发现的,所以需要配合使用@Conponent注释或者在XML中配置bean
5.一个类中的@AspectJ注解标始它为一个切面,并且将自己从自动代理中排除
6.AspectJ是编译期的AOP,检查代码并匹配连接点与切入点的代价是昂贵的。
一个好的切入点应该包括以下;
①选择特定类型的连接点,如:execution,get,set,call,handler
②确定连接点范围,如:within,withincode
③匹配上下文信息,如;this.targe,@annotation

两种定义方式,一种是@Before(“execution”)
另一种,@Before(“pointcut()”)
通知
@Pointcut(“execution(* com.dream.aop...*(..))”)
1.@Before(“表示式、连接点方法名()”)
2.@AfterReturing 可以使用returing绑定返回值 Object
3.@AfterThrowing throwing同上
4.@After finally
5.@Around 第一个参数必须是ProceedingJoinPoint proceed(),proceed(Object[])
Around advice
.环绕通知使用@Around注解来声明,通知方法的第一个参数必须是ProceedingJoinPoint类型
.在通知内部调用ProceedingJoinPoint的procceed()方法会导致执行真正的方法,传入一个Object[]对象,数组中的值将被作为参数传递给方法

给advice传递参数
1.args()
(即在通知中获取符合切入点的方法中的参数)
2.自定义注解
(即在通知中获取符合切入点的方法被注解标注的值)
Advice参数名称
.通知和切入点注解有一个额外的“argNames”属性,它可以用来指定所注解的方法的参数名

Introductions
.例如:给定一个接口UsageTracking ,并且该接口拥有DefaultUsageTracked的实现,接下来的切面声明了所有的service接口的实现都实现了UsageTracked接口

OC即DI,不必调用者自己去new被调用对象,而是通过spring IOC容器把配置好的bean对象注入,可以通过设置注入即setter方法和构造器注入。bean装载可以通过xml配置设定,也可以同过设定扫描路径,然后通过注解来让容器识别到要装载的bean。aop面向切面编程,切面与业务是垂直的,不同业务往往都要做一些公共的类似的额外操作,在业务之前做,或在业务之后做,或在业务出了异常时做,或者在业务前后都要做,甚至这些要做的额外操作要用到业务本身的输入参数和业务完成的输出结果。比如业务一般都得记录日志,比如涉及数据更新的业务完成后都得伴随数据库操作,账户各种操作前都要验证用户权限,这些业务伴随的操作往往大致相似,如果每个业务都要写这些操作,特别繁琐,把这些操作提出来就成了切面,与业务分离。xml 和API方式都可以实现aop配置,pointcut是业务,aspect是切面,它俩怎么交互执行,怎么传参和调用结果,都可以通过xml和API方式实现。另外还有配置代理这一块比较蒙逼。最牛逼的是,之前看得傻了眼那么繁琐和复杂的xml,api方式用简单直观的aspectj方式竟然能等效实现,用的纯Java标签,在xml 里设一下自动代理。不过仅仅@Aspect容器不识别,要加上@Component 才识别

自我总结Spring框架:
1. IOC翻转控制 –>实现通过 IOC容器进行实例化代码
2. AOP切面编程 –>简化程序的耦合度,针对日志管理,事务管理,性能统计用处较大。
剩下就是实现他们固定的套路。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值