一、Spring的作用
用来替代更加重量级的企业级Java技术,尤其是EJB。达到简化java编程开发
二、spring的组成模块
Core | IoC container, Events, Resources, i18n, Validation, Data Binding, Type Conversion, SpEL, AOP. |
Testing | Mock objects, TestContext framework, Spring MVC Test, WebTestClient. |
Data Access | Transactions, DAO support, JDBC, ORM, Marshalling XML. |
Web Servlet | Spring MVC, WebSocket, SockJS, STOMP messaging. |
Web Reactive | Spring WebFlux, WebClient, WebSocket. |
Integration | Remoting, JMS, JCA, JMX, Email, Tasks, Scheduling, Cache. |
Languages | Kotlin, Groovy, Dynamic languages. |
三、为降低开发的复杂性,Spring采用以下4中关键策略
- 基于POJO轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯性进行声明式编程
- 通过切面和模板减少样式代码
注:POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans。其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
关于DI Dependency Injection,依赖注入 和 IOC Inversion of Control,控制反转 项目概念查看此博客
https://blog.youkuaiyun.com/luoyepiaoxue2014/article/details/72426666
1、依赖注入
实际的应用都是由两个类或者更多的类组成,类之间通过相互协作来完成特定的业务逻辑。通常每个对象负责管理与自己相互协作的对象的引用,但是这将会导致高度耦合和难以测试的代码;
通过依赖注入的方式,对象的依赖关系将由负责协调系统中各个对象的第三方组件在创建对象时设定。对象无需自行创建或管理他们的依赖关系;这就大大的减少了对象之间的耦合,可以注入接口的方式给对象注入不同的实现;
创建组件之间协作的行为称为装配。spring有多种装配bean的形式(xml配置文件,注解等),spring通过应用程序上下文装载bean的定义并把他们组装起来。spring应用程序上下文全权负责 对象的创建和组装。
2、应用切面
依赖注入使相互协作的组件保持松散耦合,而aop编程允许你把遍布应用各处的功能分离出来形成可重用的组件,实际中,经常会用aop来分离一些和业务逻辑无关的功能,如日志、事务管理、安全等;
如果这些与业务逻辑混在一起,将会导致复杂的依赖关系:
而aop可以使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去,使这些组件具有更高的内聚性以及更加关注自身业务完全不需要了解系统服务的复杂性;
3、通过模板消除样板式代码
例如spring的JdbcTemplate
4、spring容器
在基于spring的应用中,容器生存与spring容器中,容器创建它们,装配它们,配置它们,管理它们的整个生命周期,从生存到死亡;
容器是spring框架的核心,spring容器通过依赖注入管理构成应用的组件,它会创建构成应用组件之间的关联;
spring自带几种容器的实现,可以归为两种不同的类型。
Bean工厂:最简单的容器,提供基本的di支持;
应用上下文:基本Bean工厂智商构建,提供面向应用的服务
5、应用程序上下文
ClassPathXmlApplicationContext:从类路径下的xml配置文件中加载上下文定义;
FileSystemXmlApplicationContext:读取文件系统下的xml配置文件并加载上下文定义;
XmlWebApplicationContext:读物web应用下的配置文件并装载上下文定义;
6、bean生命周期
1、spring对bean进行实例化
2、spring将值和bean的引用注入进bean对应的属性中。
3、如果bean实现了BeanNameAsare接口,spring将bean的id传递给setBeanName()接口方法
10、如果bean实现了DisposableBean接口,spring将调用它的destroy()方法。