Spring面试题

1.Spring是什么?

spring是一个轻量级的IOC和aop的容器框架,是为Java程序提供基础性服务的框架,用于简化程序的开发。

2.Spring的优点?

spring属于低侵入式设计,代码的污染低
spring的ioc称之为控制反转,简答的来说就是将对象的创建以及对象生命周期的管理交给了spring框架来管理,
从此在开发的过程中,不在需要关注这些细节,而是在需要的时候有spring框架来管理维护
spring的di称之为依赖注入,在创建对象的过程中spring可以根据对象的属性进行设置,减少了组建的耦合度
spring的aop技术,面向切面编程,实现业务和非业务功能的解耦。

3.springIOC的实现原理?

在初始化spring容器的时候,spring会根据xml配置文件进行初始化,当初始化到bean标签的时候,会根据其中的class
属性指定的类的全路径名称,通过反射机制创建该类的对象,并将该对象放入内置的map中管理,其中,键就是bean中的
id属性,值就是该对象,之后通过getBean方法来从容器中获取对象的时候,其实就是根据传入的条件在内置的map中匹配
如果有,则将该键值对中保存的对象返回,如果没有就会抛出异常。
由此可以知道,多次获取同一个id的bean,得到的是同一个对象
IOC获取对象有两种方式:传入id值,传入class类型
4.spring创建对象的方式
a.通过无参构造创建对象,spring容器在初始化的时候,通过反射得到字节码对象,通过newInstance创建对象,这种请求就要求类必须有无参构造。
b.通过静态工厂创建对象,很多时候,我们类无法通过无参构造创建的,此时可以使用静态工厂创建对象,

public class CalendarStaticFactory {
        public static Calendar getCalendar(){
                return Calendar.getInstance();
        }
}

<?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-3.2.xsd"> 
<bean id="calendar"  class="cn.factory.CalendarStaticFactory" factory-method="getCalendar"></bean>
</beans>

c.实例工厂也可以解决无法通过无参构造创建的问题,只不过提供的方法不是静态的,spring需要先创建出实例工厂的对象,在调用实例工厂的对象的普通方法来创建对象

public class CalendarFactory {
        public Calendar getCalendar(){
                return Calendar.getInstance();
        }
}

<?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-3.2.xsd">
        <bean id="calendarFactory"  class="cn.factory.CalendarFactory"></bean>
        <bean id="calendar" factory-bean="calendarFactory" factory-method="getCalendar"/>
</beans>

d.Spring工厂创建对象,spring内置类工厂接口,也可以通过实现接口来开发spring工厂,实现接口会重写的三个方法

5.单例和多例

spring容器管理的bean在默认的时候是单例的,一个bean只会创建一个对象,存在内置map中,之后无论获取多少次该bean,都会返回同一个对象,减少了对象的创建,从而减少了内存的消耗,scope控制当前bean的创建模式singleton为单例,prototype代表多例。

6.生命周期

bean的单例:bean在单例模式下,spring容器启动时解析xml反向该bean标签后,直接创建该bean的对象存入内部map中保存,此后,无论调用多少次getbean()获取该bean都是从map中获取对象返回,一致是一个对象,此对象一直被spring容器持有,直到容器退出时,随着容器的退出对象呗销毁。
bean的多例模式:bean在多例模式下,spring容器启动时解析xml反向该bean标签后,只是将该bean进行管理,并不会创建对象,此后每次使用getbean获取时,spring都会重新创建该对象返回,每一次都是新的对象,这个对象spring容器并不会持有,什么时候销毁取决于对象的用户自己什么时候销毁该对象。

7.懒加载机制

当bean非常多的时候,spring需要在启动的时候花费大量的时间来创建bean也花费大量空间来存储,但这些bean可能很久都不会用上,这种启动在时间上和空间上显得非常不值得,所以spring使用了懒加载机制,不在启动的时候立即创建,而是在后续第一次用到的时候创建,减少在启动过程中对时间和内存的消耗,只对单例有用,多例模式没有意义。
为指定的bean配置懒加载
<bean id="cart" class="cn.beans.Cart" lazy-init="true"></bean>
全局配置懒加载:default-lazy-init="true"

8.springIOC(DI)

set方法进行注入
通过构造方法传入并设置对象的属性

9.Spring常用注解

