一、spring框架中的bean是单例的吗?线程安全吗?
1、单例:spring框架bean是单例的,因为spring框架中注解@Scope默认是singleton,单例的,当然如果把默认的值改为prototype的话,一个bean就会有多个实例;
2、线程安全:不是线程安全的,因为一般在spring的bean中注入的都是无状态的对象(不能修改的对象如:@Autowired修饰的对象),这种是线程安全的,但是如果在bean中定义了可修改的成员变量,就会存在线程安全的问题,需要加锁处理
二、AOP和IOC怎么理解
AOP:面向切面编程,主要是将与业务无关的逻辑给剥离出来统一处理,以达到解藕减少重复代码的目的。应用场景:日志的统一处理,方法的耗时处理等
格式如下:1、定义切入点,2、定义切面类环绕通知
* /*
* 五个注解:
* @Before:在目标方法之前运行; 前置通知
* @After:在目标方法结束之后运行; 后置通知
* @AfterReturing:在目标方法正常返回之后; 返回通知
* @AfterThrowing:在目标方法抛出异常之后运行; 异常通知
* @Around:环绕 环绕通知
* */
*/
@Pointcut("execution(xxxx ")
private void testPoint() {
}
/**
* 方法之前执行,日志打印请求信息
*
* @param joinPoint joinPoint
*/
@Around("testPoint()")
public Object timeAround(ProceedingJoinPoint joinPoint) throws Throwable {
..........
处理逻辑
return obj;
}
IOC:控制反转、依赖注入
在这之前先说明下什么是ioc容器,所谓ioc容器就是一个map,存放各种对象(比如:xml配置的bean节点、@controller、@component),在项目启动时会读取配置文件的bean节点,根据全限定类名使用反射创建对象放在ioc容器中。在我们使用对象时,通过DI依赖注入,可以获取对象
控制反转:在没有ioc容器前,我们开发过程中如果A类依赖B类时,需要自己主动创建一个B类的对象,但是有了IOC这个创建的过过程交给了IOC容器,在使用B对象时,通过依赖注入注入B对象既可。这个过程就是控制反转
依赖注入:控制被反转后,获取对象的方式由自己主动创建变为容器主动注入。依赖注入是实现ioc的方式,ioc容器在运行期间,动态地将依赖注入给对象
三、spring中失误失效的场景有哪些
1、异常捕获处理
因为异常捕获后自己处理,没有抛出
解决方法:手动抛出异常
2、抛出检查异常
因为spring中只会回滚非检查异常
解决办法: 注解中指定回滚的异常类型 @Transactional(rollbackFor = Exception.class)
3、非public方法
ps:什么事检查异常?
简单来说,就是编译器编译时提示你必须try catch或者throw的异常就是检查异常,除了RuntimeException与其子类,以及错误(Error),其他的都是检查异常;相对应地非检查异常就是在运行时抛出的异常,比如空指针,数组越界等就是非检查异常。
四、了解过spring bean的生命周期吗?
借助网上现有的流程图说吧。
1、容器启动后,先实例化一个bean对象
2、为bean设置相关的属性和依赖
3、初始化bean,这一步包括了途中3-7,处理Aware接口和前置处理,5-6进行初始化,7是初始化的后置处理
4、销毁bean
五、什么是bean的循环依赖
循环依赖:循环依赖其实就是循环引用,也就是两个或多个bean对象相互持有对方,最终形成闭环。比如A依赖B,B同时依赖A
循环依赖在spring中是允许存在的,spring通过三级缓存来解决循环依赖的问题。
1、一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
2、二级缓存:缓存早期生命周期没有走完的bean对象
3、三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象
六、springboot自动配置的原理
在springboot项目的引导类上有一个注解@SpringBootApplication,这个注解封装了三个注解,如下
@SpringBootConfiguration 里面其实就是@Configuration,作用与@Configuration相同,就是声明当前也是一个配置类
@EnableAutoConfiguration 开启自动配置,是springboot实现自动化配置的核心注解
@ComponentScan 包扫描,默认扫描当前引导类所在包以及子包
springboot自动配置核心是通过@EnableAutoConfiguration实现,通过@import注解注入配置选择器,配置选择器会读取该项目引jar的classpath路径下的META-INF/spring.factories文件中的所有配置的类的全类名。在这些配置类中所定义的bean会根据条件注解所指定的条件是否需要将其倒入到spring容器中。
七、spring中常用的注解有哪些?
@Component :用在类上实例化bean,其引申出来三个常用的注解 @controller 用于标注一个控制器组件 @service 用在业务实现类上,@repository 用在dao层组件类上,@controller ,@repository @service这三个注解本质都是@Component ,只是用于标注的类不同
经常与@Component做对比的还有@Configuration ,其主要的区别在于@Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
@Autowired&@resource:用在字段上根据类型依赖注入,区别在于前者是按照类型(byType)装配依赖对象,如果想要按照名称(ByName)装配依赖对象,需要结合@qualifier注解一起使用;而后者不是spring框架中的注解,是按照名称(ByName)注入