SpringIOC(控制反转)
在没有IOC之前
对象A依赖对象B,我们需要自己手动创建B对象,控制权在我们手中
引入IOC
我们将控制权交给IOC容器,在需要用到B对象时,IOC会主动创建一个对象B注入到对象A所需要的地方
依赖注入3种方法
就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中
- Setter注入,前提是注入参数要有对应的set方法
- 构造函数注入,多个参数的构造器在xml配置时参数顺序不重要,spring自动识别
- 自动装配与注解注入
Spring的自动装配有三种模式:byTpye(根据类型),byName(根据名称)、constructor(根据构造函数)
基于@Autowired的注解注入默认采用byTpye模式,如果需要按名称(byName)匹配的话,可以使用@Qualifier注解与@Autowired结合,使用注解时必须启动注解驱动<context:annotation-config />
优点
- 可复用性好
- 不用自己组装,拿来就用。
- 享受单例的好处,效率高,不浪费空间。
- 系统的可扩展与代码的易维护
SpringAop
重要术语
- Aspect(切面)
advice(增强)
@after
@before
@Around
@AfterReturning
@AfterThrowing
连接点(join point)
程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理
常用方法:
- Signature getSignature(); 获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
- Object[] getArgs(); 获取传入目标方法的参数对象
- Object getTarget(); 获取被代理的对象
- Object getThis(); 获取代理对象
切点(point cut)
- `@Pointcut("execution(* com.ssm.controller..*.*(..))")` execution是切点标志符,第一个*表示所有类型的返回,`..*`表示controller包下所有类,`.*`表示所有的方法,`(..)`表示任意参数 - `execution(public int com.xys.service.*(String name, ..))` 匹配指定包中的所有 public 方法, 并且第一个参数是 String, 返回值是 int 类型的方法
AOP proxy
Spring AOP 默认使用标准的 JDK 动态代理,设置
proxyTargetClass = true
则使用CGLIB 代理- 织入(Weaving)
拦截器
自定义拦截器需要实现HandlerInterceptor
接口
1 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { |