同步操作将从 Java精选/Ebooks 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying
被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。
Spring容器能够自动装配相互合作的bean,这意味着容器不需要<constructor-arg>和<property>配置,能通过Bean工厂自动处理bean之间的协作。
代理是使用非常广泛的设计模式。简单来说,代理是一个看其他像另一个对象的对象,但它添加了一些特殊的功能。
Spring AOP是基于代理实现的。AOP代理是一个由AOP框架创建的用于在运行时实现切面协议的对象。
Spring AOP默认为AOP代理使用标准的JDK 动态代理。这使得任何接口(或者接口的集合)可以被代理。
Spring AOP也可以使用CGLIB代理。这对代理类而不是接口是必须的。
如果业务对象没有实现任何接口那么默认使用CGLIB。
Spring 总共大约有 20 个模块,Spring 框架的基本模块包括Core module、Bean module、Context module、Expression Language module、JDBC module、ORM module、OXM module、Java Messaging Service(JMS) module、Transaction module、Web module、Web-Servlet module、Web-Struts module、Web-Portlet module。由1300多个不同的文件构成,而这些组件被分别整合在核心容器(Core Container)、AOP(Aspect Oriented Programming)和设备支持(Instrmentation)、数据访问与集成(Data Access/Integeration)、Web、消息(Messaging)、Test等6个模块中。
以下是Spring 5的模块结构图:
Spring core:提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)功能。
Spring beans:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean。
Spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。
Spring jdbc:提供了一个JDBC的抽象层,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析, 用于简化JDBC。
Spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。
Spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。
Spring test:主要为测试提供支持的,支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。
自动装配的局限性
重写:仍需用<constructor-arg>和<property>配置来定义依赖,意味着总要重写自动装配。
基本数据类型:不能自动装配简单的属性,例如基本数据类型、String字符串、和类。
模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。
有两个重要的bean生命周期方法,第一个是setup,它是在容器加载bean的时候被调用。
第二个方法是teardown它是在容器卸载类的时候被调用。bean标签有两个重要的属性(init-method和destroy-method)。用它们可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)。
Spring框架事务管理为不同的事务API,如JTA、JDBC、Hibernate、JPA和JDO,提供一个不变的编程模式。
Spring框架为编程式事务管理提供了一套简单的API而不是一些复杂的事务API。
Spring框架支持声明式事务管理。
Spring框架和Spring各种数据访问抽象层很好得集成。
通知(advice)是在程序中想要应用在其他模块中横切关注点的实现。
Advice主要有5种类型:
@Before注解使用Advice
前置通知(BeforeAdvice):在连接点之前执行的通知(advice),除非它抛出异常,否则没有能力中断执行流。
@AfterReturning注解使用Advice
返回之后通知(AfterRetuningAdvice):如果一个方法没有抛出异常正常返回,在连接点正常结束之后执行的通知(advice)。
@AfterThrowing注解使用Advice
抛出(异常)后执行通知(AfterThrowingAdvice):若果一个方法抛出异常来退出的话,这个通知(advice)就会被执行。
@After注解使用Advice
后置通知(AfterAdvice):无论连接点是通过什么方式退出的正常返回或者抛出异常都会执行在结束后执行这些通知(advice)。
注解使用Advice
围绕通知(AroundAdvice):围绕连接点执行的通知(advice),只有这一个方法调用。这是最强大的通知(advice)。
Spring 作者 Rod Johnson 设计了两个接口用以表示容器。
BeanFactory
ApplicationContext
BeanFactory可以理解为就是个HashMap,Key是BeanName,Value是Bean实例。通常只提供注册(put),获取(get)这两个功能。我们可以称之为 “低级容器”。
ApplicationContext可以称之为 “高级容器”。因为它比BeanFactory多了更多的功能。它继承了多个接口。因此具备了更多的功能。例如资源的获取,支持多种消息(例如JSP tag的支持),对BeanFactory多了工具级别的支持等待。所以他的名称已经不是BeanFactory之类的工厂,而是 “应用上下文”, 代表着整个大容器的所有功能。该接口定义了一个refresh方法,此方法是所有阅读Spring源码的人的最熟悉的方法,用于刷新整个容器,即重新加载/刷新所有的bean。
当然,除了这两个大接口,还有其他的辅助接口,这里就不过多介绍。
BeanFactory和ApplicationContext的关系为了更直观的展示 “低级容器” 和 “高级容器” 的关系,这里通过常用的ClassPathXmlApplicationContext类来展示整个容器的层级UML关系。
有点复杂,东哥解释一下:
最上面的是BeanFactory,下面的3个绿色的,都是功能扩展接口,这里就不展开来讲,简单跳过。
看下面的隶属ApplicationContext粉红色的 “高级容器”,依赖着 “低级容器”,这里说的是依赖,不是继承,它依赖着 “低级容器” 的getBean功能。而高级容器有更多的功能:支持不同的信息源头,可以访问文件资源,支持应用事件(Observer 模式)。
通常用户看到的就是 “高级容器”。 但BeanFactory也非常够用!
左边灰色区域的是 “低级容器”, 只负载加载Bean,获取Bean。容器其他的高级功能是没有的。例如上图画的refresh刷新Bean工厂所有配置,生命周期事件回调等。
小结
说了这么多,不知道有没有理解Spring IoC?这里总结一下:IoC在Spring中,只需要低级容器就可以实现,2 个步骤:
加载配置文件,解析成BeanDefinition放在Map里。
调用getBean的时候,从BeanDefinition所属的Map里,拿出Class对象进行实例化,同时,如果有依赖关系,将递归调用getBean方法 —— 完成依赖注入。 上面就是Spring低级容器(BeanFactory)的IoC。
至于高级容器ApplicationContext,它包含了低级容器的功能,当他执行refresh模板方法的时候,将刷新整个容器的Bean。同时其作为高级容器,包含了太多的功能。一句话,它不仅仅是IoC。它支持不同信息源头,支持BeanFactory工具类,支持层级容器,支持访问文件资源,支持事件发布通知,支持接口回调等等。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。