写在前面:相关学习代码放到了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(数字值) 值越小 优先级越高