Spring面试题总结

1 什么是Spring框架?spring框架有哪些主要模块?

Spring框架是一个为java应用程序的开发提供了综合、广泛的基础性支出的java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring本身也是按照设计模式打造的,是分层的JavaSE/EE full-stack 轻量级开源框架,JavaEE在服务器端中分为三层(web层【表现层】,业务逻辑层,数据访问层【集成层,持久层】),spring包含了javaee三层的每一层的解决方案(一站式)1 web层(表现层):SpringMvc  2业务层:SpringBean的管理 AOP 事务管理   3持久层:SpringJDBCTemplate,ORM模块(整合其它持久层框架)这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring如何在后台进行工作的、

 Spring框架至今已经集合成了20多个模块。这些模块主要被分为如下图所示的核心容器、数据访问/集成,web、AOP、工具、消息和测试模块。

http://static.codeceo.com/images/2015/04/3d0f7edba3a9b3689a28e9243f052ab5.png

2使用spring框架能带来哪些好处?

1方便解耦,简化开发

  Spring是一个大工厂,可以将所有对象的创建和依赖关系维护,交给Spring来管理。

2AOP编程的支持

  Spring提供面向切面的编程,可以方便得实现对程序进行权限拦截、运行监控等功能。

3声明式事务的支持

只需要通过配置就可以完成对事物的管理,不需要手动编程。

4方便程序的测试

Spring支持对  Junit4的支持,可以通过注解方便的测试Spring程序

5方便集合各种优秀框架

Spring不排斥各种优秀开源框架,其内部提供了对各种优秀框架(如:Struts、hibernate、MyBatis、Quatrz等)的直接支持

6降低JavaEE API的使用难度

Spring对JAvaEE中开发难度比较大的一些API(JDBC JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。

3什么是控制反转(IOC)?什么是依赖注入?

IoC=Inversion of Control 就是有容器控制程序之间的(依赖)关系,而非传统实现中,有代码直接操纵。这就是控制反转的概念:(依赖)控制权(对象的创建有获取)由应用代码转移到了外部容器,控制权的转移,是所谓的反转。

依赖注入:是在编译阶段尚未知所需的功能是来自哪个类的情况下,将其他对象依赖的功能对象实例化的模式。

这就需要一种机制来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础,否则在组件不受框架控制的情况下,框架怎么知道创建哪个组件?

在java中依赖注入有三种方式:

1 构造器注入

2 Setter方法注入

3 接口注入

Iteye的开涛对Spring框架的IOC的理解: http://jinnianshilongnian.iteye.com/blog/1413846

4请解释一下Spring中的IOC?

Spring中的org.springframework.beans 包和ordg.springframework.context 包 构成了spring框架 ioC容器的基础

BeanFactory 接口提供了一个先进的配置机制,使得任何对象的配置成为可能。ApplicationContext 接口对BeanFactory 进行了扩展,在BeanFactory的基础上添加了其他功能,比如Spring的AOP更容易集成,也提供了处理message resource机制(用于处理国际化)、时间传播以及应用层的特别配置,比如针对web应用层的WebApplicationContext.

org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具体实现,用来包装盒管理各种bean。BeanfFactory接口是Spring IoC容器的核心接口。

5 BeanFactory和ApplicationContext有什么区别?

BeanFactory可以理解为含有Bean集合的工厂类。BeanFactory包含了bean的定义,以便在接受到客户端请求时将相应的Bean实例化。

BeanFactory还能在实例化对象时生成协作类之间的关系,此举将bean自身和bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(  initialization methods)和销毁方法(destruction methods)。

、从表面看,ApplicationContext如同BeanFactory一样具有定义Bean、bean关联关系的设置,根据请求发送bean的功能。但ApplicationContext在此基础上还具有如下功能:

1 提供支持国际化的文本信息

2统一的资源文件读取方式

3已在监听器中注册的bean的事件

以下是较为常见的ApplicationContext实现方式:

1、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。

ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);

2、FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。

ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);

3、XmlWebApplicationContext:由Web应用的XML文件读取上下文。

6spring有几种配置方式?

1基于XML的配置

2基于注解的配置

3基于java的配置

7如何用基于xml配置的方式配置Spring?

在Spring框架中,依赖和服务需要在专门的配置文件来实现,我常用的XML格式的配置文件。这些配置文件的格式通常用<beans>开头,然后一系列的bean定义和专门的应用配置选项组成。

