版 | 商标 | 特征 |
---|---|---|
Spring2.5 | 该版本于2007年发布。它是第一个支持注释的版本。 | |
Spring3.0 | 该版本于2009年发布。它 充分利用了Java5中的改进功能, 并为JEE6提供了支持。 | |
Spring4.0 | 该版本于2013年发布。这是第一个为Java 8提供全面支持的版本。 | |
Spring5.0 | 该版本于2017年发布。支持JDK 9和Java EE 8 API版本。 |
大约有20个模块,它们被概括为核心容器,数据访问/集成,Web,AOP(面向方面的编程),检测和测试。
下面给出了很少的其他模块:
Spring配置文件是XML文件。该文件主要包含类信息。它 描述了这些类如何配置以及如何相互引入。但是,XML配置文件是冗长且更干净的。如果没有正确计划和编写,在大型项目中将变得非常难以管理。
Spring应用程序通常由以下组件组成:
Spring容器位于Spring框架的核心。容器 c处理对象,将它们连接在一起,对其进行配置并管理其整个生命周期。Spring容器利用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收要实例化,配置和组装对象的指令。可以通过XML,Java批注或Java代码提供此元数据。
在依赖注入中,您不必创建对象,而必须描述如何创建对象。您不会直接在代码中将组件和服务直接连接在一起,而是在配置文件中描述哪些组件需要哪些服务。IoC容器会将它们连接在一起。
在Spring Framework中,仅使用构造函数和setter注入。
构造函数注入 | setter注射 |
---|---|
没有部分注入。 | 可以进行部分注射。 |
它不会覆盖setter属性。 | 它覆盖了 构造函数属性。 |
如果进行了任何修改,它将创建一个新实例。 | 如果进行了任何修改,它将不会创建新实例。 |
它对许多 财产而言效果更好。 | 它对少数属性效果更好。 |
BeanFactory | ApplicationContext |
---|---|
它是在org.springframework.beans.factory中定义的接口。BeanFactory | 它是在org.springframework.context中定义的接口。ApplicationContext |
它使用延迟初始化 | 它使用急切/积极的初始化 |
它使用语法显式提供资源对象 | 它 自己创建和管理资源对象 |
它不支持国际化 | 支持国际化 |
它不支持基于注释的依赖 | 它支持基于注释的依赖 |
可以通过以下方式将配置元数据提供给Spring容器:
<bean id="studentbean" class="com.mushsoft.firstSpring.StudentBean">
<property name="name" value="欢迎关注Java架构师社区公众号"></property>
</bean>
<beans>
<context:annotation-config/>
<!-- bean definitions go here -->
</beans>
例如:
@Configuration
public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
Spring框架支持五个范围。他们是:
为了更好地理解它,请查看下图:
只有当一个bean用作另一个bean的属性时,才能将其声明为内部bean。为了定义bean,Spring的基于XML的配置元数据在或内部提供了元素的使用。内部bean始终是匿名的,并且始终以原型为范围。例如,假设我们有一个Student类引用Person类。在这里,我们将只创建一个Person类实例,并在Student中使用它。
这是一个Student类,后跟bean配置文件:
Student.java
public class Student{
private Person person;
//Setters and Getters
}
public class Person{
private String name;
private String address;
//Setters and Getters
}
}
studentbean.xml
<bean id="StudentBean" class="com.mushsoft.Student">
<property name="person">
<!--This is inner bean -->
<bean class="com.mushsoft.Person">
<property name="name" value="请关注"></property>
<property name="address" value="Java架构师社区"></property>
</bean>
</property>
</bean>
当在Spring容器中将bean组合在一起时,称为接线或bean接线。Spring容器需要知道需要哪些bean,以及在对bean进行接线时,容器应如何使用依赖注入将bean绑在一起。
Spring容器能够自动装配协作bean之间的关系。也就是说,可以通过检查BeanFactory的内容来让Spring自动为您的bean解析协作者。 Bean自动装配的不同模式是:
以下是自动装配可能会遇到的一些限制:
通过使用相关类,方法或字段声明上的注释,开发人员无需使用XML来描述bean的连接,而是将配置移入组件类本身。 它可以替代XML设置。 例如:
@Configuration
public class AnnotationConfig{
@Bean
public MyDemo myDemo(){
return new MyDemoImpll();
}
}
默认情况下,Spring容器中的注解。因此,要使用注解, 我们必须通过配置< context:annotation-config /> 元素在Spring配置文件中启用它 。 例如:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context">
<context:annotation-config/>
<beans ………… />
</beans>
@Component: 这将Java类标记为Bean。它是任何Spring管理的组件的通用构造型。spring的组件扫描机制现在可以拾取它并将其拉入应用程序上下文。
@Controller:这将一个类标记为Spring Web MVC控制器。标有它的Bean将自动导入到Dependency Injection容器中。
@Service:此批注是组件批注的特化。它不提供@Component注释以外的任何其他行为。您可以 在服务层类中使用@Service而不是@Component ,因为它可以更好地指定意图。
@Repository: 此注释是@Component注释的特化,具有相似的用途和功能。它为DAO提供了额外的好处。它将DAO导入DI容器, 并使未经检查的异常有资格转换为Spring DataAccessException。
@Required应用于bean属性设置器方法。该注释仅表明必须在配置时借助bean定义中的显式属性值或自动装配来填充受影响的bean属性。如果尚未填充受影响的bean属性,则容器将抛出BeanInitializationException。
例如:
public class Employee{
private String name;
@Required
public void setName(String name){
this.name=name;
}
public string getName(){
return name;
}
}
该 @Autowired 注解提供了在哪里以及如何自动装配应做更精确的控制。该批注用于将setter方法,构造函数,一个或多个具有任意名称或多个参数的方法自动连接到bean。默认情况下,它是类型驱动的注入。
例如:
public class Employee{
private String name;
@Autowired
public void setName(String name){
this.name=name;
}
public string getName(){
return name;
}
}
当您创建多个相同类型的bean,并且只想连接其中一个带有属性的bean时,可以使用 @Qualifier 注释和 @ Autowired 通过指定应该连接的确切bean来消除歧义。
例如,这里我们有两个类,分别是Employee和EmpAccount。在EmpAccount中,使用@Qualifier指定必须连接ID为emp1的bean。
Employee.java
public class Employee{
private String name;
@Autowired
public void setName(String name){
this.name=name;
}
public string getName(){
return name;
}
}
EmpAccount.java
public class EmpAccount{
private Employee emp;
@Autowired
@Qualifier(emp1)
public void showName(){
System.out.println("Employee name : "+emp.getName);
}
}
@RequestMapping批注用于将特定的HTTP请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可以在两个级别上应用:
Spring中的数据访问对象(DAO)支持使以一致的方式轻松使用JDBC,Hibernate或JDO等数据访问技术。这使人们可以轻松地在持久性技术之间切换。它还使您无需担心捕获每种技术特有的异常即可进行编码。
1)CleanupFailureDataAccessException 一项操作成功地执行,但在释放数据库资源时发生异常(例如,关闭一个Connection) 2)DataAccessResourceFailureException 数据访问资源彻底失败,例如不能连接数据库 3)DataIntegrityViolationException Insert或Update数据时违反了完整性,例如违反了惟一性限制 4)DataRetrievalFailureException 某些数据不能被检测到,例如不能通过关键字找到一条记录 5)DeadlockLoserDataAccessException 当前的操作因为死锁而失败 6)IncorrectUpdateSemanticsDataAccessException Update时发生某些没有预料到的情况,例如更改超过预期的记录数。当这个异常被抛出时,执行着的事务不会被回滚 7)InvalidDataAccessApiUsageException 一个数据访问的JAVA API没有正确使用,例如必须在执行前编译好的查询编译失败了 8)InvalidDataAccessResourceUsageException 错误使用数据访问资源,例如用错误的SQL语法访问关系型数据库 9)OptimisticLockingFailureException 乐观锁的失败。这将由ORM工具或用户的DAO实现抛出 10)TypemismatchDataAccessException Java类型和数据类型不匹配,例如试图把String类型插入到数据库的数值型字段中 11)UncategorizedDataAccessException 有错误发生,但无法归类到某一更为具体的异常中
JDBC API中存在的类如下:
Spring支持两种类型的事务管理。他们是:
面向方面的编程或AOP是一种编程技术,它使程序员可以模块化横切关注点或行为,从而跨越典型的职责划分。横切关注点的示例可以是日志记录和事务管理。AOP的核心是一个切面。它将可能影响多个类的行为封装到可重用的模块中。
Aspect是跨多个对象的关注模块化。事务管理是J2EE应用程序中横切关注的一个很好的例子。方面是使用常规类或在Spring Framework中使用@Aspect批注注释的常规类实现的。
程序执行期间的一个点称为JoinPoint,例如方法的执行或异常的处理。 在Spring AOP中,连接点始终代表方法的执行。
一个方面在特定联接点上 采取的操作称为建议。Spring AOP使用建议作为拦截器,在“连接点”周围维护一系列拦截器。
Spring AOP中的不同类型的建议是:
问题是我们希望在应用程序的特定模块中具有的行为。可以将其定义为我们要实现的功能。
跨领域关注点是适用于整个应用程序的关注点。这会影响整个应用程序。例如,日志记录,安全性和数据传输是应用程序几乎每个模块都需要考虑的问题,因此它们是跨领域的问题。
下图描述了不同的AOP实现:
SpringAOP | AspectJ AOP |
---|---|
通过代理进行运行时编织 | 通过AspectJ Java工具完成编译时的编织 |
它仅支持方法级别PointCut | 它支持字段级切入点 |
它是基于DTD的 | 它基于架构和注释配置 |
将建议应用于目标对象后创建的对象称为代理。对于客户端对象,目标对象和代理对象相同。
将方面与其他应用程序类型或对象链接以创建建议对象的过程称为Weaving。在Spring AOP中,编织是在运行时执行的。请参考下图:
Spring Web MVC框架提供了模型-视图-控制器体系结构,并准备使用可用于开发灵活且松散耦合的Web应用程序的组件。MVC模式有助于分离应用程序的不同方面,例如输入逻辑,业务逻辑和UI逻辑,同时在所有这些元素之间提供松散的耦合。
DispatcherServlet是Spring Web MVC框架的核心。它处理所有HTTP请求和响应。DispatcherServlet从配置文件接收处理程序映射的条目,并将请求转发给控制器。控制器然后返回模型和视图的对象。DispatcherServlet检查配置文件中的视图解析器条目,并调用指定的视图组件。
WebApplicationContext是纯ApplicationContext的扩展。它具有Web应用程序必需的一些额外功能。它在解析主题和确定与哪个Servlet关联的能力方面与普通的ApplicationContext不同。
控制器提供对应用程序行为的访问。这些行为通常是通过服务接口定义的。控制器解释用户输入并将其转换为模型,该模型由视图表示给用户。在Spring中,控制器以非常抽象的方式实现。它还使您能够创建各种各样的控制器。