JAVA面试八股文-基础篇(spring)

冰冻三尺非一日之寒


Spring是什么

Spring是轻量级面向切面的容器框架

  • 轻量级,开销低
  • 通过IOC的技术达到低耦合
  • 提供了面向切面的丰富支持,允许通过分离应用的业务逻辑系统内聚性业务开发。
  • 包含并管理应用管理对象Bean的生命周期
  • 简单的组件配置

Spring有哪些常用的注入方式和注解

注入方式:

@Configruation+@Bean
配置类加方法
@Xml
节点使用 set 方式注入
节点使用 构造方法注入

<bean id="person" class="类文件名类路径">
		<property name="bowl" ref="bowl"></property>
	</bean>
<bean id="person" class="构造函数类路径">
		<constructor-arg name="bowl" ref="bowl"></constructor-arg>
	</bean>

工厂注入

public class BowlFactory {
	public static final Bowl getBowl() {
		return new Bowl();
	}
}

<bean id="person" class="constxiong.interview.inject.Person">
		<constructor-arg name="bowl" ref="bowl"></constructor-arg>
	</bean>

常用的注解:
@Compont
@Restcontroller
@Autowried
@Bean
@Service
@Repository
@Qualifier 指定Bean名称

谈谈IOC

控制反转,即把我们自己创建的类的权利交由外部容器负责,负责类的生命周期。

谈谈AOP

AOP基础

前置通知@Beafore,后置通知@Afater,最后通知@AfaterReturning,异常通知@AfaterThrowing,环绕通知@Around

自定义aop-aspectJ:

切面(Aspect)
排除业务代码外的代码,列入转账,安全检查,日志,缓存,权限等…把项目切一刀,公共逻辑交由AOP管理,业务逻辑交给业务类管理好比切一刀西瓜,只用关注当前切面,不用关注西瓜其他部分

连接点(join point)
连接点指可以被切面织入的具体方法。通常业务接口中的方法均为连接点。

切入点(Pointcut)
切入点指声明的一个或多个连接点的集合。通过切入点指定一组方法。被标记为final的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。

目标对象(Target)
目标对象指将要被增强的对象。即包含主业务逻辑的类的对象。目标类的对象若被增强,则该类称为目标类,该类对象称为目标对象。当然,不被增强,也就无所谓目标不目标了。

AOP

面向切面:在多个项目组件之中需要对项目进行增强则可以使用AOP,对代码无侵入的增加并实现了公共逻辑的统一处理,比如日志报错等。

BeanFactory和ApplicationContext的区别

都是Bean容器。

1.Application是Bean的子接口
2.Application提供了更全面的功能

  • 继承MessageSource,支持国际化
  • 统一的资源文件访问形式
  • 提供在监听器上注册Bean事件
  • 可以同时配置多个配置文件
  • 注册多个上下文

BeanFactory是延迟加载的,只有在getBean的时候才会将Bean给创建,也就是说在getbean的时候可能有会发现属性没有注入等报错

ApplicationContext是程序启动的时候一次性全部加载。

描述一下Spring的生命周期

1.解析类去定义Beandefintion解析Bean定义。
2.如果有多个构造方法则要推断构造方法
3.得到构造方法后,实例化得到一个对象
4.对加了@Autowired属性注解的进行填充注入
5.回调扩展方法Aware方法,比如BeanNameAware,BeanFactoryAware
6.调用BeanPostprocesser初始化前方法
7.调用intigerBean初始化方法
8.调用BeanPostProcesser的初始化后方法,在这里进行AOP
9.如果当前创建的是单例Bean会放入单例池
10.使用Bean
11.spring容器关闭时调用disposableBean中的distory()方法

spring的作用域

singleton:默认的,全部单例模式,生命周期和IOC容器一致。

prototype:为每一个Bean提供一个实例,在每次getBean()注入的时候都是一个新的对象。

request:bean定义为在每次请求的时候创建一个实例。单个请求使用这个对象。

session:确保每个session有一个实例,session过期后,实例也会消失

application:bean定义ServletContext中一个生命周期中单列对象,定义在application中就可以跨容器。

websocket:bean定义websocket:bean中一个生命周期中单列对象。

spring中的单例Bean是线程安全的么。

不是线程的安全的。

如果不想线程共享,可以使用threadlocal,线程副本变量。DAO操作数据库维护线程副本connection就是使用的threadLocal

如果需要线程之间的共享,就需要考虑synchronize,voiletor,CAS,自旋锁等方法保证线程安全。

spring中的常用的工厂模式

装饰器,工厂,代理,适配器,观察者(listener),策略模式

spring中设置事务的方式有几种

1.调用transcation类中的api,操作数据库的事务、
2.使用注解@transcation,生成代理类,将事务自动提交设置为false,执行业务后没有报错后继续执行。

事务有几种?

读未提交: 线程A在修改数据,线程B读取到了未修改的数据。脏读。

读已提交: 需要等待线程A提交数据,线程B才可以读取。

可重复读" 可以任意时刻读我到我修改的数据,但是会引发幻读:2个线程同时读取到了为空,插入数据,这个时候就插入了2条数据。

**串行化 **:即每个操作需要等待上一个操作执行完成。

spring事务什么情况下会失效

1.使用this方法调用。只能是@Autowried注入事务才行。
2.方法不是public
3.事务不支持数据库
4.抛出的异常没有被定义,默认为runtimeException
5.没有被spring管理

什么是Bean的自动装配?有哪些方式

什么是Bean的自动装配: 无须在Spring配置文件中描述javaBean之间的依赖关系(如配置、)。IOC容器会自动建立javabean之间的关联关系。

手动装配: 需要定义javaBean直接的关系如下代码

  <bean id="customerDAO" class="com.hebeu.customer.dao.JdbcCustomerDAO"> 
    <property name="dataSource" ref="dataSource" /> 
  </bean> 

自动装配:需要写入Autowried

常见的自动装配:byname

<bean id="user" class="com.shw.User">
	<property name="name" >
		<value>小强</value>
	</property>
	<property name="age" >
		<value>25</value>
	</property>
	<property name="sex" >
		<value></value>
	</property>
</bean>
<bean autowire="byName" id="manger" class="com.shw.Manger"></bean>

bytype:根据类型进行装配
constructor:通过构造器进行装配
aotodetect:有构造器按构造器,没有按bytype

Spring,Spring-mvc,Spring-boot的区别

Spring是一个IOC容器吗,提供了AOP机制。

Spring-mvc是spring整合servlet,用于返回前端请求,进行路由等操作。

Spring-boot是一套快速开发工具包,简化了spring和spring-mvc的整合开发,约定俗成了一些配置文件。

Spring-mvc的工作流程

1)用户请求到前端控制器dispatcherservlet。
2)dispatcherservlet调用handlermapping控制处理器。
3)dispatcherservlet找到对应的处理器,拦截器等一并返回给handler。
4)dispatcherservlet调用handleradapter处理器适配器。
5)Handleradpater调用后端适配好的controller处理器
6)controller执行完返回对应的modelandview
7)handleradpater将得到的modelandview交给dispatcherservlet。
8)dispatcherservlet将modelandview传给视图解析器viewreslover视图解析器
9)viewreslover解析后返回对应的view
10)dispatcher对view进行数据渲染
11)dispatcher返回给用户

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值