8如何用基于Java配置的方式配置Spring?(bean的注解)

•    @Configuration 指定POJO类为Spring提供Bean定义信息

•    @Bean 提供一个Bean定义信息

9、怎样用注解的方式配置Spring?

开发步骤:

第一步编写HelloService


第二步编写配置文件


 

l  除了@Component外,Spring提供了3个功能基本和@Component等效的注解

•    @Repository 用于对DAO实现类进行标注

•    @Service 用于对Service实现类进行标注

•    @Controller 用于对Controller实现类进行标注

•    这三个注解是为了让标注类本身的用途清晰,Spring已对其增强

4.1简单属性的注入

1) @Value

 @Value  注解 完成属性的注入


4.2复杂属性的注入

1)@Autowired

l  @Autowired 默认按照类型进行注入

•    如果存在两个相同Bean类型相同,则按照名称注入

l  @Autowired注入时可以针对成员变量或者setter方法

完成Bean自动装配    按照类型注入 默认注入不成功会报错


 

是按照数据类型进行注入会查找bean的id为personDao的bean如果找不到默认会报错,


通过改变默认行为如果找不到对应的bean会是空



2)@Qualifier

l  使用@Qualifier指定注入Bean的名称

根据指定的bean的名字查询而不是根据数据类型查询


3)@Resource

 

l  @ResourceSpring提供对JSR-250中定义@Resource标准注解的支持

l  @Resource和@Autowired注解功能相似

 

    @Autowired

@Qualifier("userDao")

Private UserDao userDAO;

等价于

@Resource(name=”userDAO”)

Private UserDAO userDAO;

10、请解释Spring Bean的生命周期?

pring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。

Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。

  1. 初始化之后调用的回调方法。
  2. 销毁之前调用的回调方法。

Spring框架提供了以下四种方式来管理bean的生命周期事件:

  • InitializingBean和DisposableBean回调接口
  • 针对特殊行为的其他Aware接口
  • Bean配置文件中的Custom init()方法和destroy()方法
  • @PostConstruct和@PreDestroy注解方式

11、Spring Bean的作用域之间有什么区别?

Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:

  1. singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。
  2. prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。
  3. request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
  4. Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
  5. global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。
全局作用域与Servlet中的session作用域效果相同。

12、什么是Spring inner beans?

在Spring框架中,无论何时bean被使用时,当仅被调用了一个属性。一个明智的做法是将这个bean声明为内部bean。内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现

比如,在我们的应用程序中,一个Customer类引用了一个Person类,我们的要做的是创建一个Person的实例,然后在Customer内部使用。

public class Customer
{
    private Person person;

    //Setters and Getters
}
public class Person
{
    private String name;
    private String address;
    private int age;

    //Setters and Getters
}

内部bean的声明方式如下:

<bean id="CustomerBean" class="com.howtodoinjava.common.Customer">
    <property name="person">
        <!-- This is inner bean -->
        <bean class="com.howtodoinjava.common.Person">
            <property name="name" value="lokesh" />
            <property name="address" value="India" />
            <property name="age" value="34" />
        </bean>
    </property>
</bean>

13、Spring框架中的单例Beans是线程安全的么?

Spring框架并没有对单例bean进行任何多线程的分装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如service类和Dao类),所有在某种程度上可以说Spring 的单例bean是线程安全的。如果你的bean有多种状态的话(比如View model对象),就需要自行保证线程安全。

最浅显的解决办法就是将多态bean的作用域由“singleton”变成“prototype”。

14、请举例说明如何在Spring中注入一个Java Collection?

Spring提供了以下四种集合类的配置元素:

  • <list> :   该标签用来装配可重复的list值。
  • <set> :    该标签用来装配没有重复的set值。
  • <map>:   该标签可用来注入键和值可以为任何类型的键值对。
  • <props> : 该标签支持注入键和值都是字符串类型的键值对。

下面看一下具体的例子:

<beans>

   <!-- Definition for javaCollection -->
   <bean id="javaCollection" class="com.howtodoinjava.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">admin@nospam.com</prop>
            <prop key="support">support@nospam.com</prop>
        </props>
    </property>

   </bean>

</beans>

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
【6层】4837.9平米六层框架综合办公楼(含计算书、建筑、结构图纸) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值