Table of Contents
spring给java开发带来了哪些帮助?why spring?
Spring配置元数据Configuration Metadata
问题1:spring是如何实现发现bean并加入到容器当中的?
问题3:不使用xml,而使用注解@Autowire注入一个bean?spring是如何实现的?
什么是bean的循环依赖?spring 如何解决的循环依赖?
一个spring mvc项目的启动过程是怎样的,spring boot和springmvc的区别?
Spring的一个启动时自动加载的bean,如果去看它的配置和信息
spring给java开发带来了哪些帮助?why spring?
spring带来的帮助非常之多,现在的spring框架可以说是相当的庞大,在spring的官方文档里面,有一个目录,我们可以从这个目录作为出发点。
其中最为核心的就是Core technologies.包括:依赖注入即ioc,事件,资源,i18n国际化,验证,数据绑定,类型转换,SpEL是spring提供的语法,以及AOP。本篇文章将围绕core technologies做介绍。
总结起来,可以从以下几个方面来看。
- 非侵入式:支持基于POJO的编程模式,不强制性的要求实现Spring框架中的接口或继承Spring框架中的类。
- IoC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归测试。有了IoC容器,程序员再也不需要自己编写工厂、单例,这一点特别符合Spring的精神"不要重复的发明轮子"。
- AOP(面向切面编程):将所有的横切关注功能封装到切面(aspect)中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑和系统服务之间的分离。另一方面,有了AOP程序员可以省去很多自己写代理类的工作。
- MVC:Spring的MVC框架是非常优秀的,从各个方面都可以甩Struts 2几条街,为Web表示层提供了更好的解决方案。
- 事务管理:Spring以宽广的胸怀接纳多种持久层技术,并且为其提供了声明式的事务管理,在不需要任何一行代码的情况下就能够完成事务管理。
- 其他:选择Spring框架的原因还远不止于此,Spring为Java企业级开发提供了一站式选择,你可以在需要的时候使用它的部分和全部,更重要的是,你甚至可以在感觉不到Spring存在的情况下,在你的项目中使用Spring提供的各种优秀的功能。
spring IoC
IoC即Inversion of control,直译过来就是控制反转,它的意思是将对象,以及对象之间的引用关系,交给容器管理。从spring的官方文档来看,我们在说ioc的时候后面其实漏掉了一个单词:container。spring core的第一部分的题目就是:The IOC container。即IOC容器的意思。这一部分的内容其实官方文档讲的是最清楚的。因此我这里只列出最重要的核心内容。
org.springframework.context.ApplicationContext接口表示Spring IoC容器,负责实例化,配置和组装bean。 容器通过读取配置元数据获取有关要实例化,配置和组装的对象的指令。 配置元数据以XML,Java注释或Java代码表示。 它允许表达组成应用程序的对象以及这些对象之间丰富的相互依赖性。
下图显示了Spring如何工作的高级视图。 应用程序类与配置元数据相结合,以便在创建和初始化ApplicationContext之后,可以拥有一个完全配置且可执行的系统或应用程序:
IoC是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.
Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
Spring配置元数据Configuration Metadata
Spring IoC容器的工作是要基于使用配置的元数据。 配置元数据表示我们作为应用程序开发人员如何告诉Spring容器在应用程序中实例化,配置和组装对象。
传统上,spring的配置元数据以简单直观的XML格式提供。相较于其他配置的方式,xml格式是最直观最能反映逻辑的方式
Spring的配置由容器管理的至少一个且通常不止一个的bean定义组成。 基于XML的配置元数据将这些bean配置为顶层<beans />元素内的<bean />元素。 Java配置通常在@Configuration类中使用@ Bean 去注释方法。
这些bean定义对应于构成应用程序的实际对象。 通常,您定义服务层对象,数据访问对象(DAO),表示对象(如Struts Action实例),基础结构对象(如Hibernate SessionFactories,JMS队列等)。 通常,不会在容器中配置细粒度域对象,因为创建和加载域对象通常由DAO和业务逻辑负责。 但是,我们可以使用Spring与AspectJ的集成来配置在IoC容器控制之外创建的对象
以下示例显示了基于XML的配置元数据的基本结构:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
id属性的值指的是协作对象。 在此示例中未显示用于引用协作对象的XML
实例化IOC Container
我们传给ApplicationContext构造函数的位置路径是资源字符串,它允许容器从各种外部资源(如本地文件系统,Java CLASSPATH等)加载配置元数据。说白了就是告诉容器加载配置文件的位置
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
以下示例显示了服务层(services.xml)配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- services -->
<bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="itemDao" ref="itemDao"/>
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for services go here -->
</beans>
以下示例显示了数据访问层daos.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http