一 IOC注解开发
使用配置文件属性注入时,用的是bean约束
使用注解属性注入时,需要引入context约束
用法
注释类
@Component
@Controller (web层)
@Service (service层)
@Repository (Dao层)
注释属性
普通属性 @Value("...")
对象属性 @Resource(name="...") 等价于下面
@Autowired 是按对象类别注入,我们习惯按Id属性注入,所以必须在下面加上
@Qualifier("...")
其他注解
生命周期相关
@PostConstruct 相当于init-method
@PreDestroy 相当于destroy-method
作用范围相关
@Scope("...")
singleton (默认)
prototype
request
session
globalsession
在XML配置文件中,配置组件扫描
base-package中表示的是哪些包下的类可以使用注解,并且可以使用通配符
注意:
只有当用注释替代在配置文件中注册类
当用注释替代在配置文件中属性注入时
属性注入方式
当有注入属性有set方法时,需要将注解写在set方法上,(亲测写在属性上也行...)
当没有set方法时,将注解写在属性上方
XML注入和注解注入的比较
XML (结构清晰,维护方便)
可以适用于任何场景
注解 (开发方便)
在有些情况下用不了,这个类是别人提供的,无法在类里添加注解
二 AOP (aspect oriented programming)
Spring底层的AOP实现原理
动态代理
JDK动态代理 只能对实现了接口的类产生动态代理
Cglib动态代理(第三方技术) 对没有接口的类,采用生成子类的方式,完成动态代理
Spring的AOP开发 (AspectJ 的XML方式)
相关术语
Joinpoint 连接点,可以被拦截(增强)的方法
Pointcut 切入点,被拦截(增强)的方法
Advice(方法层面的增强) 通知,增强 e.g.权限校验,日志记录等
Introduction(类层面的增强) 引介 加个属性,加个方法
Target 目标 被增强的对象
Weaving 织入 将Advice应用到Target的过程
Proxy 代理
Aspect 切面 多个通知和切入点的组合
Spring的Junit测试
在测试类前加上
@RunWith(SpringJunit4ClassRunner.class)
@ContextConfiguration("classpath:xxx.xxx.applicationContext.xml")
就可以使用注解注入的方式,传入对象了
AOP的XML开发
创建一个类,并在其中编写所要增强的方法
将这个类交给Spring
将要增强的对象交给Spring
通过对AOP配置完成对目标的代理
通知的类型
前置通知
通过在切面方法中加入参数 (JoinPoint joinPoint),可以获取到其对应的切入点在哪里(每种通知都可以)
后置通知
在配置中
并在切面方法中加入参数 (Object result),就可以拿到切点的返回值
环绕通知
在切面方法中加入参数 (ProceedingJoinPoint joinPoint)
环绕前方法
Object object = joinPoint.proceed(); //相当于执行切入点方法,有可能会有返回值
环绕后方法
return object;
异常抛出通知
在配置中
并在切面方法中加入参数 (Throwable ex)
这里的ex就记录的异常信息
最终通知
无论增强的切入点内有没有异常,切面方法都会执行,相当于finally里的代码
Spring切入点表达式的写法
基于execution函数
语法 [访问修饰符] 返回值 包名.类名.方法名(参数)
* 任意
.. 当前包及其子包
努力生活,自得其乐 —— 2019.03.24