Spring原理(IOC和AOP)

写在前面:相关学习代码放到了GitHub上,欢迎互相交流学习。

IOC:控制翻转,将对象的创建和对象之间的调用交给Spring管理

底层原理:xml解析,工厂模式,反射

IOC的过程:

 IOC容器:本质上是对象的工厂,加载配置文件,创建对象

IOC容器的实现有两种方式:(创建工厂的接口)

1.BeanFactory  

        是Spring内部使用的接口,不提供给开发人员使用,加载配置文件时不会创建对象

2.ApplicationContext

        是BeanFactory的子接口,比其更加强大,是开发人员使用的,一般都用这个接口。在加载配置文件的时候就创建对象了

        ApplicationContext的实现类

                FileSystemXmlApplicationContext("")需要写在磁盘上的路径

                ClassPathXmlApplicationContext("")需要写在src上的路径

IOC的具体操作

Bean管理 由Spring创建对象,Spring注入属性

a.基于xml创建对象和注入属性 b.基于注解方式创建对象和注入属性

a.xml方式创建对象:在xml文件中添加bean标签,介绍一下常用的bean标签的属性 id:获取对象唯一的标识,class:包+类的路径  创建对象时,默认执行无参构造方法

b.xml方式注入属性:DI是依赖注入的意思,是IOC的一种操作,是基于创建对象执行的。

第一种方式:创建对象+set注入

第二种方式:构造参数注入

第三种方式:p名称空间注入,简化基于xml的配置方式

集合属性注入

集合属性注入对象属性

把集合注入部分提取出来,方便一堆相同的对象注入相同的属性。

1.在Spring配置文件中引入命名空间util

2.使用util标签完成list集合注入提取

IOC bean管理  FactoryBean

IOC里面有两种bean 一种内置bean 一种FactoryBean

普通bean:在Spring 配置文件中,定义的bean的类型与返回的类型一致

工厂bean:配置文件定义的bean类型可以和返回的不一样 首先创建类,让这个类作为工厂bean,实现接口FactoryBean 第二步实现接口里面的方法,在实现的方法中定义返回的bean类型
 

Bean的作用域和生命周期

Bean的作用域:可以设置是单实例还是多实例。在Spring里面,默认是单实例对象

Scope属性值  

singleton单实例  prototype 多实例 两者区别:当是单实例的时候,加载的是一个对象,当设置成多实例的时候,并不是加载配置文件时创建对象,而是在getBean获取对象时创建多对象。

request表示一次请求 session表示一次对话 这两个不太常用

bean的生命周期 从对象创建到对象销毁的生命周期

1.通过构造器创建bean实例(无参构造器)

2.为bean的属性设置值或者对其他bean的引用(调用set方法) 

把bean实例传递bean后置处理器的方法:postProcessBeforeInitialization

3.调用bean的初始化方法(需要进行配置)

把bean实例传递bean后置处理器的方法:postProcessAfterInitialization

4.bean对象可以使用了

5.当容器关闭的时候,调用bean销毁的方法(需要进行配置销毁的方法)

IOC Bean 管理 基于xml实现自动装配

1.什么是自动装配 手动设置值叫手动装配(value 和 ref)而自动装配就是不需要写配置,根据指定的装配规则(属性名称或属性类型)Spring 自动将匹配的属性值进行注入

IOC Bean 管理 引入外部属性文件

1.直接配置数据库信息 配置德鲁伊连接池 引入德鲁伊连接池依赖

2.引入 外部属性文件 配置数据库连接池

创建外部属性文件 jdbc.properties

把外部的properties文件引入到配置文件中(引入context名称空间)

在Spring配置文件中使用标签引入外部属性文件

IOC Bean管理 基于注解方式 简化xml的配置

Component

Service

Controller

Repository

四个注解的功能是一样的,都可以创建Bean对象

1.引入依赖

2.开启组件扫描

3.创建类,在类上面添加创建对象注解

开启组件扫描的配置 细节:context:include-filter type expression

基于注解方式实现属性注入

@AutoWired 根据属性类型进行自动装配

1.把service和dao的类上添加创建对象的注解

2.在service里面注入dao对象

        在service类添加dao类型属性,在属性上面使用注解

@Qualifier 根据属性名称进行注入

        这个注解需要和@AutoWired一起使用

@Resource 可以根据属性名称 也可以根据类型进行注入

@Value 注入普通类型属性

完全注解开发 不用配置文件 只用注解

1.创建配置类(替代xml的配置文件) 组件扫描

2.编写测试类 不再加载xml文件 

AOP 面向切面编程 对业务逻辑的各个部分进行分离 降低各个业务之间的耦合度

不通过修改源代码 把新的功能添加

以登录功能为例说明aop

 AOP的底层原理

1.使用动态代理的方式

(1)有两种情况的动态代理

有接口的情况  使用JDK的动态代理

        

没有接口的情况 使用CGLIB的动态代理

第一种情况 jdk动态代理

Proxy类 以及方法

 AOP的术语:

1.连接点 类里面哪些方法可以被增强

2.切入点 实际真正被增强的方法

3.通知(增强) 实际增强的逻辑部分 登录过程中的权限判断 通知有多种类型

        1.前置通知 2.后置通知 3.环绕通知 4异常通知 5最终通知

4.切面 把通知应用到切入点的过程 把权限判断加入到登录方法过程

Spring 中 基于AspectJ 实现AOP的操作

AspectJ是独立于Spring之外的框架,经常配合Spring一起用,

1.基于xml配置文件实现2.基于注解方式实现

首先在项目工程里面引入AOP相关依赖

aspectj 1.8.10 http://mvnrepository.com/artifact/org.aspectj/aspectjrt/1.8.10

aspectjweaver 1.8.10 http://mvnrepository.com/artifact/org.aspectj/aspectjweaver/1.8.10  

aopalliance 1.0 http://mvnrepository.com/artifact/aopalliance/aopalliance/1.0

 

实践:

1.创建类和方法

2.创建增强类(编写增强的逻辑)

        在增强类中创建方法 不同的方法代表不同的通知类型

 3.进行通知的配置

        在Spring配置文件中开启扫描(配置文件或者配置类)

        使用注解创建User和UserProxy对象

        在增强的类上面添加注解 @Aspect

        在配置中开启代理

4.配置不同类型的通知

        在增强类里面作为通知的方法上面添加通知类型注解,使用切入点表达式配置

细节:

        对公共的切入点进行抽取

        多个增强类对同一个方法进行增强,设置优先级

在增强类上面添加注解 @Order(数字值) 值越小 优先级越高

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值