在Spring中,Advice都是通过Interceptor来实现的,主要有以下几种:
1. 环绕Advice:
Object invoke(MethodInvocation invocation) throws Throwable;
}
public class DebugInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Before: invocation=[" + invocation + "]"); //(1)
Object rval = invocation.proceed();
System.out.println("Invocation returned"); //(2)
return rval;
}
}
环绕advice类似一个拦截器链,这个拦截器链的中心就是被拦截的方法。在程序(1)(2)我们可以加入我们自己的代码,以表示在方法执行前后我们需要干什么。invocation.proceed()方法运行指向连接点的拦截器链并返回proceed()的结果。
2. Before Advice
void before(Method m, Object[] args, Object target) throws Throwable;
}
一个更简单的通知类型是before 通知。它不需要 MethodInvocation对象,因为它只是在进入方法之前被调用。before advice的一个主要优点是它不需要调用proceed()方法,因此就不会发生 无意间运行拦截器链失败的情况。
3. After advice
void afterReturning(Object returnValue, Method m, Object[] args, Object target) throws Throwable;
}
一个After advice可以访问返回值(但不能进行修改),被调用方法,方法参数以及目标对象。
4.Throws Advice
public interface ThrowsAdvice extends Advice {
}
//所给对象必须实现一个或者多个针对特定类型的异常通知方法,格式如下
afterThrowing([Method], [args], [target], subclassOfThrowable)
//只有最后一个参数是必须的。因此异常通知方法对方法及参数的需求,方法的签名将从一到四个参数之间变化。
最后还有一个是introduction advice,这个我想什么时候自己单独做个例子理解一下。
做了个例子如下,想像一个用户登录场景:在登录之前,我们对其输入的用户名进行有效性检查;登录成功后,我们记上用户登录次数;如果登录失败,则进行异常处理。实现代码如下:
//登录的业务代码
public&nbs
Spring IoC容器不仅为你初始化对象,并且会为你关联那些互相协作的bean或者依赖,如果你想将一个生命周期为HTTP request的bean注入到另一bean中,你必须在这个bean中注入一个AOP代理,这个代理具有和这个bean相同的接口,当调用这些API的时候,实际会委托调用真实的对象。至于为什么要这么做,可以看下下面的例子。
css的背景图片是设计一个漂亮网页的关键之处
background-image
url("/blog_article/图片相对于样式表的路径/index.html")
注意:url是图片相对于样式表的路径,而非相对于当前网页的路径,路径可以加引号也可以不加引号
控制重复
background-repeat
no-repet repeat repeat-x repeat-y
控制位置
background-position
关键字 px em 百分比
其中关键字包括,水平方向上的关键字 left center right 垂直方向的关键字 top center bottom 如果一个关键字省略,默认为center。
em 是相对于字号,而百分比比较特殊,它的意思是将图片指定百分比处和相关元素对应的百分比对齐:
如果百分比值只有一个,那么另一个值默认为50%
注意:
1 px em作用的是图片的顶边和左边,不能作用于图片的右边和下边,px em 百分比之间可以混用,但是它们都不能和关键字混用。
2 px em适用于精确定位,但要使图片随元素的宽度变化而位置发生改变,百分比可以起到作用
3 这个属性常结合background-repeat使用,控制图片重复的起点
固定图片
background-attachment
fixed scroll
快捷方法
用background属性一次指定
本文链接