能上外国网站dns,移动互联网软件开发,网站建设的多吗,西安 网站托管1.Spring框架中的Bean是否线程安全的
Spring框架中的Bean默认是单例的#xff0c;不是线程安全的。因为一般在Spring的bean的中都是注入无状态的对象#xff0c;没有线程安全问题#xff0c;如果在bean中定义了可修改的成员变量#xff0c;是要考虑线程安全问题的#xf…1.Spring框架中的Bean是否线程安全的
Spring框架中的Bean默认是单例的不是线程安全的。因为一般在Spring的bean的中都是注入无状态的对象没有线程安全问题如果在bean中定义了可修改的成员变量是要考虑线程安全问题的可以使用多例或者加锁来解决。
2.说一说AOP
AOP指面向切面编程用于将那些与业务无关但却对多个对象产生影响的公共行为和逻辑抽取公共模块复用降低耦合 2.AOP的使用场景有记录操作日志缓存spring实现的事务都是通过AOP实现的 核心是使用op中的环绕通知切点表达式找到要记录日志的方法通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等)获取到这些参数以后根据不同需要进行不同的处理。如Spring的事务就是方法前后进行拦截在执行方法之前开启事务在执行完目标方法之后根据执行情况提交或者回滚。
3.事务失效的情况
异常捕获处理自己处理了异常没有抛出解决手动抛出抛出异常为检查异常Spring事务默认只会处理运行时异常可以通过配置rollbackFor属性为Exception解决非public方法导致的事务失效改为public即可解决当一个类内部的其他方法直接调用时会发生事务失效情况。这是因为Spring AOP代理机制的原因直接的方法调用不会经过代理对象因此事务也不会启动。解决这个问题的一个办法是重构代码使得事务方法能够被外部访问并由Spring容器来管理调用另一个是这个类通过懒加载注入自己再通过注入的代理去调用事务方法即可。
4.说一说Bean的生命周期
通过BeanDefinition获取bean的定义信息调用构造函数实例化bean调用了Bean的set方法(属性的依赖注入)调用了Bean实现的Aware接口实现的方法从前到后为BeanNameAwareBean的名称、BeanFactoryAwareBean的工厂、ApplicationContextAwareBean的上下文Bean的前置处理器BeanPostProcessor-前置方法在Bean的初始化方法完成前调用自定义初始化方法从前到后为PostConstruct注解的方法、实现了InitializingBean接口的方法Bean的后置处理器BeanPostPrpcessor-后置方法在Bean的初始化方法完成后调用销毁Bean时调用从前到后为PreDestroy注解的方法实现了DisposableBean接口的destroy()方法
5.说一说循环依赖
循环依赖
循环依赖其实就是循环引用也就是两个或两个以上的bea互相特有对方最终形成环。比如A依赖于B,B依赖于A循环依赖在spring中是允许存在spring框架依据三级缓存已经解决了大部分的循环依赖。剩下的可以用Lazy懒加载解决 三级缓存 一级缓存单例池缓存已经经历了完整的生命周期已经初始化完成的bean对象 二级缓存缓存早期的bean对像生命周期还没走完 三级缓存缓存的是ObjectFactory表示对象工厂用来创建对象的
6.SpringMvc的执行流程
重点组件 DispatcherServlet前端控制器 HandlerMapping处理器映射器 HandlerAdapter处理器适配器 ViewReslover视图解析器
1.视图阶段
用户发送出请求到前端控制器(DispatcherServlet)前端控制器收到请求调用处理器映射器(HandlerMapping)处理器映射器找到具体的处理器生成处理器对象及处理器拦截器如果有再一起返回给前端控制器。前端控制器调用处理器适配器(HandlerAdapter)处理器适配器经过适配调用具体的处理器(Handler/Controller)处理器执行完成返ModelAndView对象处理器适配器将处理器(Controller)执行结果ModelAndView返回给前端控制器前端控制器将ModelAndView传给视图解析器(ViewReslover)视图解析器解析后返回具体视图(View)前端控制器根据视图进行渲染视图即将模型数据填充至视图中并相应给用户
2.前后端分离阶段
用户发送出请求到前端控制器DispatcherServletDispatcherServletu收到请求调用HandlerMapping(处理器映射器)HandlerMapping找到具体的处理器生成处理器对象及处理器拦截器如果有再一起返给DispatcherServlet。DispatcherServleti调用HandlerAdapter(处理器适配器)HandlerAdapter经过适配调用具体的处理器(Handler/,Controller)因为方法上有ResponseBody所以通过HttpMessageConverter来返回结果转换为JSON并响应
7.说一说SpringBoot自动配置原理
在Spring Boot项目中的l导类上有一个注解SpringBootApplication,这个注解是对三个注解进行了封装分别是
SpringBootConfigurationEnableAutoConfigurationComponentScan
其中EnableAutoConfiguration是实现自动化配置的核心注解。该注解通过Importi注解导入对应的配置选择器内部就是读取了该项目和该项目引用的jar包的classpath路径下META-lNF/spring.factories.文件中的所配置的类的全类名。在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。条件判断会有像ConditionalOnClass这样的注解判断是否有对应的class文件如果有则加载该类把这个配置类的所有的Bean放入 spring容器中使用。
8.Spring中常见的注解
1.Spring
使用在类上用于实例化Bean – Component – Controller – Service – Repository使用在字段上用于根据类型依赖注入 – Autowired结合Autowired一起使用用于根据名称进行依赖注入 – Qualifier标注Bean的作用范围 – Scope指定当前类是一个Spring配置类当创建容器时会从该类上加载注解 – Configuration用于指定Spring在初始化容器时要扫描的包 – ComponentScan使用在方法上标注将该方法的返回值存储到Spring容器中 – Bean使用Import导入的类会被Spring加载到Ioc容器中 – Import用于切面编程(AOP) – Aspect – Before – After – Around – Pointcut
2.SpringMVC
用于映射请求路径可以定义在类上和方法上。用于类上则表示类中的所有的方法都是以该地址作为父路径 – RequestMapping注解实现接收http请求的json数据将json转换为java对象 – RequestBody指定请求参数的名称 – RequestParam从请求路径下中获取请求参数(/user/{id}),传递给方法的形式参数 – PathViriable注解实现将controller方法返回对象转化为json对象响应给客户端 – ResponseBody获取指定的请求头数据 – RequestHeaderController和ResponseBody合体 – RestController
3.SpringBoot
组合了-Configuration注解实现配置文件的功能 – SpringBootConfiguration打开自动配置的功能 – EnableAutoConfigurationComponentScan – Spring组件扫描
9.Mybatis的执行流程
读取MyBatis配置文件mybatis-config.xml加载运行环境和映射文件构造会话工厂SqlSessionFactory会话工厂创建SqlSessioni对象包含了执行SQL语句的所有方法操作数据库的接口Executor执行器同时负责查询缓存的维护Executor接口的执行方法里面会从一个MappedStatement类型的对象里面读取其中封装的映射信息。输入参数映射(java转数据库)输出结果映射(数据库转java)
10.说一说Mybatis延迟加载
延迟加载的意思是就是在需要用到数据时才进行加载不需要用到数据时就不加载数据。Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载在Mybatis配置文件中可以配置是否启用延迟加载lazyLoadingEnabledtruelfalse默认是关闭的。或者在mapper文件中局部配置底层原理是使用CGLIB创建目标对象的代理对象。当调用目标方法时进入拦截器invoke方法发现目标方法是null值执行sgl查询。获取数据以后调用set方法设置属性值再继续查询目标方法就有值了。
11.说一说Mybatis缓存
一级缓存 基于PerpetualCache的HashMap本地缓存其存储作用域为Session,当Session进行flush或close之后该Session中的所有Cache就将清空默认打开一级缓存二级缓存 是基于namespace和mapper的作用域起作用的不是依赖于SQL session,默认也是采用PerpetualCache,HashMap存储。需要单独开启一个是核心配置一个是mapperB映射文件清理缓存 当某一个作用域一级缓存Session,/二级缓存Namespaces)进行了新增、修改、删除操作后默认该作用域下所有select中的缓存将被clear。