一、什么是Spring
Spring框架就是一栈式框架,在我们的三层架构(mapper层,service层,web层)中都有解决方案
- Spring是用来解决什么问题的呢?
spring是用来创建和管理对象的,起到解耦的作用,还可以整合其他的技术
二、IOC
IOC:控制反转,将创建对象的权利交给了Spring容器
IOC中常用的注解:
- @Component(组件) 表示将被注解修饰的类,自动生成对象,并将对象放入IOC容器中
- @Service (服务)用来标注是Service类,创建Service的对象,放入容器中
- @Repository(存储) 用来标注是Dao层类,创建对象并放入容器中,但我们一般是使用Mybatis 的@Mapper注解来标识该类是dao层的类
- @Controller(控制器) 用来标注是web层
其实@Component都是这个注解在起作用,为什么在定义出其他三个,就是为了规范,其他三个注解的底层都是被@Component注解的
三、DI
DI:依赖注入,就是给成员变量赋值
常见的DI赋值的方式:
- setter方法
- 构造器方法
在给不同的成员变量赋值的时候,使用的注解也是不同的
当要赋值的成员变量为简单类型的时候,使用
- @Value 注解(@Value (${key}))
- 我们一般使用value的场景是结合配置文件
当要赋值的成员变量为复杂类型的时候,使用
-
按照类型注入:
@AutoWried : -
按照名称注入
@Qualifier(name=“”)+@AutoWried:@Resource(name=“名称”) :按照名称注入,这个注解是javaEE提供的注解
-
如何将第三方bean放入容器
@Bean
bean实例的常见的三种方式:
1、静态工厂
2、动态实例工厂
3、构造方法
四、AOP
AOP:面向切面编程,AOP是一种思想,Spring实现了它
- AOP是什么呢? AOP:就是对方法做了一个无侵入性的增强
- AOP的基本概念
- 目标(目标类/对象) traget
- 代理(代理对象)proxy
- 连接点 (目标类中所有方法) joinpoint
- 切点 pointcut(就是你要增强的方法)
- 通知 advice(增强的内容)
- 切面 aspect(通知+切点 组合)
AOP编程的实现:
1、定义切面类:@Aspect+@Component
2、在切面类中定义切点:@PointCut
① 注解打在空的无返回值方法上
② 方法名称无所谓 (会被通知引用)
③切点表达式:
execution 切点表达式
([修饰符] 返回值 [限定名] 方法名称 参数列表 [异常] ( [ ] 可以省略不写))
通配符:* .
注解:
先自定义一个注解,元注解(
@Target(ElementType.METHOD) 注解可以放的位置
@Retention(RetentionPolicy.RUNTIME))注解的存活时间(源码、字节码、运行时期)
@Documented(可选,把注释打入jar包)
在切点的@Pointcut(“@annotation(自定义注解的全类名)”) 表示被注解的才是切点
2.1 自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAno {
}
3、定义通知
通知的类型:
- @Before 前置通知
- @Aafter 后置通知
- @Around 环绕通知 最常用
- @Afterthrowing
- @Afterreturning
3.1 Around 环绕通知获取参数
@Around(value = "pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {}
通过ProceedingJoinPoint 来获取切点方法的参数
Object[] args = pjp.getArgs();
执行切点
Object proceed = pjp.proceed();
环绕通知的执行流程:
被注解的切点,首先进入切面类的环绕通知方法中,执行切点方法
(Object proceed = pjp.proceed();)之前的通知,执行完之后,就会执行切点方法的内容,在执行完切点的内容之后还是会回到环绕通知中的,在继续执行
(Object proceed = pjp.proceed();)之后的通知内容,至此,环绕通知才算走完