单例Bean和单例模式
- 单例Bean:对于一个类来说,他在当期IOC容器中,就是单独的一个对象,每次进行对Bean实例化的时候,总是调用的同一个对象。
- 单例模式:在同一个JVM中,单例Bean就是单例模式,但是在实例化的时候有不同的方法,比如懒汉模式等。(这个我不大理解,希望大佬指教)
spring的核心
- AOP
- 控制反转
- IOC容器
Bean的实例化和初始化有什么区别
- Bean的实例化:其实就是new Object()过程,但是在Spring中交给Spring进行。此时会先通过反射来执行构造方法创建一个对应Bean的Java对像,这就是实例化过程。
- Bean的初始化:Bean实例化后会创建一个Java对象,Java对象中会有一个afterPropertiesSet(),Bean初始化的时候会调用这个方法,可以通过这个方法对创建好的Java对象进行属性检测等操作。
SpringAop怎么实现的
- Aop使用场景:在项目开发结束后,如果需要对业务层整体进行日志记载操作, 无法逐个对每个方法进行操作,费时费力,这时候,使用AOP面向切面编程,使用代理对象,实现日志的操作。
Spring中的事务是怎么实现的
- 概念:
在进行增删改操作的时候,需要对不同表进行操作,需要在业务层多次调用持久层和数据库进行交互,但是可能会出现一个sql语句成功但是另外一个不成功,这会出现数据不匹配的情况,此时需要使用spring事务,对有多个操作需要全部完成,但是只完成其中几个这种情况进行回滚操作。 - 实现
通常需要再业务层对应的方法上加上@Transactional注解。
你是怎么理解spring事务的传播机制
- 对于事务传播,可以通过设置@Transactional(Propagation)
REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
spring中常用的注解以及其实现过程
- @SpringbootApplication:复合注解
1. @EnableAutoConfiguration:自动配置注解,Spring进行自动配置操作。
2. @ComponentScan
- 作用:扫描并把符合条件的类注册bean容器中。例如带有:@Component、@Service、@Controller和@Repository都会被注册到容器中。
- 用法:
@ComponentScan({'需要扫描的文件的路径'})
//在启动类运行的时候,就可以对相应bean进行注册。
public class Component{
}
注解的内容
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class) //@1
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;
ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
String resourcePattern() default "**/*.class";
boolean useDefaultFilters() default true;
Filter[] includeFilters() default {};
Filter[] excludeFilters() default {};
boolean lazyInit() default false;
}
Java中==和equals的区别
- ==的用法时:对于基础数据类型,只需要判断数值是否相同;对于引用型数据类型,则需要判断当前是否为同一对象。
- equals的用法:无论是基本数据类型还是引用型数据类型都只进行内容的比对。