Java框架
问题一:Spring框架中的单例bean是线程安全的吗?
看下图,不能被修改的成员变量就是无状态的类,无状态的类没有线程安全问题,所以在开发中尽量避免可修改的成员变量。
回答:不是线程安全的,Spring中有一个@Scope注解,默认的值是singleton,单例的,因为一般在Spring的bean中都是注入无状态的对象,没有线程安全问题;而如果在bean中定义了可修改的成员变量,则要考虑线程安全问题,可以使用多例或加锁来解决。
问题二:什么是AOP,有没有在项目中使用到AOP?Spring的事务如何实现?
将非业务逻辑代码(交叉业务)提取出来,形成一个独立的横向切面(将业务逻辑看成是纵向的),以横向交叉的方式应用到业务流程中,使代码的复用性增强,降低模块间的耦合度,同时提高系统的可维护性。
常见的AOP使用场景:
- 记录操作日志
- 缓存处理
- Spring中内置的事务处理
在后台开发中,都需要记录操作日志:
Spring的事务其本质是通过AOP实现的,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法后根据执行情况提交或者回滚事务。
列举一些重要的Spring模块?
Spring Core:Spring框架的核心,提供了控制反转(IoC)容器和依赖注入(DI)功能。
Spring Beans:定义了Spring的beans的配置方式,包括基于注解和XML的配置。
Spring Context:提供了一种更加丰富的框架应用上下文,包括国际化、事件传播、资源访问等。
Spring AOP:面向切面编程模块,允许开发者定义横切关注点,如日志记录、事务管理等。
Spring DAO:数据访问对象模块,提供了对JDBC的抽象,简化了数据访问层的编码。
Spring JDBC:提供了对Java数据库连接(JDBC)的抽象和简化,使得数据库操作更加方便。
Spring ORM:对象关系映射模块,支持与Hibernate、JPA、MyBatis等ORM工具的集成。
Spring TX:事务管理模块,提供了声明式和编程式事务管理的支持。
BeanFactory 和 ApplicationContext有什么区别?
是spring的核心接口,都可以作为容器,ApplicationContext是BeanFactory的子接口。
BeanFactory: 是spring最底层的接口,包含各种Bean的定义和Bean的管理。
ApplicationContext: 作为BeanFactory的派生,除了有BeanFactory的功能以外,还提供了更多的功能。
区别:
BeanFactroy采用的是延迟加载形式来注入Bean的,使用到bean才会加载。ApplicationContext一次性加载所有bean。
BeanFactory需要手动注册,而ApplicationContext则是自动注册。
BeanFactory不支持国际化,ApplicationContext支持国际化(实现MessageSource接口)。
BeanFactory不支持AOP,ApplicationContext支持AOP,可以与Spring的AOP框架集成,提供声明式事务管理
问题三:SpringMVC的执行流程?
Spring 的常见注解有哪些?
第一类是:声明bean,有@Component、@Service、@Repository、@Controller
第二类是:依赖注入相关的,有@Autowired、@Qualifier、@Resourse
第三类是:设置作用域 @Scope
第四类是:spring配置相关的,比如@Configuration,@ComponentScan 和 @Bean
第五类是:跟aop相关做增强的注解 @Aspect,@Before,@After,@Around,@Pointcut
SpringMVC常见的注解有哪些?
有@RequestMapping:用于映射请求路径;
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象;
@RequestParam:指定请求参数的名称;
@PathViriable:从请求路径下中获取请求参数(/user/{id}),传递给方法的形式参数;@ResponseBody:注解实现将controller方法返回对象转化为json对象响应给客户端。@RequestHeader:获取指定的请求头数据,还有像@PostMapping、@GetMapping这些。
Springboot自动配置原理
在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:
-
@SpringBootConfiguration
-
@EnableAutoConfiguration
-
@ComponentScan
其中@EnableAutoConfiguration
是实现自动化配置的核心注解。
该注解通过@Import
注解导入对应的配置选择器。关键的是内部就是读取了该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。
在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。
一般条件判断会有像@ConditionalOnClass
这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。