應(yīng)用場(chǎng)景面試題集(各知識(shí)點(diǎn)不同使用場(chǎng)景選型)
1. Spring 配置 Bean 實(shí)例化有哪些方式?
- 使用類構(gòu)造器實(shí)例化(默認(rèn)無(wú)參數(shù))
<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>
- 使用靜態(tài)工廠方法實(shí)例化(簡(jiǎn)單工廠模式)
//下面這段配置的含義:調(diào)用 Bean2Factory 的 getBean2 方法得到 bean2
<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory"
factorymethod="getBean2"></bean>
- 使用實(shí)例工廠方法實(shí)例化(工廠方法模式)
//先創(chuàng)建工廠實(shí)例 bean3Facory,再通過(guò)工廠實(shí)例創(chuàng)建目標(biāo) bean 實(shí)例
<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"/><bean
id="bean3" factorybean="bean3Factory" factorymethod="getBean3"></bean>
2. Bean 注入屬性有哪幾種方式
- 屬性注入方式,通過(guò) setXXX() 方法注入 Bean 的屬性值或者依賴對(duì)象
- 構(gòu)造函數(shù)注入方式,使用的前提:Bean 必須提供帶參的構(gòu)造函數(shù)
- 工廠方法注入方式
3. 在 Spring 中如何實(shí)現(xiàn)時(shí)間處理?
在 applicationContext.xml 中配置事件源、監(jiān)聽(tīng)器,先得到事件源,調(diào)用事件 源的方法,通知監(jiān)聽(tīng)器。
4. Spring 中如何更高效的使用 JDBC ?
傳統(tǒng)的 JDBC 實(shí)現(xiàn)有兩個(gè)不足之處:
- 連接需要自己管理操
- JDBC 操作代碼封裝與編寫(xiě)重復(fù)實(shí)現(xiàn)
Spring 實(shí)現(xiàn)了 JdbcTemplate,在 JDBC API 的基礎(chǔ)做了科學(xué)的封裝。
JdbcTemplate 的優(yōu)點(diǎn)有:
- 配置基于模板化處理
- JdbcTemplate 是線程安全類
- 實(shí)例化操作比較簡(jiǎn)單,僅需要傳遞 DataSource
- 自動(dòng)完成資源的創(chuàng)建和釋放工作
- 對(duì) JDBC 的核心流程進(jìn)行了封裝,簡(jiǎn)化了對(duì) JDBC 的操作
- 創(chuàng)建一次 JdbcTemplate,到處可用,避免重復(fù)開(kāi)發(fā)
5. 請(qǐng)介紹一下設(shè)計(jì)模式在 Spring 框架中的使用?
- 工廠模式:BeanFactory 就是簡(jiǎn)單工廠模式的體現(xiàn),用來(lái)創(chuàng)建對(duì)象的實(shí) 例。
- 單例模式:Bean 默認(rèn)為單例模式。
- 代理模式:Spring 的 AOP 功能用到了 JDK 的動(dòng)態(tài)代理和 CGLIB 字 節(jié)碼生成技術(shù)。
- 模板方法:用來(lái)解決代碼重復(fù)的問(wèn)題。比如:RestTemplate, JmsTemplate, JpaTemplate。
- 觀察者模式:定義對(duì)象鍵一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生
改變時(shí),所有依賴于它的對(duì)象都會(huì)得到通知被制動(dòng)更新,如 Spring 中
listener 的實(shí)現(xiàn):ApplicationListener。
6. 講講 Spring 框架的優(yōu)點(diǎn)有哪些?
- 非侵入式設(shè)計(jì):代碼與框架的依賴性比較低。
- 代碼解耦:提供控制反轉(zhuǎn)能力,對(duì)象的創(chuàng)建和依賴關(guān)系的維護(hù)工作都交給
Spring 容器的管理,大大的降低了對(duì)象之間的耦合性。 - 可復(fù)用性提高:支 AOP ,允許將一些通用能力(打印日志、事務(wù)處理、 安全操作等)
進(jìn)行集中式處理。 - MVC 框架:Spring 的 Web 框架是個(gè)精心設(shè)計(jì)的框架,是 Web 框架 的一個(gè)很好的替代品。
- 事務(wù)支持方便:Spring 提供一個(gè)持續(xù)的事務(wù)管理接口,配置化完成對(duì)事 物的管理,減少手動(dòng)編程。
- 異常處理:Spring 提供方便的 API 把具體技術(shù)相關(guān)的異常(比如由 JDBC、Hibernate or JDO 拋出的)
轉(zhuǎn)化為一致的 unchecked 異常。 - 方便程序測(cè)試:提供了對(duì) Junit4 的支持,可以通過(guò)注解方便的測(cè)試 Spring 程序。
7. 哪種依賴注入方式你建議使用,構(gòu)造器注入,還是 Setter 方法注 入?
你兩種依賴方式都可以使用,構(gòu)造器注入和 setter 方法注入。最好的解決方案 是用構(gòu)造器參數(shù)實(shí)現(xiàn)強(qiáng)制依賴,setter 方法實(shí)現(xiàn)可選依賴。
8. 你怎樣定義類的作用域?
當(dāng)定義一個(gè) <bean> 在 Spring 里,我們還能給這個(gè) Bean 聲明一個(gè)作用域。
它可以通過(guò) Bean 定義中的 scope 屬性來(lái)定義。如,當(dāng) Spring 要在需要的
時(shí)候每次生產(chǎn)一個(gè)新的Bean實(shí)例 , Bean的scope屬性被指定為prototype。
另一方面,一個(gè) Bean 每次使用的時(shí)候必須返回同一個(gè)實(shí)例,這
個(gè) Bean 的 scope 屬性必須設(shè)為 singleton。
9. 解釋 Spring 支持的幾種 Bean 的作用域
Spring 框架支持以下五種 Bean 的作用域:
- singleton:Bean 在每個(gè) Spring IoC 容器中只有一個(gè)實(shí)例。
- prototype:一個(gè) Bean 的定義可以有多個(gè)實(shí)例。
- request:每次 http 請(qǐng)求都會(huì)創(chuàng)建一個(gè) Bean,該作用域僅在基于 Web 的 Spring ApplicationContext
情形下有效。 - session:在一個(gè) HTTP Session 中,一個(gè) Bean 定義對(duì)應(yīng)一個(gè)實(shí)例。 該作用域僅在基于 Web 的 Spring ApplicationContext 情形下有效。
- global-session:在一個(gè)全局的 HTTP Session 中,一個(gè) Bean 定義對(duì) 應(yīng)一個(gè)實(shí)例。該作用域僅在基于 Web 的 Spring ApplicationContext 情形下有效。
缺省的 Spring Bean 的作用域是 Singleton。
10. 在 Spring 中如何注入一個(gè) Java 集合?
Spring 提供以下幾種集合的配置元素:
- <list> 類型用于注入一列值,允許有相同的值。
- <set> 類型用于注入一組值,不允許有相同的值。
- <map> 類型用于注入一組鍵值對(duì),鍵和值都可以為任意類型。
- <props> 類型用于注入一組鍵值對(duì),鍵和值都只能為 String 類型。
11. 你可以在 Spring 中注入一個(gè) null 和一個(gè)空字符串嗎?
可以
12. 什么是基于 Java 的 Spring 注解配置?
給一些注解的例子 基于 Java 的配置,允許你在少量的 Java 注解的幫助下,進(jìn)行你的大部分
Spring 配置而非通過(guò) XML 文件。
以 @Configuration 注解為例,它用來(lái)標(biāo)記類可以當(dāng)做一個(gè) Bean 的定義,被
Spring IOC 容器使用。另一個(gè)例子是 @Bean 注解,它表示此方法將要返回一
個(gè)對(duì)象,作為一個(gè) Bean 注冊(cè)進(jìn) Spring 應(yīng)用上下文。
13. 你更傾向用那種事務(wù)管理類型?
聲明式事務(wù)管理,因?yàn)樗鼘?duì)應(yīng)用代碼侵入性很少,更符合一個(gè)無(wú)侵入的輕量級(jí)容 器的思想。
聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理,雖然比編程式事務(wù)管理(這種方式允許
你通過(guò)代碼控制事務(wù))少了一點(diǎn)靈活性。
14. Bean 的調(diào)用方式有哪些?
有三種方式可以得到 Bean 并進(jìn)行調(diào)用。
- 使用 BeanWrapper
HelloWorld hw=new HelloWorld();
BeanWrapper bw=new BeanWrapperImpl(hw);
bw.setPropertyvalue(”msg”,”HelloWorld”);
system.out.println(bw.getPropertyCalue(”msg”));
- 使用 BeanFactory
InputStream is=new FileInputStream(”config.xml”);
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);
system.out.println(hw.getMsg());
- 使用 ApplicationConttext
ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”);
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);
System.out.println(hw.getMsg());
使用 @ResponseBody 注解。
15. Spring MVC 里面攔截器是怎么寫(xiě)的
有兩種寫(xiě)法,一種是實(shí)現(xiàn)接口,另外一種是繼承適配器類,然后在 Spring MVC
的配置文件中配置攔截器即可:
<!-- 配置 SpringMvc 的攔截器 --> <mvc:interceptors>
<!-- 配置一個(gè)攔截器的 Bean 就可以了 默認(rèn)是對(duì)所有請(qǐng)求都攔截 -->
<bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"/>
<!-- 只針對(duì)部分請(qǐng)求攔截 -->
<mvc:interceptor>
<mvc:mapping path="/modelMap.do" />
<bean class="com.et.action.MyHandlerInterceptorAdapter" />
</mvc:interceptor> </mvc:interceptors>
16. 當(dāng)一個(gè)方法向 AJAX 返回特殊對(duì)象,譬如 Object、List 等,需要 做什么處理?
要加上 @ResponseBody 注解。
17. 如何使用 Spring MVC 完成 JSON 操作
- 配置 MappingJacksonHttpMessageConverter
- 使用 @RequestBody 注解或 ResponseEntity 作為返回值
18. Spring 如何整合 Hibernate
整合 Hibernate,即由 IoC 容器生成 SessionFactory 對(duì)象, 并使用 Spring
的聲明式事務(wù)。
- 利用 LocalSessionFactoryBean 工廠 Bean,聲明一個(gè)使用 XML 映射
文件的 SessionFactory 實(shí)例 - 利用 HibernateTransactionManager 配置 Hibernate 的事務(wù)管理器
19. Spring 如何整合 Struts2 ?
整合 Struts2,即由 IoC 容器管理 Struts2 的 Action:
- 安裝 Spring 插件:把 struts2-spring-plugin-2.2.1.jar 復(fù)制到當(dāng)前
Web 應(yīng)用的 WEB-INF/lib 目錄下 - 在 Spring 的配置文件中配置 Struts2 的 Action 實(shí)例
- 在 Struts 配置文件中配置 action,但其 class 屬性不再指向該 Action
的實(shí)現(xiàn)類,而是指向 Spring 容器中 Action 實(shí)例的 ID
20. 開(kāi)發(fā)中主要使用 Spring 的什么技術(shù) ?
- IoC 容器管理各層的組件
- 使用 AOP 配置聲明式事務(wù)
- 整合其他框架
21. 介紹一下 Spring MVC 常用的一些注解
- @RequestMapping:處理請(qǐng)求地址映射的注解,可用于類或方法上。
- @PathVariable:綁定 URI 模板變量值是用來(lái)獲得請(qǐng)求 url 中的動(dòng)態(tài)參
數(shù) - @RequestParam:用于將指定的請(qǐng)求參數(shù)賦值給方法中的形參
- @RequestBody:讀取 Request 請(qǐng)求的 body 部分?jǐn)?shù)據(jù)
- @ResponseBody:用于將 Controller 的方法返回的對(duì)象,通過(guò)適當(dāng)?shù)?HttpMessageConverter
轉(zhuǎn)換為指定格式后,寫(xiě)入到 Response 對(duì)象 的 body 數(shù)據(jù)區(qū)
22. Spring 框架的事務(wù)管理有哪些優(yōu)點(diǎn)
- 為不同的事務(wù) API( JDBC、Hibernate、JPA )提供統(tǒng)一的編程模型
- 封裝了簡(jiǎn)單統(tǒng)一的 API 對(duì)事物進(jìn)行管理操作
- 同時(shí)支持聲明式事物和編程時(shí)事物兩種方式