什么是Spring
Spring是一个轻量级的IOC/DI和AOP容器框架,他可以帮我们简化很多代码的编写,提高开发效率
Spring有哪些重要模块
Spring Core, Spring Web, Spring AOP,Spring Test,Spring JDBC等
Spring框架有哪些优点
Spring框架有很多优点,比如说他提供了测试功能,还有就是他提供了很多API,这些API帮我们简化了很多代码复杂的功能,比如JDBC,还有就是他可以帮我们解耦
@RestController vs @Controller
@RestController和@Controller都是贴在表现层类或者方法的头顶上的,他们最大的区别就是@RestController方法返回的是一个Json对象,而@Controller是返回字符串,如果我们使用@Controller注解,又想返回JSON对象的话,就需要再贴一个叫@ResponseBody注解,也就是说@RestController=@Controller+@ResponseBody
什么是IOC
IOC是控制反转,他是一种思想,IOC容器实际是一个Map,这个Map存放了很多对象。当我们要创建对象的时候,只需要在配置文件或者使用注解的方式,IOC就会帮我们创建对象并交给容器管理,我们不需要关心对象是怎么创建出来的
依赖注入的方式?他们之间有什么区别?
依赖注入有两种方式:
①一种是构造器依赖注入,也就是通过容器调用构造器来实现,构造器中有一些属性,每一个参数代表着对其他类的一个依赖
②setter方法注入,也就是通过调用无参构造器或者无static工厂方法来创建bean实例,bean实例创建完之后调用setter方法来给实例注入依赖
区别:构造器注入没有部分注入,不会覆盖setter方法,任意修改时不会创建对象,比较适合用于属性比较多的setter方法注入有部分注入,会覆盖setter方法,任意修改时会创建一个新的对象,比较适合用于属性比较少的
什么是AOP
AOP是面向切面编程,是基于动态代理的,他可以将一些与业务无关,但是要被业务模块所调用的一些东西(如:权限控制,事务,日志管理)给封装起来,这样子可以减少我们代码的重复性,降低模块之间的耦合性,有利于我们后期的拓展和维护
Spring AOP 和 AspectJ AOP 有什么区别?
①SpringAOP是运行时增强,AspectJ是编译时增强
②SpringAOP是基于代理,AspectJ是基于字节码操作的
③SpringAOP里面已经集成了AspectJ,AspectJ的功能比SpringAOP要强大很多,但是使用起来的话SpringAOP更为简单,如果切面少的情况下,两者没有区别,如果是切面多的情况下,
Spring中的bean的作用域有哪些?
①singleton:创建唯一bean实例,spring中默认的就是单例对象
②prototype:每一次都会创建一个新的实例
③request:当发出Http请求的时候都会创建一个新的bean实例,这个实例只在当前Http request中有效
④session:当发起Http请求的时候都会创建一个新的bean实例,这个实例只在当前Http session中有效
⑤global-session:全局session作用域
Spring 中的单例 bean 的线程安全问题了解吗?
我们很少在系统中使用多线程,所以单例bean的线程安全很容易被我们忽略。但是单例bean是存在线程安全的问题的,当多线程操作同一个对象时,该对象的非静态可变变量会存在一个线程安全的问题。我们解决线程安全的问题有两种方式:第一种是避免bean对象中非静态资源的定义,但是这种方法是不现实的第二种是定义一个ThreadLocal,我们使用这个ThreadLocal来存储对象中的可变变量,这种方法是比较推荐的。
@Component 和 @Bean 的区别是什么?
@Component和@Bean都是注册bean到Spring容器中。但是他们也有很大的区别
①首先,他们作用对象是不同的,@Component是作用在类上,而@Bean是作用在方法上
②其次,@Component是通过类的路径来自动监测和自动装配到Spring容器中,而@Bean是通过贴有该注解的方法创建出bean实例,@Bean注解会告诉Spring这是某个类的实例,但我们需要使用的时候,Spring就会将实例还给我们使用
③最后,@Bean的自定义性比@Component的自定义性要高,而且很多地方都只能使用@Bean注解来注册bean,比如我们要使用第三方类交给Spring容器管理的时候,就只能使用@Bean
将一个类声明为Spring的 bean 的注解有哪些?
我们一般都是使用@Autowire注解自动装配bean的,如果类要被@Autowire的话,我们需要在类的头顶上贴上以下几个注解:@Component:该注解贴在不确定类类型的时候,如果他不属于控制层,业务层,持久层,那么就可以使用该注解@Repository: 该注解是贴在持久层上的,持久层是用来和数据库打交道的@Service: 这个注解是贴在业务层的,业务层主要是用来处理一些复杂的逻辑问题@Controller: 这个注解是贴在控制层上的,主要是接收请求并调用Service层,将数据结果返回给前端页面
Spring中bean的生命周期
首先会创建实例化bean对象,然后给对象设置属性值,接着检查Aware相关接口是否有继承,有的话就调用相关方法,接着如果有和bean相关联的BeanPostProcessors对象,就会进行前置处理,检查是否是InitializingBean来决定是否调用afterPropertiesSet()方法,然后会检查是否配置有自定义的init-method属性,有的话就执行指定的方法,接着到BeanPostProcessor中进行后置处理,当Bean要销毁时,是否实现DisposableBean接口,执行destroy()方法,如果配置文件中定义了destroy-method属性,就执行指定的方法
SpringMVC的执行流程
用户发送请求的时候会到前端控制器中,前端控制器到处理器映射器中查找处理器,并返回一个处理器执行链到前端控制器,接着到处理器适配器中去根据xml配置文件查找对应的Controller,然后Controller中对应的方法并返回一个ModelAndView对象到处理器适配器中,处理器适配器再将这个对象返回到前端控制器,前端控制器将这个对象传到视图解析器中进行解析并返回一个View对象,前端控制器根据Model对View进行试图渲染,将渲染结果响应给用户
SpringMVC的优点
他是一款基于Spring为基础的框架,避免了我们手动创建对象,其次,他的可拓展性很高,代码可重用性也高,而且他可以支持各种视图技术,不仅仅是jsp
请求转发和重定向的区别
①请求转发页面的地址栏会发生改变,而且可以进行数据共享,也可以访问WEB_INF下的资源②重定向页面的地址栏是不会发生改变的,而且数据不会共享,也就是我们在执行请求之后不需要进行数据展示在页面的时候可以使用重定向,但是他不能访问WEB-INF下的资源
Spring框架中用到的设计模式
工厂模式(BeanFactory创建bean实例),代理模式(AOP),单例模式(单例bean),模板方法模式(template),观察者模式,适配器模式等
Spring 管理事务的方式有几种?
Spring管理事务有两种方式:一种是编程式事务,也就是在编写硬编码,另一种是声明式事务,也就是通过配置文件来配置,而声明式事务又分为注解声明式事务和xml声明式事务
网友评论