SpringIOC&AOP
2021-10-29 11:36:08 0 举报
登录查看完整内容
spring ioc aop
作者其他创作
大纲/内容
通过IoC容器来管理POJO对象以及他们相互之间的耦合关系
通过AOP以动态和非侵入式的方式来增强服务的功能
非侵入性框架
Spring提供了一个一致的编程模型,应用直接使用POJO开发
Spring推动应用的设计风格面向对象及面向接口编程转变,提高了代码的重用性和可测试性
Spring改进了体系结构的选择,降低了平台锁定的风险
Spring的设计理念和整体架构
当对象被创建时,由一个调控系统内的所有对象的外界实体将其依赖的对象的引用传递给它,即依赖被注入到对象中。
控制反转是关于一个对象如何获取它所依赖的对象的引用,反转指的是责任的反转
控制反转
接口注入
setter注入
构造器注入
依赖注入方式
IoC容器概述
容器的高级形态增加了许多面向框架的特性,同时对应用环境作了许多适配
信息源的扩展功能可以支持国际化的实现,为开发多语言版本的应用提供服务
继承了MessageSource接口
在上下文中引入了事件机制,事件和Bean的生命周期结合为Bean的管理提供了便利
继承了ApplicationEventPublisher接口
类FileSystemXmlApplicationContext
抽象类AbstractXmlApplicationContext
抽象类AbstractRefreshableConfigApplicationContext
抽象类AbstractRefreshableApplicationContext
抽象类AbstractApplicationContext
接口ConfigurableApplicationContext
还有核心子子类ClassPathXmlApplicationContext
接口ApplicationContext
通过方法addBeanPostProcessor配置Bean后置处理器
接口ConfigurableBeanFactory
父子级联Ioc容器的接口,子容器可以通过接口方法访问父容器
接口HierarchicalBeanFactory
接口WebApplicationContext
方法loadBeanDefinitions将Bean信息从Resource载入到BeanDefinitions
组合了类XmlBeanDefinitionReader
子类XmlBeanFactory
实现类DefaultListableBeanFactory
接口ConfigurableListableBeanFactory
接口ListableBeanFactory
方法containsBean
方法getBean
方法getType
方法isSingleton
方法isPrototype
方法getAliases
接口BeanFactory
依赖反转模式中管理对象依赖关系的数据抽象
用于管理各种对象以及它们之间的相互依赖关系
接口BeanDefinition
Ioc容器的接口设计图
IoC容器的设计与实现
由ResourceLoader通过统一的Resource接口来完成
Resource定位
BeanDefinitionReader对资源进行信息处理
BeanDefinition的载入
通过BeanDefinitionRegistry接口实现
向IoC容器注册BeanDefinition
IoC容器的初始化过程
IoC容器的依赖注入
容器其他相关特性的设计与实现
基于xml文件的配置-spring1.0支持
基于注解的配置-spring2.0支持
基于Java类的配置-spring3.0支持
基于Groovy动态语言的配置-spring4.0支持
Bean配置方式
基于属性注入
基于构造函数注入
还支持工厂方法注入
一种Bean创建的一种方式,对Bean的一种扩展。对于复杂的Bean对象初始化创建使用其可封装对象的创建细节。
FactoryBean
IoC容器的实现
概念:面向切面编程Aspect-方面 Oriented-朝向 Programming
待增加的目标方法设置的前置增强接口
回调方法before
接口MethodBeforeAdvice
前置通知,接口BeforeAdvice
待增加的目标方法设置的后置增强接口
回调方法afterReturning
接口AfterReturningAdvice
返回通知,接口AfterAdvice
异常通知,接口ThrowsAdvice
为切面增强提供织入接口
前置通知 Before-在目标方法被调用之前调用通知功能
后置通知After-在目标方法完成之后调用通知,此时不会关心方法的输出是什么
返回通知After-returning-在目标方法成功执行之后调用通知
异常通知After-throwing-在目标方法抛出异常后调用通知
环绕通知Around-通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
Spring切面可以应用5中类型的通知
通知:接口Advice
决定Advice通知应该作用于哪个连接点,定义需要增强的方法的集合
可以由某个正则表达式进行标识、可以根据某个方法名进行匹配
切点:接口Pointcut
定义应该使用哪个通知并在哪个关注点使用它,把Advice和Pointcut结合起来
有两个属性advice和pointcut
实现类DefaultPointcutAdvisor
抽象类AbstractGenericPointcutAdvisor
抽象类AbstractPointcutAdvisor
接口PointcutAdvisor
通知器:接口Advisor
Spring AOP概述
以JDK动态代理技术为基础,设计一系列AOP横切实现,如前置通知、返回通知、异常通知等
集成了AspectJ
AOP流程:需要为目标对象通过动态代理建立代理对象;启动代理对象的拦截器来完成各种横切面的织入,通过一系列Adapter实现织入;
Spring AOP的设计与实现
定义使用的通知器Advisor,通知器的实现定义了需要对目标对象进行增强的切面行为,也就是Advice通知
被代理接口
属性interfaces
需要定义的通知器Advisor
属性interceptorNames
需要增强的目标
属性targetName
定义ProxyFactoryBean中的属性
JDK动态代理生成代理对象
类加载器
Proxy.newProxyInstance参数一
被代理的接口
Proxy.newProxyInstance参数二
ReflectiveMethodInvocation.java
通过ReflectiveMethodInvocation.process方法进行递归调用
JdkDynamicAopProxy.java
Proxy回调方法所在的对象,实现了InvocationHandler的invoke方法
Proxy.newProxyInstance参数三
动态代理
JdkDynamicAopProxy#getProxy
依赖asm字节码技术(同等级的还有javassist)
依赖AspectJ静态代理
Cglib动态代理生成代理对象
CglibAopProxy.java
CglibAopProxy#getProxy
DefaultAopProxyFactory.java
动态代理方式选择通过DefaultAopProxyFactory的createAopProxy方法确定
接口AopProxy方法getProxy
配置ProxyFactoryBean
AopProxy代理对象
通过JDK的Proxy方式生成代理对象需要通过InvocationHandler来设置拦截器回调
通过CGLIB方式生成代理对象需要通过DynamicAdvisedInterceptor来完成回调
设计原理
AdvisedSupport.java
拦截器链通过缓存加快访问速度AdvisedSupport#getInterceptorsAndDynamicInterceptionAdvice
配置通知器
实现了MethodInterceptor,BeforeAdvice接口
组合了MethodBeforeAdvice类
MethodBeforeAdviceInterceptor.java
方法getInterceptor得到MethodBeforeAdviceInterceptor
实现类MethodBeforeAdviceAdapter
组合了AfterReturningAdvice类
AfterReturningAdviceInterceptor.java
方法getInterceptor得到AfterReturningAdviceInterceptor
实现类AfterReturningAdviceAdapter
ThrowsAdviceInterceptor.java
方法getInterceptor得到ThrowsAdviceInterceptor
实现类ThrowsAdviceAdapter
接口AdvisorAdapter
DefaultAdvisorAdapterRegistry.java
注册器DefaultAdvisorAdapterRegistry
Advice通知的实现-适配器模式
除使用ProxyFactoryBean实现AOP应用之外,还可使用ProxyFactory来实现Spring AOP的功能,ProxyFactory需要编程式完成AOP应用的设置
ProxyFactory类的父类的父类AdvisedSupport提供相关配置的支持
ProxyFactory实现AOP
Spring AOP拦截器调用的实现
JDK动态代理只能对实现了接口的类生成代理,而不能针对类
CGLib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)
区别
当Bean实现接口时,Spring就会用JDK的动态代理
当Bean没有实现接口时,Spring使用CGLib来实现
可以强制使用CGLib(在Spring配置中加入<aop:aspectj-autoproxy proxy-target-class=“true”/>)
Spring在选择用JDK还是CGLib的依据
使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,在JDK1.6之前比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
在JDK1.6、JDK1.7、JDK1.8逐步对JDK动态代理优化之后,在调用次数较少的情况下,JDK代理效率高于CGLib代理效率,只有当进行大量调用的时候,JDK1.6和JDK1.7比CGLib代理效率低一点,但是到JDK1.8的时候,JDK代理效率高于CGLib代理
JDK和CGLib的性能对比
JDK动态代理和CGLIB动态代理
Spring AOP通配符配置
JDK动态代理:类内部方法间调用不是通过接口方式调用,不能在方法前后增强
CGLIB动态代理:CGLIB代理重写了父类的非私有方法(原类作为父类,代理类是子类),没有修改父类的字节码,类内调用属于子类调用了父类的方法,父类的方法并没有增强
类内部方法事务不生效原因解析
事务
注解
spring AOP应用
AOP的实现
SpringMVC与Web环境
数据库操作组件的实现
事务处理的实现
Spring远端调用的实现
安全架构ACEGI的设计与实现
SpringDM模块的设计与实现
SpringFlex的设计与实现
Spring
0 条评论
回复 删除
下一页