1. ioc
控制 :指的是对象创建(实例化、管理)的权利 反转 :控制权交给外部环境了(spring框架、IoC容器)IoC解决对象之间的耦合问题 DI :Dependancy Injection(依赖注⼊)IOC和DI描述的是同⼀件事情,只不过⻆度不⼀样
2. aop
⾯向切⾯编程/⾯向⽅⾯编程AOP是OOP的延续 在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复
3. Spring IOC 应⽤
ioc的启动方式(纯xml,xml+注解) javaSe:new classPathXmlApplicationContext(bean.xml),new FileSystemXmlApplicationContext(bean.xml) javaWeb:javaWeb ContextLoaderListener(监听器) ioc启动方式(纯注解) javaSe :new AnnotationconfigApplicationContext(SpringConfig.class) javaWeb :ContextLoaderListener(监听器去加载注解配置类) BeanFactory与ApplicationContext区别 称BeanFactory 为SpringIOC的基础容器,ApplicationContext 是容器的⾼级接⼝,⽐BeanFactory要拥有更多的功能,⽐如说国际化 ⽀持和资源访问(xml,java配置类) Bean的⽣命周期 单例 模式的bean对象⽣命周期与容器相同 多例 模式的bean对象,spring框架只负责创建,不负责销毁 Bean标签属性 factory-bean 属性:⽤于指定创建当前bean对象的⼯⼚bean的唯⼀标识。当指定了此属性之后, class属性失效。 factory-method 属性:⽤于指定创建当前bean对象的⼯⼚⽅法,如配合factory-bean属性使⽤, 则class属性失效。如配合class属性使⽤,则⽅法必须是static的 scope 属性:⽤于指定bean对象的作⽤范围。通常情况下就是singleton。当要⽤到多例模式时, 可以配置为prototype。 init-method 属性:⽤于指定bean对象的初始化⽅法,此⽅法会在bean对象装配后调⽤。必须是 ⼀个⽆参⽅法。 destory-method 属性:⽤于指定bean对象的销毁⽅法,此⽅法会在bean对象销毁前执⾏。它只 能为scope是singleton时起作⽤ 纯注解模式 @Configuration 注解,表名当前类是⼀个配置类 @ComponentScan 注解,替代 context:component-scan @PropertySource ,引⼊外部属性配置⽂件 @Import 引⼊其他配置类 @Value 对变量赋值,可以直接赋值,也可以使⽤ ${} 读取资源配置⽂件中的信息 @Bean 将⽅法返回对象加⼊ SpringIOC 容器
4. Spring IOC⾼级特性
lazy-Init 延迟加载 :设置 lazy-init 为 true 的 bean 将不会在 ApplicationContext 启动时提前被实例化,⽽是第⼀次向容器通过getBean 索取 bean 时实例化的应⽤场景 开启延迟加载⼀定程度提⾼容器启动和运转性能 对于不常使⽤的 Bean 设置延迟加载,这样偶尔使⽤的时候再加载,不必要从⼀开始该 Bean 就占⽤资源FactoryBean 和 BeanFactory BeanFactory接⼝是容器的顶级接⼝,定义了容器的⼀些基础⾏为,负责⽣产和管理Bean的⼀个⼯⼚,具体使⽤它下⾯的⼦接⼝类型 FactoryBean可以⽣成某⼀个类型的Bean实例(返回给我们),也就是说我们可以借助于它⾃定义Bean的创建过程BeanPostProcessor后置处理器 BeanPostProcessor在BeanFactory初始化之后可以使⽤BeanFactoryPostProcessor进⾏后置处理做⼀些事情 BeanFactoryPostProcessor 在Bean对象实例化(并不是Bean的整个⽣命周期完成)之后可以使⽤BeanPostProcessor进⾏后置处理做⼀些事情 注意:对象不⼀定是springbean,⽽springbean⼀定是个对象 BeanFactoryPostProcessor BeanFactoryPostProcessor BeanFactory级别的处理,是针对整个Bean的⼯⼚进⾏处理,典型应⽤:PropertyPlaceholderConfigurerBeanDefinition对象 我们在 XML 中定义的 bean标签,Spring 解析 bean 标签成为⼀个 JavaBean,这个JavaBean 就是 BeanDefinition 注意:调⽤ BeanFactoryPostProcessor ⽅法时,这时候bean还没有实例化,此时 bean 刚被解析成BeanDefinition对象
5. BeanFactory 容器继承体系(Spring IoC容器初始化主流程)
// 第⼀步:刷新前的预处理
prepareRefresh ( ) ;
//第⼆步:获取BeanFactory;默认实现是DefaultListableBeanFactory加载BeanDefition 并注册到 BeanDefitionRegistry
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory ( ) ;
//第三步:BeanFactory的预准备⼯作(BeanFactory进⾏⼀些设置,⽐如context的类加载器等)
prepareBeanFactory ( beanFactory) ;
// 第四步:BeanFactory准备⼯作完成后进⾏的后置处理⼯作
postProcessBeanFactory ( beanFactory) ;
// 第五步:实例化并调⽤实现了BeanFactoryPostProcessor接⼝的Bean
invokeBeanFactoryPostProcessors ( beanFactory) ;
// 第六步:注册BeanPostProcessor(Bean的后置处理器),在创建bean的前后等执⾏
registerBeanPostProcessors ( beanFactory) ;
// 第七步:初始化MessageSource组件(做国际化功能;消息绑定,消息解析);
initMessageSource ( ) ;
// 第⼋步:初始化事件派发器
initApplicationEventMulticaster ( ) ;
// 第九步:⼦类重写这个⽅法,在容器刷新的时候可以⾃定义逻辑
onRefresh ( ) ;
// 第⼗步:注册应⽤的监听器。就是注册实现了ApplicationListener接⼝的监听器bean
registerListeners ( ) ;
第⼗⼀步:初始化所有剩下的⾮懒加载的单例bean初始化创建⾮懒加载⽅式的单例Bean实例(未设置属性)填充属性初始化⽅法调⽤(⽐如调⽤afterPropertiesSet⽅法、init-method⽅法)调⽤BeanPostProcessor(后置处理器)对实例bean进⾏后置处*/
finishBeanFactoryInitialization ( beanFactory) ;
第⼗⼆步:完成context的刷新。主要是调⽤LifecycleProcessor的onRefresh()⽅法,并且发布事件 (ContextRefreshedEvent)*/
finishRefresh ( ) ;
6. Spring IoC循环依赖问题
单例 bean 构造器参数循环依赖(⽆法解决) prototype 原型 bean循环依赖(⽆法解决) 单例bean通过setXxx或者@Autowired进⾏循环依赖 ClassA调⽤setClassB⽅法,Spring⾸先尝试从容器中获取ClassB,此时ClassB不存在Spring容器中 Spring容器初始化ClassB,同时也会将ClassB提前暴露到Spring容器中 ClassB调⽤setClassA⽅法,Spring从容器中获取ClassA ,因为第⼀步中已经提前暴露了ClassA,因此可以获取到ClassA实例 ClassA通过spring容器获取到ClassB,完成了对象初始化操作。 这样ClassA和ClassB都完成了对象初始化操作,解决了循环依赖问题。
7. Spring AOP 应⽤
AOP本质 ::在不改变原有业务逻辑的情况下增强横切逻辑,横切逻辑代码往往是权限校验代码、⽇志代码、事务控制代码、性能监控代码AOP 术语 Joinpoint(连接点) Pointcut(切⼊点) Advice(通知/增强) Target(⽬标对象) Proxy(代理) Weaving(织⼊) Aspect(切⾯)Spring中AOP的代理选择 Spring 实现AOP思想使⽤的是动态代理技术 默认情况下,Spring会根据被代理对象是否实现接⼝来选择使⽤JDK还是CGLIB。当被代理对象没有实现任何接⼝时,Spring会选择CGLIB。当被代理对象实现了接⼝,Spring会选择JDK官⽅的代理技术,不过我们可以通过配置的⽅式,让Spring强制使⽤CGLIB。XML 模式 第⼀步:把通知Bean交给Spring管理 第⼆步:使⽤aop:config开始aop的配置 第三步:使⽤aop:aspect配置切⾯ 第四步:使⽤对应的标签配置通知的类型 注解模式
@Configuration
@ComponentScan ( "com.lagou" )
@EnableAspectJAutoProxy
public class SpringConfiguration {
}
Spring 声明式事务的⽀持 编程式事务:在业务代码中添加事务控制代码,这样的事务控制机制就叫做编程式事务 声明式事务:通过xml或者注解配置的⽅式达到事务控制的⽬的,叫做声明式事务 事务的四⼤特性 原⼦性(Atomicity) ⼀致性(Consistency) 隔离性(Isolation) 持久性(Durability) 事务的隔离级别 脏读 幻读 不可重复读 事务的传播⾏为 PROPAGATION_REQUIRED 如果当前没有事务,就新建⼀个事务,如果已经存在⼀个事务中,加⼊到这个事务中。这是最常⻅的选择。 PROPAGATION_SUPPORTS ⽀持当前事务,如果当前没有事务,就以⾮事务⽅式执⾏。 Spring声明式事务控制声 @EnableTransactionManagement 手写ioc框架地址 https://gitee.com/zl1002/homework.git