spring


一、什么是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实现了它

  1. AOP是什么呢? AOP:就是对方法做了一个无侵入性的增强
  2. 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();)之后的通知内容,至此,环绕通知才算走完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值