1.Spring中Bean的作用域?
在Spring中,Bean的作用域是指Bean实例在应用程序中的生命周期及其可见范围的定义。Spring框架支持以下5种Bean的作用域:
-
Singleton:单例模式,也是Spring默认的作用域。在整个应用程序中只创建一个实例,多次获取该Bean时都返回同一个实例。
-
Prototype:原型模式,每次获取该Bean都会创建一个新的实例,即使在同一个ApplicationContext中多次获取也是如此。
-
Request:请求作用域,每个HTTP请求都会创建一个新的Bean实例。仅适用于Web应用程序上下文,需要整合Spring MVC使用。
-
Session:会话作用域,每个HTTP会话都会创建一个新的Bean实例。仅适用于Web应用程序上下文,需要整合Spring MVC使用。
-
GlobalSession:全局会话作用域,一般情况下与Session作用域相同。但在基于portlet的Web应用程序场景中,一个portlet可能会在多个HTTP会话之间共享一个全局会话。需要整合Spring MVC Portlet使用。
除了以上5种标准的作用域外,Spring还提供了一些自定义作用域,开发者可以根据自己的需求来实现。例如,可以通过实现Scope接口来定义自己的作用域。
需要注意的是,不同Bean的作用域对应的实例创建和销毁时间不同,因此在选择Bean的作用域时需要根据实际情况进行考虑。例如,对于频繁使用的、状态无关的Bean可以选择Singleton模式,而对于需要在HTTP请求级别共享的Bean则需要选择Request或Session作用域。
2.SpringMVC用什么对象从后台向前台传递数据的?
在SpringMVC中,使用ModelAndView对象来从后台向前台传递数据。ModelAndView是一个将模型数据和视图名称组合在一起的对象,它可以实现数据和视图之间的绑定。
具体地说,使用ModelAndView对象传递数据,首先需要将要传递的数据放入模型中,可以通过以下两种方式:
- 在控制器方法中使用ModelMap或Model对象,将数据添加到模型中,例如:
代码演示:
@RequestMapping("/demo") public ModelAndView demo() { String message = "Hello SpringMVC!"; ModelAndView mav = new ModelAndView("demo"); mav.addObject("message", message); return mav; }
- 直接在ModelAndView中设置模型数据,例如:
代码演示:
@RequestMapping("/demo") public ModelAndView demo() { String message = "Hello SpringMVC!"; return new ModelAndView("demo", "message", message); }
上述代码中,第一个参数是视图名称,第二个参数是模型属性的名称,第三个参数是模型属性的值。
然后,在视图页面中,可以通过EL表达式来获取并显示模型属性的值,例如:
<h1>${message}</h1>
上述代码中,${message}将会被替换为模型中名为"message"的属性值。
除了ModelAndView之外,还可以使用@ResponseBody注解返回JSON、XML等格式的数据,或使用@ModelAttribute注解将请求参数绑定到模型中。不同的数据传递方式适用于不同的场景,需要根据实际应用需求进行选择和使用。
3.方法重载和重写的区别?
重写(Override)和重载(Overload)是Java中的两个重要的面向对象编程概念,它们有以下区别:
重写(Override):
- 重写是指子类重新定义(覆盖)父类中的方法,方法名、参数列表和返回类型必须相同。
- 重写方法在运行时根据对象的实际类型来确定具体执行哪个方法版本。
- 重写方法可以改变父类方法的行为,但不能改变方法的签名(方法名、参数列表和返回类型)。
重载(Overload):
- 重载是指在一个类中,可以定义多个方法名称相同但参数列表不同的方法。
- 重载方法根据传入的参数类型、顺序或个数的不同来决定具体执行哪个方法版本。
- 重载方法具有相同的方法名,但必须具有不同的参数列表(参数类型不同或参数个数不同)。
- 重载方法可以拥有不同的返回类型,但它们并不构成重载的依据。只有参数列表不同的方法才能构成重载。
总结:
- 重写(Override)是子类重新定义父类中的方法,方法名、参数列表和返回类型必须相同。
- 重载(Overload)是在同一个类中定义多个方法,方法名相同但参数列表不同。
- 重写是对继承关系中的方法进行重新定义,而重载则是在同一个类中对相同方法名的不同版本进行定义。
- 重写方法在运行时根据对象的实际类型来确定具体执行哪个方法版本,而重载方法根据传入的参数类型、顺序或个数的不同来决定具体执行哪个方法版本。
- 总结图示: