Spring相关知识整理

本文深入探讨Spring框架的核心特性,包括IOC(控制反转)和依赖注入,Bean的生命周期与作用域,自动装配Bean,BeanFactory与ApplicationContext的区别。详细阐述了AOP(面向切面编程)原理,Spring事务管理和Spring MVC的工作流程。通过对Spring的全面理解,有助于提升应用程序的设计和开发效率。
摘要由CSDN通过智能技术生成

IOC

  • 控制反转、依赖注入,将类和类之间的依赖从代码中脱离出来,用配置的方式进行依赖关系描述,由IOC容器负责依赖类之间的创建、拼接、管理、获取等工作。BeanFactory接口是Spring框架的核心接口,它实现了容器许多核心的功能。Context模块构建于核心模块之上,扩展了BeanFactory的功能,添加了il8n国际化、Bean生命周期控制、框架事件体系、资源加载透明化等多项功能。此外,该模块还提供了许多企业服务功能支持,如邮件服务、任务调度、JNDI定位、远程访问。ApplicationContext是Context模块的核心接口;
  • IOC类型;构造函数注入、属性注入、接口注入;
  • 提供了实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载;
  • BeanFactory IOC容器,ApplicationContext应用上下文(基于BeanFactory之上)。BeanFactory实现类->XmlBeanFactory ,在初始化beanFactory时,必须为其提供一种日志框架;  ApplictionContext 实现类-> ClassPathXmlAppliction(类路径加载配置文件)和FileSystemXmlApplicationContext(文件系统中装载配置文件);
  • BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标bean;而ApplicationContext则在初始化应用上下文就实例化所有单实例的Bean;
  • Spring为基于注解类的配置提供了专门的ApplicationContext实现类->AnnotationConfigApplicationContext;
  • WebApplicationContext专门为web应用准备的,可以获得ServletContext的引用。在web中bean的作用域:request、session、global session。而在非web环境下,bean只有singleton和prototype两种作用域。webApplicationContext初始化与beanFactory不同,因为它需要servletContext实例,也就是说它必须拥有web容器的提前下才能完成启动工作。(可以在web.xml中配置自启动servlet或定义web容器监听器ServletContextListener,就可以完成启动spring web应用上下文工作,spring提供了用于启动webapplicationContext的servlet和web容器的监听器:ContextLoaderServlet\ContextLoaderListener) ;由于WebApplicationContext需要使用日志功能,所以还得在web.xml中配置Log4jConfigServlet
  • 在属性注入时,Spring会按JavaBean规范确定配置属性和对应的Setter方法,并使用Java反射机制调用Setter方法完成属性注入。
  • lookup方法注入,Spring IoC容器拥有复写Bean方法的能力,它主要通过CGLib在运行期动态操作Class字节码,为Bean动态创建子类或实现类。lookup-method中bean属性指向的必须是一个非单例模式的bean,当然如果不是也不会报错,只是每次得到的都是相同引用的bean(同一个实例),这样用lookup-method就没有意义了。
    <bean class="beanClass">
        <lookup-method name="method" bean="non-singleton-bean"/>  为bean生成一个实现类;
    </bean>

 

Bean生命周期 

  1. 当调用者通过getBean(beanName) 向容器请求某一个Bean时,如果容器注册了InstantiationAwareBeanPostProcessor接口,那在实例化bean前,调用该接口的postProcessBeforeInstantiation()方法;
  2. 根据配置情况调用Bean构造函数或工厂方法实例化Bean;
  3. 如果容器注册了InstantitationAwareBeanPostProcessor接口,实在实例化bean之后,调用该接口的postProcessAfterInstantiation()方法。
  4. 如果Bean实现了BeanNameAware接口,将调用setBeanName()接口方法,将配置文件中该Bean对应的名称设置到bean中;
  5. 如果bean实现了BeanFactoryAware接口,将调用setBeanFactory方法,将BeanFactory容器实例设置到bean中;
  6. 如果bean实现了InitiallizingBean的接口 init-method初始化方法,执行初始化方法;
  7. 如果bean指定作用范围是scope="prototype",将Bean返回给调用者,调用者负责Bean后续生命的管理,Spring不再管理这个Bean的生命周期;如果作用域是scope="singleton",则将Bean放入到Spring IoC容器缓存池中,并将Bean引用返回给调用者,Spring继续对这些Bean进行后续的生命管理;
  8. 对于scope="singleton"的Bean,当容器关闭时,将触发Spring对Bean的后续生命周期的管理工作,如果该类实现了DisposableBean接口,则将调用接口的destory()方法; 在spring里面,当一个singleton bean依赖一个protoype bean,因为singleton bean是单例的,因此在protoype bean在singleton bean里面也会变成单例,此时就可以使用lookup-method来注入。

        这种是配置的方式,如果注解方式annoation,直接将ApplicationContext注入进来通过getBean()方式获取就可以。

Bean作用域

类别说明
singleton在spring ioc容器中仅存在一个Bean实例,Bean以单实例的方式存在;
prototype每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean时,相当于执行new Bean操作
request每次htpp请求都会创建一个新的Bean。该作用于域仅适用于WebApplicationContext环境
session同一个http session共享一个Bean,不同HTTP session使用不同的Bean.该作用域仅适用于WebApplictionContext环境
globalSession同一个全局Session共享一个Bean,一般用于Portlet应用环境。作用域仅适用于WebApplicationContext环境

 

自动装配Bean

注解说明
@Autowired按类型匹配的方式(配置最丰富、集全)
@Qualifier指定注入Bean的名称
@Resource按名称匹配注入
@Configuration该类可用于为Spring提供Bean的定义信息
@Bean

定义一个Bean,Bean的类型由方法返回值决定,名称默认和方法名相同。

Spring会对配置类所有标注@Bean的方法进行“改造”(AOP增强),将对Bean生命周期的逻辑植入进来。如

rabbitTemplate.setConfirmCallback(pgwConfirmCallBackListener()); 不是简单地执行pgwConfirmCallBackListener()方法逻辑,而是从Spring容器中返回相应Bean的单例。

@ImportResource通过@ImportResource("classpath:com/taobao/xxx.xml") 引入XML配置文件

     

 对集合类进行标注,事例如下:

 

BeanFactory与ApplicationContext

     两者的Bean的生命周期类似,ApplicationContext与BeanFactory另一个最大的不同之处在于:前者会利用Java反射机制自动识别出配置文件中定义的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,并自动将它们注册到应用上下文中;而后者需要在代码中通过手工调用addBeanPostProcessor()方法进行注册;

    视图解析器类 -> InternalResourceViewResolver 

    资源访问利器-> Resource 可从Web容器的上下文中获取资源的操作类

地址前缀示例对应资源类型
classpath:classpath:com/taobao/.xml从类路径中加载资源,classpath:和classpath:/是等价的
file:file:/conf/com/taobao/.xml使用UrlResource 从文件系统目录中装载资源;
http://http://使用UrlResource从web服务器中装载资源

AOP

  • 面象切面编程,整合了AspectJ这种AOP语言级的框架。Java 5.0引入java.lang.instrument,允计在JVM启动时启用一个代理类,通过该代理类在运行期修改类的字节码,改变一个类的功能,实现AOP功能。
  •  连接点JoinPoint 程序执行的某个特定位置:如类开始初始化前、类初始化后、类某个方法调用前台;
  •  切点 Pointcut 一个切点可以匹配多个连接点;
  •  增强 Advice 织入到目标类连接点上的一段程序代码;
  •  切面 Aspect 
  •  目标对象Target 增加逻辑的织入目标类。
  •  引介Introduction 它是一种特殊的增加,它为类添加一些属性和方法;
  •  织入Weaving 是将增加添加对目标类具体连接点上的过程。

 AOP实现者

  •    AspectJ 是语言级的AOP实现,它扩展了Java语言,定义了AOP语法,能够在编译期提供横切代码的织入;
  •    AspectWerkz 轻量级的AOP框架,02年发布,它支持运行期或类装载期织入横切代码。与AspectJ合并;
  •   JBoss AOP 04年发布;
  •   Spring AOP 使用纯java实现,它不需要专门的编译过程,不需要特殊的类装载器,它在运行期通过代理方式向目标类织入增加代码。

Spring AOP原理

    两种代理机制,一种是基于JDK的动态代理,别一种是基于CGLib的动态代理。之所以需要两种代理机制,很大程序上是因为JDK本身只提供接口的代理,而不支持类的代理。

  1. JDK动态代理

         JDK1.3以后,Java提供了动态代理技术,允许开发者在运行期创建接口的代理实例。JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler,其中InvocationHandler是一个接口,可以通过实现该接口invoke()定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。

     2.CGLib动态代理

         CGLib采用底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,并顺势织入横切逻辑。

  3、代理小知识总结

      我们手工编写的代理实例的创建过程,为不同的类创建代理时,需要分别编写相应的创建代码,无法做到通用。CGLib所创建的动态代理对象的性能JDK创建的代理对象的性能高,但CGLib在创建代理对象时所花费的时间却比JDK动态代理时间长,所以对于singleton的代理对象或者具有实例池的代理,因为无须频繁创建代理对象,所以比较适合CGlib动态代理技术,反之适用JDK动态代理技术。但由于CGLib采用的是动态创建子类的方式生成代理对象,所以不能对目标类中的final方法进行代理。

  4、Spring定义的增强

接口说明
BeforeAdvice代表前置增强,Spring只支持方法级的增强,表示在目标方法执行前实施增强
AfterReturningAdvice代表后置增强,表示在目标方法执行后实施增强
MethodInterceptor代表环绕增强,表示在目标方法执行前后实施增强
ThrowsAdvice代表抛出异常增强,表示在目标方法抛出异常后实施增强
IntroductionInterceptor代表引介增强,表示在目标类中添加一些新的方法和属性(它的连接点是类级别的,非方法级别,通过引介增强,可为目标类添加一个接口的实现,即原来目标类未实现某个接口)

 

5、切点类型

  • 静态方法切点 StaticMethodMatcherPointcut
  • 动态方法切点 DynamicMethodMatcherPointcut
  • 注解切点 AnnotationMatchingPointcut
  • 表达式切点 ExpressionPointcut
  • 流程切点 ControlFlowPointcut
  • 复合切点 ComposablePointcut    

6、Java注解的基本知识

    我们可以自定义注解标签,并通过Java反射机制中获取类中标注的注解,完成特定的功能。注解是代码的附属信息,它遵循一个基本原则:注解不能直接干扰程序代码的运行,无论增加或删除注解,代码都能正常运行。

7、@AspectJ语法基础

  • 切点表达式函数
类别函数入参说明
方法切点函数execution()方法匹配模式串表示满足某一匹配模式的所有目标类方法连接点。如exeution(*greetTo)) 表示所有目标类中的greetTo()方法
@annotation()方法注解类名表示标注了特定注解的目标方法连接点。如@annotation(com.ex.anno.NeedTest) 表示任何标注了@NeedTest注解的目标方法
方法入参切点函数args()类名

通过判别目标类方法运行时入参对象的类型定义指定连接点。

ps-> args(Waiter)表示所有有且仅有一个按类型匹配于Waiter入参的方法

@args()类型注解类名

通过判断目标方法运行入参对象的类是否标注特定注解来指定连接点。

ps->@args(Monitorable) 表示任何这样的一个目标方法入参对象的标注@Monitorable注解

目标类切点函数within()类名匹配串ps-> within(com.ex.service.*) 表示该包中的有类的所有方法都是连接点

 

  • 在函数入参中使用通配符

       * 匹配任意字符,但它只能匹配上下文中的一个元素;

       .. 匹配任意字符,可以匹配上下文多个元素,但在表示类时,必须和*联合使用,而在表示入参时可以单独使用;

       + 表示按类型匹配指定类的所有类,必须跟在类名后面,如: com.ex.Card+

  • 逻辑运算符 

        ---> &&与操作符,与"and" 等效 ps-> with(com.ex..*) and args(String)

        ---> || 或操作符,与"or"等效 ps-> within(com,bao..*) or args(String)

       --> !非操作符 与"not" 等效

 

Spring事务

  1.  事务的特性: A(Atomic)原子性、C(Consistency)一致性、I(Isolation)隔离性、D(Durabliy)持久性;
  2.  事务的隔离级别 :Read Uncommited、Read Commited、Repeatable read、Serializetable;
  3.  Spring事务管理实现类:DataSourceTransacationManager、DataSource数据源
  4.  事务的传播行为
  5. 事务传播行为类型说明
    propagation_required如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
    propagation_supports支持当前事务,如果当前没有事务,就以非事务方式执行
    propagation_mandatory使用当前的事务,如果当前没有事务,就抛出异常
    propagation_requires_new新建事务,如果当前存在事务,把当前事务挂起
    propagation_not_supported以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
    propagation_never以非事务方式执行,如果当前存在事务,则抛出异常
    propagation_nested如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与required类似的操作
  6. private、static这些方法不能启动一个事务,但是因为如果外层有事务,他们通过事务传播性,方法体内还是有事务的。

Spring MVC

核心对象DispathcerServlet ,Spring请求到处理流程如下:

  1. 客户端发出一个http请求,web应用服务器接收到这个请求和匹配DispatcherServlet路径,转交处理;
  2. 根据请求信息(URL、HTTP方法、请求报文头、参数)及HandlerMappering的配置找到处理请求的处理器(Handler);
  3. 当DispatherServlet根据HandlerMappering得到对应当前请求的Handler后,通过HandlerAdapter适配器对Handler进行封装.(适配器统一对接口对各种handler方法进行调用);
  4. 处理器完成业务逻辑处理后将返回一个ModelAndView给DispathcherServlet;
  5. 然后通过ViewResolver完成视图名到真实视图对象的解析工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值