IOC控制反转
(1)Bean标签常用属性
id属性:名称,根据值来获得配置对象。(不能包含特殊字符,下划线也不可以)
name属性:功能与id属性一样,但是可以包含特殊字符。(不常用)
class属性:创建对象所在类的全路径。
scope属性:Bean的作用范围。属性值主要singleton(单例)(默认)和prototype(多例)。(session,request)
(2)注入对象
< bean id = " " class = " " >
< property name = "类属性名称" ref = "注入对象名称"/>
< /bean >
(3)注入复杂类型
(1)数组
< bean id = " " class = " " >
< property name = " " >
< list >
< value > </value>
< value > </value>
< /list >
< /property >
< / bean >
(2)List(数组一样)
(3)Map
< map >
< entry key =" " value=" " />
< entry key =" " value=" " />
< /map >
(4)Properties
< props >
< prop key =" " /> </prop>
< prop key =" " /> </prop>
< /props >
AOP面向切面编程
AOP的术语:
Join point | 连接点 | 就是spring中允许使用通知的地方,基本上每个方法前后抛异常时都可以是连接点。 |
Advice | 通知 | 这是实际行动之前或之后执行的方法。需要完成的工作叫做通知,就是比如事务、日志等的实现逻辑。 |
Pointcut | 切点 | 其实就是筛选出的连接点,一个类中的所有方法都是连接点,但又不全需要,会筛选出某些作为连接点做为切点。如果说通知定义了切面的动作或者执行时机的话,切点则定义了执行的地点。 |
Aspect | 切面 | 通知和切点的结合,通知和切点共同定义了切面的全部内容,包括执行的时间、地点、执行的逻辑方法。 |
Introduction | 引入 | 在不改变一个现有类代码的情况下,为该类添加属性和方法,可以在无需修改现有类的前提下,让它们具有新的行为和状态。 |
Target object | 目标 | 被一个或者多个方面所通知的对象,这个对象永远是一个被代理对象。也称为被通知对象。 |
Weaving | 织入 | 把切面加入程序代码的过程。切面在指定的连接点被织入到目标对象中,在目标对象的生命周期里有多个点可以进行织入:
编译期:切面在目标类编译时被织入,这种方式需要特殊的编译器 类加载期:切面在目标类加载到JVM时被织入,这种方式需要特殊的类加载器,它可以在目标类被引入应用之前增强该目标类的字节码 运行期:切面在应用运行的某个时刻被织入,一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象,Spring AOP就是以这种方式织入切面的。 |
AOP通知类型:
Before | 前置通知 | 在一个方法执行之前,执行通知。 |
After | 后置通知 | 在一个方法执行之后,不考虑其结果,执行通知。 |
AfterReturning | 返回后通知 | 在一个方法执行之后,只有在方法成功完成时,才能执行通知。 |
Throws | 抛出异常后通知 | 在一个方法执行之后,只有在方法退出抛出异常时,才能执行通知。 |
Around | 环绕通知 | 在建议方法调用之前和之后,执行通知。 |
Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature)
@Pointcut("execution(* com.aop.*(..))") //Pointcut表示式
private void method(){} //Point签名
然后要使用所定义的Pointcut时,可以指定Pointcut签名
@After("method()")
这种使用方式等同于以下方式,直接定义execution表达式使用
@After("execution(* com.aop.*(..))")
切面示例:
@Component
@Aspect
public class Aspect {
@Pointcut("execution(* com.aop.*(..))")
public void method() {
}
@After("method()")
public void after(JoinPoint JoinPoint) {
try {
...
} catch (Exception e) {
e.printStackTrace();
}
}
}