Spring基本知识
Posted 一叶一落秋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring基本知识相关的知识,希望对你有一定的参考价值。
- 什么是Spring框架?Spring有哪些基本模块?
- Spring框架是一个为Java应用程序开开发提供了综合、广泛的基本性支持的Java平台
- Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。
- Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。
- Spring框架至今已集成20多个模块。这些模块主要被分为如下图所示的核心容器、数据访问/集成、Web、AOP(面向切面)、工具、消息和测试模块。
- 使用Spring框架能带来哪些好处?
- Dependency Injection(DI)方法使得构造器和JavaBean properties文件中的依赖关系一目了然。
- 与EJB容器相比较,IOC容器更加趋向于轻量级。这样一来IOC容器在有限的内存和CPU资源的情况在进行应用程序的开发和发布就变得十分有利。
- Spring框是按照模块的形式来组织的。由包和类的编号就可以看出其所属的模块,开发者仅仅需要选用他们需要的模块即可。
- Spring的Web框架亦是一个精心设计的Web MVC框架,未开发者们在Web框架选择上提供了一个除了主流框架比如Struts、过度设计的、不流行web框架的以外的有利选项。
- Spring提供了一个便捷的事务管理接口,适用于小型的本地事务处理(比如在单DB的环境下)和复杂的共同事务处理。
- 什么是控制反转(IOC)?什么是依赖注入?
- 控制反转是应用于软件工程领域中的,在运行时被装配器来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的;在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实例化方式还可以将对象之间的关联关系抽象化。而绑定的过程通过依赖注入来实现的。
- 控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在我们实际工作中起到了有效的作用。
- 依赖注入是在编译阶段尚未知所需的功能是来自哪个类的情况下,将其他对象所依赖的功能对象实例化的模式。这就需要一种机制来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下哎,框架又怎么知道要创建哪个组件?
- 在Java中依赖注入有以下三种实现方式:
- 构造器注入
- Setter方法注入
- 接口注入
- BeanFactory和ApplicationContext有什么区别?
- BeanFactory可以理解为含有bean集合的工厂类。BeanFactory包含了各种bean的定义,以便在接收到客户端请求时将对应的bean实例化。
- BeanFactory还能在实例化对象时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法和销毁方法。
- 从表明上看ApplicationContext如同BeanFactory一样具有bean定义、bena关联关系的设置,根据请求分发bean的功能。但ApplicationContext在此基础上还提供了其他的功能。
- 提供了支持国际化的文本消息
- 统一的资源文件读取方式
- 已在监听器中注册的bean事件
- 三种常见的ApplicationContext实现方式
- XmlBeanFactory:引用资源。Resource resource = new ClassPathResource("appcontext.xml"); BeanFactory factory = new XmlBeanFactory(resource);
- ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。ApplicationContext context = new ClassPathXmlApplicationContext(“application.xml”);
- FileSystemXmlApplicationContext:由文件系统中的XML配置文件读取上下问。ApplicationContext context = new FileSystemXmlApplicationContext(“application.xml”);
- XmlWebApplicationContext:由Web应用的XML文件读取上下文。ServletContext servletContext = request.getSession().getServletContext(); ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
- Spring提供了几种配置方式来设置元数据?
- 基于XML的配置
- 基本注解的配置
- 基于JAVA的配置
- 如何使用XML配置的方式配置Spring?
- 在Spring框架中,依赖和服务需要在专门的配置文件来实现,这些配置文件通常以beans开头,然后一系列的bean定义和专门的应用配置选项组成。
- Spring XML配置的主要目的是使所有的Spring组件都可以用XML文件的格式来进行配置。
- 如何使用基于JAVA配置的方式配置Spring
- Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IOC容器来管理。
- @Bean声明所起到的作用于元素类似。被@Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。被@Configuration声明的类可以通过在同一个类的内部调用@Bean方法来设置嵌入bean的依赖关系。
@Configuration public class AppConfig{ @Bean public MyService myService() { return new MyServiceImpl(); } }
上面的@Bean配置等价XML配置如下
<beans> <bean id="myService" class="com.services.MyServiceImpl"/> </beans>
- 怎么用注解的方式配置Spring?
- 将bean描述转移到组件类的内部,只需要在相关类上、方法上或者字段申明上使用注解即可。注解注入将会被容器在XML注入之前被处理,所以后者会覆盖掉前者对于用一属性的处理结果。
- 注解装配在Spring中默认是关闭的。所以需要在Spring文件中配置一下才能使用基于注解的装配模式。
<beans> <context:annotation-config/> </beans>
- 比较重要的注解类型
- @Required:该注解用于设值方法
- @Autowired:该注解应用于有值设置方法、非设值方法、构造函数和变量。
- @Qualifier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。
- @Resourece
- Spring Bean的生命周期?
- 在一个bea实例被初始话时,需要执行一系列的初始化操作以打到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。
- Spring bean factory负责管理在Spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。
- 初始化之后调用的回调方法
- 销毁之前调用的回调方法
- Spring框架提供了一下四种方式来管理bean的生命周期事件
- InitalizingBean和DisposableBean回调接口
- 针对特殊行为的其他Aware接口
- Bean配置文件中的Custom init()方法和destory()方法。
- @PostConstruct和@PreDestory注解方式
- Spring Bean作用域之间的区别?
- Spring容器中的bean可以分为5个范围。
- singleton:这种bean范围是默认的,这种范围确保不管接收到多少个请求,每个容器只有一个bean的实例,单例的模式由bean factory自身来维护。
- prototype:原型范围与单例范围相反,为每一个bean请求提供一个实例。
- request:在请求bean范围内每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
- Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
- global-session
- Spring容器中的bean可以分为5个范围。
- 什么是Spring inner beans?
- 在Spring框架中,无论何时bean被使用时,当仅被调用了一个属性。一个明智的做法是将这个bean申明为内部的bean。内部bean可以使用setter注入“属性”和构造方法注入“构造参数”的方式来实现。
- Spring框架中的单例Beans是线程安装的吗?
- Spring框架并没有对单例bean进行任何多线程的封装处理。但是大部分的Spring bean并没有可变的状态(比如Service类和Dao类),所以在某种程度上来说Spring的单例bean是线程安全的。
- 如何在Spring中注入一个Java集合?
- list标签用来装配可重复的list值。
- set标签用于装备没有重复的set值
- map标签可用来注入键和值可以为任意类型的键值对。
- props标签支持注入建和值都是字符串类型的键值对。
<beans> <!-- Definition for javaCollection --> <bean id="javaCollection" class="com.gupaoedu.JavaCollection"> <!-- java.util.List --> <property name="customList"> <list> <value>INDIA</value> <value>Pakistan</value> <value>USA</value> <value>UK</value> </list> </property> <!-- java.util.Set --> <property name="customSet"> <set> <value>INDIA</value> <value>Pakistan</value> <value>USA</value> <value>UK</value> </set> </property> <!-- java.util.Map --> <property name="customMap"> <map> <entry key="1" value="INDIA"/> <entry key="2" value="Pakistan"/> <entry key="3" value="USA"/> <entry key="4" value="UK"/> </map> </property> <!-- java.util.Properties --> <property name="customProperies"> <props> <prop key="admin">[email protected]</prop> <prop key="support">[email protected]</prop> </props> </property> </bean> </beans>
以上是关于Spring基本知识的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
Spring boot:thymeleaf 没有正确渲染片段
What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段
Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]
解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段