@Component @Value @Autowired
@Scope(value=“prototype”) 多例模式
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Lazy 懒加载
@PostConstruct在bean对应的类中,修饰某个方法 将该方法声明为初始化方法,对象创建之后立即执行
@PreDestory 在bean对应的类中 修饰某个方法 将该方法声明为销毁的方法,对象销毁之前调用的方法
@Controller 一般用来web层
@Service 一般用在Service层
@Repository 用在dao层
@Aspect 将制定的类标志为一个切面
@Before 前置通知 @Around 环绕通知 @AfterReturning 后置通知 @AfterThrowing 异常通知 @After 最终通知

10.Spring AOP

面向切面编程 可以在层与层之间增加一个可编程的切面,用来将功能型代码提取到切面中统一处理,有助于实现高内聚的特性。 在业务系统里除了要实现业务功能之外,还要实现如权限拦截、性能监控、事务管理等非业务功能。通常的作法是非业务的代码穿插在业务代码中,从而导致了业务组件与非业务组件的耦合。AOP面向切面编程,就是将这些分散在各个业务逻辑代码中的非业务代码, 通过横向切割的方式抽取到一个独立的模块中,从而实现业务组件与非业务组件的解耦

11.springAOP中的基本概念

连接点:层与层之间调用的过程中,调用目标层中的方法的过程就称之为连接点
切入点:在连接点的基础上 增加切入规则,选择出需要进行增强的连接点,这些基于切入规则选出来的连接点,就称之为切入点
切面:当spring拦截下切入点后,将这些切入点交给处理类进行功能的增强,这个处理类就是切面
通知:切面类中需要有处理切入点的方法,这些防范称之为通知
目标对象:就是真正希望被访问到的对象。spring底层的动态代理对他进行了代理,具体能不能真正访问到目标对象,或者在之前和之后做一些额外的操作,取决于切面

12.Spring的五大通知类型

前置通知:在目标方法执行前执行的通知 记录日志
环绕通知:在目标方法执行之前和之后都可以执行额外的代码通知,必须显示的调用目标方法,否则目标方法不会执行,环绕通知需要返回返回值,否则真正调用者将拿不到返回值 控制事务,权限控制
后置通知:在目标方法执行之后执行的通知 记录日志
异常通知:在目标方法抛出异常时执行的通知 异常处理 控制事务
最终通知:在目标方法执行之后执行的通知,最终通知无论如何都会在目标方法调用过后执行,即使目标方法没哟正常的执行完成 记录日志

13.SpringAOP原理

Spring会在用户获取对象时,生成目标对象的代理对象,之后根据切入点规则,匹配用户连接点,得到切入点,当切入点被调用的时候,不会直接去找目标对象,而是通过代理对象拦截之后交给切面中指定的通知来进行增强。
Spring自动为目标生成代理对象,默认情况下,如果对象实现过接口,则采用java的动态代理机制,如果对象没有实现过接口,则采用cglib动态代理,开发中可以进行配置,强制使用cglib动态代理

 <aop:config proxy-target-class="true">

14.代理设计模式

静态代理模式:代理者和被代理者事项同一个接口
动态代理:jdk内置的动态代理:不需要像静态代理那样被代理的方法都要实现一遍,只需要在回调函数中进行处理就可以了,而内置的动态代理是基于接口进行的,受制于要代理的方法是否有接口的支持
cglib动态代理原理是 生成的动态代理是被代理者的子类,所以代理者具有和父类相同的方法,从而实现代理

15.ThreadLocal

是一种传递数据的技术,利用线程对象的map来传递数据,从而实现程序的上下游传递数据,可以实现隐式的参数传递,每个线程都有各自的Map,不会存在多线程并发安全的问题
ThreadLocalMap是ThreadLocal类的一个静态内部类,它实现了键值对的设置和获取(对比Map对象来理解),每个线程中都有一个独立的ThreadLocalMap副本,它所存储的值,只能被当前线程读取和修改。ThreadLocal类通过操作每一个线程特有的ThreadLocalMap副本,从而实现了变量访问在不同线程中的隔离。因为每个线程的变量都是自己特有的,完全不会有并发错误。还有一点就是,ThreadLocalMap存储的键值对中的键是this对象指向的ThreadLocal对象,而值就是你所设置的对象了。

16.Spring 声明式事务处理

REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 required
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 supports
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务
spring内置的事务策略,当抛出的异常时运行时异常的时候,才会回滚,其他异常不会滚
可以设置成 rollback-for="java.lang.Throwable"

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值