2025春招,Spring 面试题汇总

打印 上一主题 下一主题

主题 979|帖子 979|积分 2937

大家好,我是 V 哥。2025年金三银四春招马上进入白热化,兄弟们在即将到来的假期,除了吃喝欢乐过新年,想年后跳槽升职的兄弟也要做好充分的准备,要相信,机会永久只留给有准备的人。以下是一份2025年春招Spring面试题汇总,送给大家,关于 Java 基础相干的请移步 V 哥上一篇文章《【长文收藏】2025备战金三银四 Java 大厂面试题》:
Spring 基础部分

一、Spring基础
1. 什么是Spring框架?

  • 答案

    • Spring是一个轻量级的开源Java开发框架,为开发Java企业级应用提供了全面的基础设施支持。它重要解决了企业级开发中的复杂性,如依赖注入(DI)、面向切面编程(AOP)、事务管理等,使得开发者可以更专注于业务逻辑的实现。
    • Spring的焦点特性包括:

      • 控制反转(IOC):将对象的创建和管理控制权从开发者转移到Spring容器,通过配置或注解的方式让Spring容器来创建和管理对象,降低了对象之间的耦合度。
      • 依赖注入(DI):是IOC的一种实现方式,通过构造函数、setter方法或字段注入等方式将依赖对象注入到必要它们的对象中。
      • 面向切面编程(AOP):允许在不修改源代码的环境下添加额外的举动,如日志记录、事务管理等,将横切关注点从业务逻辑中分离出来,进步代码的模块化和可维护性。


2. 请解释Spring中的IOC容器。

  • 答案

    • Spring IOC容器是Spring框架的焦点,它负责管理对象的创建、配置和生命周期。它可以根据配置元数据(如XML配置文件、Java配置类或注解)来创建和组装对象,并将它们注入到必要的地方。
    • 常见的IOC容器实现:

      • BeanFactory:Spring最基本的IOC容器,提供了基本的依赖注入功能。
      • ApplicationContext:是BeanFactory的子接口,提供了更多高级功能,如国际化支持、事件发布、资源加载等。


3. 怎样在Spring中配置一个Bean?

  • 答案

    • 利用XML配置
      1. <beans>
      2. <tx:annotation-driven transaction-manager="transactionManager"/>
      3. <bean id="transactionManager" >
      4. <bean id="messageSource" >
      5. <beans>
      6.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      7. </beans><property name="basename" value="messages"/>
      8. </bean><property name="dataSource" ref="dataSource"/>
      9. </bean><bean id="userService" >
      10. <tx:annotation-driven transaction-manager="transactionManager"/>
      11. <bean id="transactionManager" >
      12. <bean id="messageSource" >
      13. <beans>
      14.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      15. </beans><property name="basename" value="messages"/>
      16. </bean><property name="dataSource" ref="dataSource"/>
      17. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      18. <bean id="transactionManager" >
      19. <bean id="messageSource" >
      20. <beans>
      21.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      22. </beans><property name="basename" value="messages"/>
      23. </bean><property name="dataSource" ref="dataSource"/>
      24. </bean><property name="userRepository" ref="userRepository"/>
      25. <tx:annotation-driven transaction-manager="transactionManager"/>
      26. <bean id="transactionManager" >
      27. <bean id="messageSource" >
      28. <beans>
      29.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      30. </beans><property name="basename" value="messages"/>
      31. </bean><property name="dataSource" ref="dataSource"/>
      32. </bean></bean>
      33. <tx:annotation-driven transaction-manager="transactionManager"/>
      34. <bean id="transactionManager" >
      35. <bean id="messageSource" >
      36. <beans>
      37.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      38. </beans><property name="basename" value="messages"/>
      39. </bean><property name="dataSource" ref="dataSource"/>
      40. </bean><bean id="userRepository" />
      41. </beans>
      复制代码
    • 利用Java配置类
      1. import org.springframework.context.annotation.Bean;
      2. import org.springframework.context.annotation.Configuration;
      3. @Configuration
      4. public class AppConfig {
      5. <tx:annotation-driven transaction-manager="transactionManager"/>
      6. <bean id="transactionManager" >
      7. <bean id="messageSource" >
      8. <beans>
      9.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      10. </beans><property name="basename" value="messages"/>
      11. </bean><property name="dataSource" ref="dataSource"/>
      12. </bean>@Bean
      13. <tx:annotation-driven transaction-manager="transactionManager"/>
      14. <bean id="transactionManager" >
      15. <bean id="messageSource" >
      16. <beans>
      17.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      18. </beans><property name="basename" value="messages"/>
      19. </bean><property name="dataSource" ref="dataSource"/>
      20. </bean>public UserService userService() {
      21. <tx:annotation-driven transaction-manager="transactionManager"/>
      22. <bean id="transactionManager" >
      23. <bean id="messageSource" >
      24. <beans>
      25.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      26. </beans><property name="basename" value="messages"/>
      27. </bean><property name="dataSource" ref="dataSource"/>
      28. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      29. <bean id="transactionManager" >
      30. <bean id="messageSource" >
      31. <beans>
      32.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      33. </beans><property name="basename" value="messages"/>
      34. </bean><property name="dataSource" ref="dataSource"/>
      35. </bean>UserService userService = new UserService();
      36. <tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean>userService.setUserRepository(userRepository());
      51. <tx:annotation-driven transaction-manager="transactionManager"/>
      52. <bean id="transactionManager" >
      53. <bean id="messageSource" >
      54. <beans>
      55.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      56. </beans><property name="basename" value="messages"/>
      57. </bean><property name="dataSource" ref="dataSource"/>
      58. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      59. <bean id="transactionManager" >
      60. <bean id="messageSource" >
      61. <beans>
      62.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      63. </beans><property name="basename" value="messages"/>
      64. </bean><property name="dataSource" ref="dataSource"/>
      65. </bean>return userService;
      66. <tx:annotation-driven transaction-manager="transactionManager"/>
      67. <bean id="transactionManager" >
      68. <bean id="messageSource" >
      69. <beans>
      70.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      71. </beans><property name="basename" value="messages"/>
      72. </bean><property name="dataSource" ref="dataSource"/>
      73. </bean>}
      74. <tx:annotation-driven transaction-manager="transactionManager"/>
      75. <bean id="transactionManager" >
      76. <bean id="messageSource" >
      77. <beans>
      78.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      79. </beans><property name="basename" value="messages"/>
      80. </bean><property name="dataSource" ref="dataSource"/>
      81. </bean>@Bean
      82. <tx:annotation-driven transaction-manager="transactionManager"/>
      83. <bean id="transactionManager" >
      84. <bean id="messageSource" >
      85. <beans>
      86.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      87. </beans><property name="basename" value="messages"/>
      88. </bean><property name="dataSource" ref="dataSource"/>
      89. </bean>public UserRepository userRepository() {
      90. <tx:annotation-driven transaction-manager="transactionManager"/>
      91. <bean id="transactionManager" >
      92. <bean id="messageSource" >
      93. <beans>
      94.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      95. </beans><property name="basename" value="messages"/>
      96. </bean><property name="dataSource" ref="dataSource"/>
      97. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      98. <bean id="transactionManager" >
      99. <bean id="messageSource" >
      100. <beans>
      101.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      102. </beans><property name="basename" value="messages"/>
      103. </bean><property name="dataSource" ref="dataSource"/>
      104. </bean>return new UserRepository();
      105. <tx:annotation-driven transaction-manager="transactionManager"/>
      106. <bean id="transactionManager" >
      107. <bean id="messageSource" >
      108. <beans>
      109.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      110. </beans><property name="basename" value="messages"/>
      111. </bean><property name="dataSource" ref="dataSource"/>
      112. </bean>}
      113. }
      复制代码
    • 利用注解
      1. import org.springframework.stereotype.Service;
      2. import org.springframework.beans.factory.annotation.Autowired;
      3. @Service
      4. public class UserService {
      5. <tx:annotation-driven transaction-manager="transactionManager"/>
      6. <bean id="transactionManager" >
      7. <bean id="messageSource" >
      8. <beans>
      9.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      10. </beans><property name="basename" value="messages"/>
      11. </bean><property name="dataSource" ref="dataSource"/>
      12. </bean>@Autowired
      13. <tx:annotation-driven transaction-manager="transactionManager"/>
      14. <bean id="transactionManager" >
      15. <bean id="messageSource" >
      16. <beans>
      17.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      18. </beans><property name="basename" value="messages"/>
      19. </bean><property name="dataSource" ref="dataSource"/>
      20. </bean>private UserRepository userRepository;
      21. <tx:annotation-driven transaction-manager="transactionManager"/>
      22. <bean id="transactionManager" >
      23. <bean id="messageSource" >
      24. <beans>
      25.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      26. </beans><property name="basename" value="messages"/>
      27. </bean><property name="dataSource" ref="dataSource"/>
      28. </bean>// 业务逻辑
      29. }
      复制代码

二、Spring AOP
1. 请解释Spring AOP中的切面(Aspect)、通知(Advice)和切点(Pointcut)。

  • 答案

    • 切面(Aspect):是一个模块化的单元,将横切关注点封装起来,包含了通知和切点。可以将其视为一个包含了额外举动(如日志记录、事务管理)的类。
    • 通知(Advice):是切面在切点上实行的操作,重要有以下几种类型:

      • 前置通知(Before advice):在目标方法实行前实行。
      • 后置通知(After advice):在目标方法实行后实行。
      • 围绕通知(Around advice):在目标方法实行前后都可以实行,而且可以控制方法的实行。
      • 非常通知(AfterThrowing advice):在目标方法抛出非常时实行。
      • 返回通知(AfterReturning advice):在目标方法正常返回时实行。

    • 切点(Pointcut):是一个表达式,用于定义在哪些连接点(Join Point)上实行通知,连接点可以是方法的调用、实行等。例如:execution(* com.example.service.*.*(..))表示在com.example.service包下的全部类的全部方法上实行通知。

2. 怎样实现Spring AOP?

  • 答案

    • 利用XML配置
      1. <beans>
      2. <tx:annotation-driven transaction-manager="transactionManager"/>
      3. <bean id="transactionManager" >
      4. <bean id="messageSource" >
      5. <beans>
      6.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      7. </beans><property name="basename" value="messages"/>
      8. </bean><property name="dataSource" ref="dataSource"/>
      9. </bean><bean id="userService" >
      10. <tx:annotation-driven transaction-manager="transactionManager"/>
      11. <bean id="transactionManager" >
      12. <bean id="messageSource" >
      13. <beans>
      14.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      15. </beans><property name="basename" value="messages"/>
      16. </bean><property name="dataSource" ref="dataSource"/>
      17. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      18. <bean id="transactionManager" >
      19. <bean id="messageSource" >
      20. <beans>
      21.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      22. </beans><property name="basename" value="messages"/>
      23. </bean><property name="dataSource" ref="dataSource"/>
      24. </bean><property name="userRepository" ref="userRepository"/>
      25. <tx:annotation-driven transaction-manager="transactionManager"/>
      26. <bean id="transactionManager" >
      27. <bean id="messageSource" >
      28. <beans>
      29.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      30. </beans><property name="basename" value="messages"/>
      31. </bean><property name="dataSource" ref="dataSource"/>
      32. </bean></bean>
      33. <tx:annotation-driven transaction-manager="transactionManager"/>
      34. <bean id="transactionManager" >
      35. <bean id="messageSource" >
      36. <beans>
      37.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      38. </beans><property name="basename" value="messages"/>
      39. </bean><property name="dataSource" ref="dataSource"/>
      40. </bean><bean id="userRepository" />
      41. </beans><tx:annotation-driven transaction-manager="transactionManager"/>
      42. <bean id="transactionManager" >
      43. <bean id="messageSource" >
      44. <beans>
      45.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      46. </beans><property name="basename" value="messages"/>
      47. </bean><property name="dataSource" ref="dataSource"/>
      48. </bean>
      复制代码
    • 利用注解
      1. import org.aspectj.lang.annotation.Aspect;
      2. import org.aspectj.lang.annotation.Before;
      3. import org.aspectj.lang.annotation.Pointcut;
      4. @Aspect
      5. public class LoggingAspect {
      6. <tx:annotation-driven transaction-manager="transactionManager"/>
      7. <bean id="transactionManager" >
      8. <bean id="messageSource" >
      9. <beans>
      10.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      11. </beans><property name="basename" value="messages"/>
      12. </bean><property name="dataSource" ref="dataSource"/>
      13. </bean>@Pointcut("execution(* com.example.service.*.*(..))")
      14. <tx:annotation-driven transaction-manager="transactionManager"/>
      15. <bean id="transactionManager" >
      16. <bean id="messageSource" >
      17. <beans>
      18.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      19. </beans><property name="basename" value="messages"/>
      20. </bean><property name="dataSource" ref="dataSource"/>
      21. </bean>public void servicePointcut() {}
      22. <tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>@Before("servicePointcut()")
      30. <tx:annotation-driven transaction-manager="transactionManager"/>
      31. <bean id="transactionManager" >
      32. <bean id="messageSource" >
      33. <beans>
      34.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      35. </beans><property name="basename" value="messages"/>
      36. </bean><property name="dataSource" ref="dataSource"/>
      37. </bean>public void beforeMethod() {
      38. <tx:annotation-driven transaction-manager="transactionManager"/>
      39. <bean id="transactionManager" >
      40. <bean id="messageSource" >
      41. <beans>
      42.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      43. </beans><property name="basename" value="messages"/>
      44. </bean><property name="dataSource" ref="dataSource"/>
      45. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      46. <bean id="transactionManager" >
      47. <bean id="messageSource" >
      48. <beans>
      49.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      50. </beans><property name="basename" value="messages"/>
      51. </bean><property name="dataSource" ref="dataSource"/>
      52. </bean>System.out.println("Before method execution");
      53. <tx:annotation-driven transaction-manager="transactionManager"/>
      54. <bean id="transactionManager" >
      55. <bean id="messageSource" >
      56. <beans>
      57.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      58. </beans><property name="basename" value="messages"/>
      59. </bean><property name="dataSource" ref="dataSource"/>
      60. </bean>}
      61. }
      复制代码

三、Spring 事务管理
1. 请解释Spring中的事务管理。

  • 答案

    • Spring事务管理是一种机制,用于确保数据库操作的一致性和完整性。它可以将多个数据库操作封装在一个事务中,如果事务中的任何操作失败,全部操作都会回滚,保证数据的一致性。
    • Spring支持编程式事务管理和声明式事务管理:

      • 编程式事务管理:在代码中显式地控制事务的开始、提交和回滚。
      • 声明式事务管理:通过配置或注解将事务管理从业务逻辑中分离出来,更简洁,通常利用@Transactional注解。


2. 怎样利用Spring的声明式事务管理?

  • 答案

    • 利用XML配置
      1. <tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>
      复制代码
    • 利用注解
      1. import org.springframework.transaction.annotation.Transactional;@Service@Transactionalpublic class UserService {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>// 业务逻辑}
      复制代码

四、Spring 与数据库
1. 请解释Spring JDBC。

  • 答案

    • Spring JDBC是Spring框架对JDBC的封装,提供了更简洁、方便的方式来实行SQL操作,避免了大量的样板代码,如连接的获取、关闭,效果集的处置惩罚等。
    • 例如:
      1. import org.springframework.jdbc.core.JdbcTemplate;public class UserDao {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>private final JdbcTemplate jdbcTemplate;<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>public UserDao(JdbcTemplate jdbcTemplate) {<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>this.jdbcTemplate = jdbcTemplate;<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>public void addUser(String name) {<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      51. <bean id="transactionManager" >
      52. <bean id="messageSource" >
      53. <beans>
      54.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      55. </beans><property name="basename" value="messages"/>
      56. </bean><property name="dataSource" ref="dataSource"/>
      57. </bean>String sql = "INSERT INTO users (name) VALUES (?)";<tx:annotation-driven transaction-manager="transactionManager"/>
      58. <bean id="transactionManager" >
      59. <bean id="messageSource" >
      60. <beans>
      61.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      62. </beans><property name="basename" value="messages"/>
      63. </bean><property name="dataSource" ref="dataSource"/>
      64. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      65. <bean id="transactionManager" >
      66. <bean id="messageSource" >
      67. <beans>
      68.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      69. </beans><property name="basename" value="messages"/>
      70. </bean><property name="dataSource" ref="dataSource"/>
      71. </bean>jdbcTemplate.update(sql, name);<tx:annotation-driven transaction-manager="transactionManager"/>
      72. <bean id="transactionManager" >
      73. <bean id="messageSource" >
      74. <beans>
      75.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      76. </beans><property name="basename" value="messages"/>
      77. </bean><property name="dataSource" ref="dataSource"/>
      78. </bean>}}
      复制代码

2. 怎样利用Spring Data JPA?

  • 答案

    • Spring Data JPA是Spring对JPA(Java Persistence API)的支持,它简化了数据访问层的开发。
    • 例如:
      1. import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.stereotype.Repository;@Repositorypublic interface UserRepository extends JpaRepository {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>User findByName(String name);}
      复制代码

五、Spring MVC
1. 请解释Spring MVC的工作原理。

  • 答案

    • Spring MVC是一个基于Java的实现了Model-View-Controller(MVC)设计模式的框架,用于构建Web应用程序。
    • 工作原理:

      • 客户端发送请求到DispatcherServlet,它是Spring MVC的前端控制器。
      • DispatcherServlet将请求发送到相应的HandlerMapping,根据请求的URL查找对应的Handler(Controller)。
      • HandlerAdapter调用相应的Controller方法,处置惩罚请求并返回一个ModelAndView对象。
      • ViewResolver根据ModelAndView中的信息查找并渲染相应的视图。


2. 怎样在Spring MVC中实现一个简朴的控制器?

  • 答案

    • 利用注解
      1. import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class HelloWorldController {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@RequestMapping(value = "/hello", method = RequestMethod.GET)<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>@ResponseBody<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>public String hello() {<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean>return "Hello, World!";<tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>}}
      复制代码

六、Spring Boot
1. 请解释Spring Boot的重要特点。

  • 答案

    • Spring Boot是Spring框架的一个扩展,旨在简化Spring应用的开发和部署,重要特点包括:

      • 自动配置:根据类路径中的依赖自动配置Spring应用,淘汰了大量的配置文件。
      • 起步依赖(Starter dependencies):将常用的依赖打包在一起,方便引入,避免了依赖冲突和版本管理的问题。
      • 嵌入式容器:可以将应用程序和服务器(如Tomcat、Jetty)打包成一个可实行的JAR文件,方便部署。


2. 怎样创建一个Spring Boot应用程序?

  • 答案

    • 可以利用Spring Initializr(https://start.spring.io/)创建一个Spring Boot项目,或者在IDE中利用Spring Boot的项目创建向导。
    • 例如,一个简朴的Spring Boot应用:
      1. import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class MySpringBootApp {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>public static void main(String[] args) {<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>SpringApplication.run(MySpringBootApp.class, args);<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>}}
      复制代码

七、Spring Security
1. 请解释Spring Security的作用。

  • 答案

    • Spring Security是Spring提供的一个安全框架,用于保护Spring应用程序的安全,提供了认证、授权、防止CSRF攻击等功能。
    • 它可以轻松地集成到Spring应用中,确保只有经过授权的用户才能访问特定的资源。

2. 怎样配置Spring Security的基本认证?

  • 答案

    • 利用Java配置
      1. import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>protected void configure(AuthenticationManagerBuilder auth) throws Exception {<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>auth.inMemoryAuthentication()<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>  .withUser("user").password("{noop}password").roles("USER");<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean>}}
      复制代码

八、Spring 与微服务
1. 请解释Spring Cloud及其重要组件。

  • 答案

    • Spring Cloud是构建分布式系统和微服务架构的工具集,提供了一系列的组件来解决微服务中的常见问题。
    • 重要组件包括:

      • Eureka:服务注册和发现,允许服务注册本身并发现其他服务。
      • Ribbon:客户端负载均衡,将请求分配到多个服务实例。
      • Feign:声明式REST客户端,简化了服务间的调用。
      • Hystrix:断路器,防止服务雪崩,当服务不可用时提供降级和容错机制。


2. 怎样利用Spring Cloud实现服务注册和发现?

  • 答案

    • 利用Eureka

      • 服务端(Eureka Server)
        1. import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication@EnableEurekaServerpublic class EurekaServerApplication {<tx:annotation-driven transaction-manager="transactionManager"/>
        2. <bean id="transactionManager" >
        3. <bean id="messageSource" >
        4. <beans>
        5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        6. </beans><property name="basename" value="messages"/>
        7. </bean><property name="dataSource" ref="dataSource"/>
        8. </bean>public static void main(String[] args) {<tx:annotation-driven transaction-manager="transactionManager"/>
        9. <bean id="transactionManager" >
        10. <bean id="messageSource" >
        11. <beans>
        12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        13. </beans><property name="basename" value="messages"/>
        14. </bean><property name="dataSource" ref="dataSource"/>
        15. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        16. <bean id="transactionManager" >
        17. <bean id="messageSource" >
        18. <beans>
        19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        20. </beans><property name="basename" value="messages"/>
        21. </bean><property name="dataSource" ref="dataSource"/>
        22. </bean>SpringApplication.run(EurekaServerApplication.class, args);<tx:annotation-driven transaction-manager="transactionManager"/>
        23. <bean id="transactionManager" >
        24. <bean id="messageSource" >
        25. <beans>
        26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        27. </beans><property name="basename" value="messages"/>
        28. </bean><property name="dataSource" ref="dataSource"/>
        29. </bean>}}
        复制代码
      • 客户端(Eureka Client)
        1. import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.client.EnableEurekaClient;@SpringBootApplication@EnableEurekaClientpublic class EurekaClientApplication {<tx:annotation-driven transaction-manager="transactionManager"/>
        2. <bean id="transactionManager" >
        3. <bean id="messageSource" >
        4. <beans>
        5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        6. </beans><property name="basename" value="messages"/>
        7. </bean><property name="dataSource" ref="dataSource"/>
        8. </bean>public static void main(String[] args) {<tx:annotation-driven transaction-manager="transactionManager"/>
        9. <bean id="transactionManager" >
        10. <bean id="messageSource" >
        11. <beans>
        12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        13. </beans><property name="basename" value="messages"/>
        14. </bean><property name="dataSource" ref="dataSource"/>
        15. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        16. <bean id="transactionManager" >
        17. <bean id="messageSource" >
        18. <beans>
        19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        20. </beans><property name="basename" value="messages"/>
        21. </bean><property name="dataSource" ref="dataSource"/>
        22. </bean>SpringApplication.run(EurekaClientApplication.class, args);<tx:annotation-driven transaction-manager="transactionManager"/>
        23. <bean id="transactionManager" >
        24. <bean id="messageSource" >
        25. <beans>
        26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        27. </beans><property name="basename" value="messages"/>
        28. </bean><property name="dataSource" ref="dataSource"/>
        29. </bean>}}
        复制代码


九、Spring 测试
1. 怎样利用Spring Test进行单元测试和集成测试?

  • 答案

    • 单元测试
      1. import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;import org.springframework.test.web.servlet.MockMvc;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@WebMvcTest(HelloWorldController.class)public class HelloWorldControllerTest {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Autowired<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>private MockMvc mockMvc;<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>@Test<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>public void testHello() throws Exception {<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>mockMvc.perform(get("/hello"))<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      51. <bean id="transactionManager" >
      52. <bean id="messageSource" >
      53. <beans>
      54.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      55. </beans><property name="basename" value="messages"/>
      56. </bean><property name="dataSource" ref="dataSource"/>
      57. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      58. <bean id="transactionManager" >
      59. <bean id="messageSource" >
      60. <beans>
      61.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      62. </beans><property name="basename" value="messages"/>
      63. </bean><property name="dataSource" ref="dataSource"/>
      64. </bean>  .andExpect(status().isOk())<tx:annotation-driven transaction-manager="transactionManager"/>
      65. <bean id="transactionManager" >
      66. <bean id="messageSource" >
      67. <beans>
      68.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      69. </beans><property name="basename" value="messages"/>
      70. </bean><property name="dataSource" ref="dataSource"/>
      71. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      72. <bean id="transactionManager" >
      73. <bean id="messageSource" >
      74. <beans>
      75.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      76. </beans><property name="basename" value="messages"/>
      77. </bean><property name="dataSource" ref="dataSource"/>
      78. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      79. <bean id="transactionManager" >
      80. <bean id="messageSource" >
      81. <beans>
      82.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      83. </beans><property name="basename" value="messages"/>
      84. </bean><property name="dataSource" ref="dataSource"/>
      85. </bean>  .andExpect(content().string("Hello, World!"));<tx:annotation-driven transaction-manager="transactionManager"/>
      86. <bean id="transactionManager" >
      87. <bean id="messageSource" >
      88. <beans>
      89.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      90. </beans><property name="basename" value="messages"/>
      91. </bean><property name="dataSource" ref="dataSource"/>
      92. </bean>}}
      复制代码
    • 集成测试
      1. import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.assertEquals;@SpringBootTestpublic class UserServiceIntegrationTest {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Autowired<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>private UserService userService;<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>@Test<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>public void testAddUser() {<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>// 测试逻辑<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean>}}
      复制代码

十、Spring 生态和其他
1. 请解释Spring中的事件(Event)机制。

  • 答案

    • Spring事件机制允许组件之间进行松耦合的通信,一个组件可以发布事件,其他组件可以监听并处置惩罚这些事件。
    • 例如:
      1. import org.springframework.context.ApplicationEventPublisher;import org.springframework.context.ApplicationEventPublisherAware;import org.springframework.stereotype.Service;@Servicepublic class UserService implements ApplicationEventPublisherAware {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>private ApplicationEventPublisher eventPublisher;<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher) {<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean>this.eventPublisher = eventPublisher;<tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean>public void addUser(String name) {<tx:annotation-driven transaction-manager="transactionManager"/>
      51. <bean id="transactionManager" >
      52. <bean id="messageSource" >
      53. <beans>
      54.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      55. </beans><property name="basename" value="messages"/>
      56. </bean><property name="dataSource" ref="dataSource"/>
      57. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      58. <bean id="transactionManager" >
      59. <bean id="messageSource" >
      60. <beans>
      61.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      62. </beans><property name="basename" value="messages"/>
      63. </bean><property name="dataSource" ref="dataSource"/>
      64. </bean>// 业务逻辑<tx:annotation-driven transaction-manager="transactionManager"/>
      65. <bean id="transactionManager" >
      66. <bean id="messageSource" >
      67. <beans>
      68.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      69. </beans><property name="basename" value="messages"/>
      70. </bean><property name="dataSource" ref="dataSource"/>
      71. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      72. <bean id="transactionManager" >
      73. <bean id="messageSource" >
      74. <beans>
      75.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      76. </beans><property name="basename" value="messages"/>
      77. </bean><property name="dataSource" ref="dataSource"/>
      78. </bean>eventPublisher.publishEvent(new UserAddedEvent(this, name));<tx:annotation-driven transaction-manager="transactionManager"/>
      79. <bean id="transactionManager" >
      80. <bean id="messageSource" >
      81. <beans>
      82.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      83. </beans><property name="basename" value="messages"/>
      84. </bean><property name="dataSource" ref="dataSource"/>
      85. </bean>}}
      复制代码

2. 怎样在Spring中实现国际化(i18n)?

  • 答案

    • 利用资源文件

      • 创建资源文件(如messages.properties、messages_zh_CN.properties)。
      • 在Spring配置中启用国际化:
        1. <tx:annotation-driven transaction-manager="transactionManager"/>
        2. <bean id="transactionManager" >
        3. <bean id="messageSource" >
        4. <beans>
        5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        6. </beans><property name="basename" value="messages"/>
        7. </bean><property name="dataSource" ref="dataSource"/>
        8. </bean>
        复制代码


以上面试题涵盖了Spring框架的各个方面,从基础概念到高级应用,以及与其他Spring相干技术的集成。在准备2025年春招时,除了把握这些知识点,还必要对Spring框架的现实应用有深入的理解和实践经验,将理论知识与现实项目结合起来,展现本身解决问题的能力和开发经验。
Spring 高级部分

以下是Spring面试题的高级部分:
一、Spring高级配置与扩展
1. 怎样自定义Spring Bean的生命周期方法?

  • 答案

    • 可以利用以下几种方法自定义Spring Bean的生命周期方法:

      • 实现InitializingBean和DisposableBean接口:
        1. import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.DisposableBean;import org.springframework.stereotype.Component;@Componentpublic class CustomBean implements InitializingBean, DisposableBean {<tx:annotation-driven transaction-manager="transactionManager"/>
        2. <bean id="transactionManager" >
        3. <bean id="messageSource" >
        4. <beans>
        5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        6. </beans><property name="basename" value="messages"/>
        7. </bean><property name="dataSource" ref="dataSource"/>
        8. </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
        9. <bean id="transactionManager" >
        10. <bean id="messageSource" >
        11. <beans>
        12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        13. </beans><property name="basename" value="messages"/>
        14. </bean><property name="dataSource" ref="dataSource"/>
        15. </bean>public void afterPropertiesSet() throws Exception {<tx:annotation-driven transaction-manager="transactionManager"/>
        16. <bean id="transactionManager" >
        17. <bean id="messageSource" >
        18. <beans>
        19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        20. </beans><property name="basename" value="messages"/>
        21. </bean><property name="dataSource" ref="dataSource"/>
        22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        23. <bean id="transactionManager" >
        24. <bean id="messageSource" >
        25. <beans>
        26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        27. </beans><property name="basename" value="messages"/>
        28. </bean><property name="dataSource" ref="dataSource"/>
        29. </bean>// 初始化方法,在Bean的属性设置完成后调用<tx:annotation-driven transaction-manager="transactionManager"/>
        30. <bean id="transactionManager" >
        31. <bean id="messageSource" >
        32. <beans>
        33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        34. </beans><property name="basename" value="messages"/>
        35. </bean><property name="dataSource" ref="dataSource"/>
        36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        37. <bean id="transactionManager" >
        38. <bean id="messageSource" >
        39. <beans>
        40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        41. </beans><property name="basename" value="messages"/>
        42. </bean><property name="dataSource" ref="dataSource"/>
        43. </bean>System.out.println("CustomBean is initialized.");<tx:annotation-driven transaction-manager="transactionManager"/>
        44. <bean id="transactionManager" >
        45. <bean id="messageSource" >
        46. <beans>
        47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        48. </beans><property name="basename" value="messages"/>
        49. </bean><property name="dataSource" ref="dataSource"/>
        50. </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
        51. <bean id="transactionManager" >
        52. <bean id="messageSource" >
        53. <beans>
        54.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        55. </beans><property name="basename" value="messages"/>
        56. </bean><property name="dataSource" ref="dataSource"/>
        57. </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
        58. <bean id="transactionManager" >
        59. <bean id="messageSource" >
        60. <beans>
        61.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        62. </beans><property name="basename" value="messages"/>
        63. </bean><property name="dataSource" ref="dataSource"/>
        64. </bean>public void destroy() throws Exception {<tx:annotation-driven transaction-manager="transactionManager"/>
        65. <bean id="transactionManager" >
        66. <bean id="messageSource" >
        67. <beans>
        68.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        69. </beans><property name="basename" value="messages"/>
        70. </bean><property name="dataSource" ref="dataSource"/>
        71. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        72. <bean id="transactionManager" >
        73. <bean id="messageSource" >
        74. <beans>
        75.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        76. </beans><property name="basename" value="messages"/>
        77. </bean><property name="dataSource" ref="dataSource"/>
        78. </bean>// 烧毁方法,在Bean烧毁时调用<tx:annotation-driven transaction-manager="transactionManager"/>
        79. <bean id="transactionManager" >
        80. <bean id="messageSource" >
        81. <beans>
        82.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        83. </beans><property name="basename" value="messages"/>
        84. </bean><property name="dataSource" ref="dataSource"/>
        85. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        86. <bean id="transactionManager" >
        87. <bean id="messageSource" >
        88. <beans>
        89.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        90. </beans><property name="basename" value="messages"/>
        91. </bean><property name="dataSource" ref="dataSource"/>
        92. </bean>System.out.println("CustomBean is destroyed.");<tx:annotation-driven transaction-manager="transactionManager"/>
        93. <bean id="transactionManager" >
        94. <bean id="messageSource" >
        95. <beans>
        96.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        97. </beans><property name="basename" value="messages"/>
        98. </bean><property name="dataSource" ref="dataSource"/>
        99. </bean>}}
        复制代码
      • 利用@PostConstruct和@PreDestroy注解:
        1. import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;import org.springframework.stereotype.Component;@Componentpublic class CustomBean {<tx:annotation-driven transaction-manager="transactionManager"/>
        2. <bean id="transactionManager" >
        3. <bean id="messageSource" >
        4. <beans>
        5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        6. </beans><property name="basename" value="messages"/>
        7. </bean><property name="dataSource" ref="dataSource"/>
        8. </bean>@PostConstruct<tx:annotation-driven transaction-manager="transactionManager"/>
        9. <bean id="transactionManager" >
        10. <bean id="messageSource" >
        11. <beans>
        12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        13. </beans><property name="basename" value="messages"/>
        14. </bean><property name="dataSource" ref="dataSource"/>
        15. </bean>public void init() {<tx:annotation-driven transaction-manager="transactionManager"/>
        16. <bean id="transactionManager" >
        17. <bean id="messageSource" >
        18. <beans>
        19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        20. </beans><property name="basename" value="messages"/>
        21. </bean><property name="dataSource" ref="dataSource"/>
        22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        23. <bean id="transactionManager" >
        24. <bean id="messageSource" >
        25. <beans>
        26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        27. </beans><property name="basename" value="messages"/>
        28. </bean><property name="dataSource" ref="dataSource"/>
        29. </bean>// 初始化方法,在Bean的属性设置完成后调用<tx:annotation-driven transaction-manager="transactionManager"/>
        30. <bean id="transactionManager" >
        31. <bean id="messageSource" >
        32. <beans>
        33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        34. </beans><property name="basename" value="messages"/>
        35. </bean><property name="dataSource" ref="dataSource"/>
        36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        37. <bean id="transactionManager" >
        38. <bean id="messageSource" >
        39. <beans>
        40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        41. </beans><property name="basename" value="messages"/>
        42. </bean><property name="dataSource" ref="dataSource"/>
        43. </bean>System.out.println("CustomBean is initialized.");<tx:annotation-driven transaction-manager="transactionManager"/>
        44. <bean id="transactionManager" >
        45. <bean id="messageSource" >
        46. <beans>
        47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        48. </beans><property name="basename" value="messages"/>
        49. </bean><property name="dataSource" ref="dataSource"/>
        50. </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
        51. <bean id="transactionManager" >
        52. <bean id="messageSource" >
        53. <beans>
        54.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        55. </beans><property name="basename" value="messages"/>
        56. </bean><property name="dataSource" ref="dataSource"/>
        57. </bean>@PreDestroy<tx:annotation-driven transaction-manager="transactionManager"/>
        58. <bean id="transactionManager" >
        59. <bean id="messageSource" >
        60. <beans>
        61.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        62. </beans><property name="basename" value="messages"/>
        63. </bean><property name="dataSource" ref="dataSource"/>
        64. </bean>public void destroy() {<tx:annotation-driven transaction-manager="transactionManager"/>
        65. <bean id="transactionManager" >
        66. <bean id="messageSource" >
        67. <beans>
        68.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        69. </beans><property name="basename" value="messages"/>
        70. </bean><property name="dataSource" ref="dataSource"/>
        71. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        72. <bean id="transactionManager" >
        73. <bean id="messageSource" >
        74. <beans>
        75.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        76. </beans><property name="basename" value="messages"/>
        77. </bean><property name="dataSource" ref="dataSource"/>
        78. </bean>// 烧毁方法,在Bean烧毁时调用<tx:annotation-driven transaction-manager="transactionManager"/>
        79. <bean id="transactionManager" >
        80. <bean id="messageSource" >
        81. <beans>
        82.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        83. </beans><property name="basename" value="messages"/>
        84. </bean><property name="dataSource" ref="dataSource"/>
        85. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        86. <bean id="transactionManager" >
        87. <bean id="messageSource" >
        88. <beans>
        89.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        90. </beans><property name="basename" value="messages"/>
        91. </bean><property name="dataSource" ref="dataSource"/>
        92. </bean>System.out.println("CustomBean is destroyed.");<tx:annotation-driven transaction-manager="transactionManager"/>
        93. <bean id="transactionManager" >
        94. <bean id="messageSource" >
        95. <beans>
        96.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        97. </beans><property name="basename" value="messages"/>
        98. </bean><property name="dataSource" ref="dataSource"/>
        99. </bean>}}
        复制代码
      • 利用XML配置的init-method和destroy-method:
        1. <tx:annotation-driven transaction-manager="transactionManager"/>
        2. <bean id="transactionManager" >
        3. <bean id="messageSource" >
        4. <beans>
        5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        6. </beans><property name="basename" value="messages"/>
        7. </bean><property name="dataSource" ref="dataSource"/>
        8. </bean>
        复制代码


2. 怎样在Spring中实现条件化的Bean创建?

  • 答案

    • 利用@Conditional注解:
      1. import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Conditional;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Profile;@Configurationpublic class ConditionalBeanConfig {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Bean<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>@Conditional(MyCondition.class)<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>public MyBean myBean() {<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean>return new MyBean();<tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>}}
      复制代码
    • MyCondition是一个实现了Condition接口的类,用于判断是否满意创建Bean的条件:
      1. import org.springframework.context.annotation.Condition;import org.springframework.context.annotation.ConditionContext;import org.springframework.core.type.AnnotatedTypeMetadata;public class MyCondition implements Condition {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>// 可以根据环境变量、系统属性等条件来判断是否创建Bean<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>return true;<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean>}}
      复制代码

3. 怎样在Spring中扩展BeanFactoryPostProcessor和BeanPostProcessor?

  • 答案

    • BeanFactoryPostProcessor

      • 可以在Bean实例化之前修改Bean的定义,例如修改Bean的属性值。
      1. import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanFactoryPostProcessor;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;import org.springframework.stereotype.Component;@Componentpublic class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>// 可以修改BeanFactory中的Bean定义<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean>}}
      复制代码
    • BeanPostProcessor

      • 可以在Bean实例化之后,初始化之前和初始化之后对Bean进行处置惩罚,例如对Bean进行包装或添加额外的属性。
      1. import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.stereotype.Component;@Componentpublic class MyBeanPostProcessor implements BeanPostProcessor {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>// 在Bean初始化之前处置惩罚<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>return bean;<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
      51. <bean id="transactionManager" >
      52. <bean id="messageSource" >
      53. <beans>
      54.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      55. </beans><property name="basename" value="messages"/>
      56. </bean><property name="dataSource" ref="dataSource"/>
      57. </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
      58. <bean id="transactionManager" >
      59. <bean id="messageSource" >
      60. <beans>
      61.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      62. </beans><property name="basename" value="messages"/>
      63. </bean><property name="dataSource" ref="dataSource"/>
      64. </bean>public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {<tx:annotation-driven transaction-manager="transactionManager"/>
      65. <bean id="transactionManager" >
      66. <bean id="messageSource" >
      67. <beans>
      68.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      69. </beans><property name="basename" value="messages"/>
      70. </bean><property name="dataSource" ref="dataSource"/>
      71. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      72. <bean id="transactionManager" >
      73. <bean id="messageSource" >
      74. <beans>
      75.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      76. </beans><property name="basename" value="messages"/>
      77. </bean><property name="dataSource" ref="dataSource"/>
      78. </bean>// 在Bean初始化之后处置惩罚<tx:annotation-driven transaction-manager="transactionManager"/>
      79. <bean id="transactionManager" >
      80. <bean id="messageSource" >
      81. <beans>
      82.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      83. </beans><property name="basename" value="messages"/>
      84. </bean><property name="dataSource" ref="dataSource"/>
      85. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      86. <bean id="transactionManager" >
      87. <bean id="messageSource" >
      88. <beans>
      89.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      90. </beans><property name="basename" value="messages"/>
      91. </bean><property name="dataSource" ref="dataSource"/>
      92. </bean>return bean;<tx:annotation-driven transaction-manager="transactionManager"/>
      93. <bean id="transactionManager" >
      94. <bean id="messageSource" >
      95. <beans>
      96.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      97. </beans><property name="basename" value="messages"/>
      98. </bean><property name="dataSource" ref="dataSource"/>
      99. </bean>}}
      复制代码

二、Spring AOP高级话题
1. 怎样实现自定义的切入点表达式?

  • 答案

    • 可以利用AspectJ的切入点表达式语言,或者实现Pointcut接口:
      1. import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.stereotype.Component;import java.lang.reflect.Method;@Aspect@Componentpublic class CustomAspect {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Pointcut("execution(* *(..)) && @annotation(MyAnnotation)")<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>public void customPointcut() {}<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>@Before("customPointcut()")<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>public void beforeMethod() {<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>// 自定义切入点逻辑<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean>}}
      复制代码
    • 这里利用了自定义注解@MyAnnotation来定义切入点,而且可以根据必要自定义注解:
      1. import java.lang.annotation.ElementType;
      2. import java.lang.annotation.Retention;
      3. import java.lang.annotation.RetentionPolicy;
      4. import java.lang.annotation.Target;
      5. @Target(ElementType.METHOD)
      6. @Retention(RetentionPolicy.RUNTIME)
      7. public class MyAnnotation {
      8. }
      复制代码

2. 怎样在Spring AOP中传递参数给通知(Advice)?

  • 答案

    • 可以利用args关键字传递参数:
      1. import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;@Aspect@Componentpublic class ParameterAspect {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Pointcut("execution(* *(..)) && args(param)")<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>public void parameterPointcut(String param) {}<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>@Before("parameterPointcut(param)")<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>public void beforeMethod(String param) {<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>// 利用参数<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      51. <bean id="transactionManager" >
      52. <bean id="messageSource" >
      53. <beans>
      54.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      55. </beans><property name="basename" value="messages"/>
      56. </bean><property name="dataSource" ref="dataSource"/>
      57. </bean>System.out.println("Parameter: " + param);<tx:annotation-driven transaction-manager="transactionManager"/>
      58. <bean id="transactionManager" >
      59. <bean id="messageSource" >
      60. <beans>
      61.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      62. </beans><property name="basename" value="messages"/>
      63. </bean><property name="dataSource" ref="dataSource"/>
      64. </bean>}}
      复制代码

三、Spring事务高级话题
1. 怎样处置惩罚嵌套事务?

  • 答案

    • Spring支持多种事务传播举动,可以利用@Transactional注解的propagation属性来设置:
      1. import org.springframework.transaction.annotation.Transactional;import org.springframework.stereotype.Service;@Servicepublic class NestedTransactionService {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Transactional(propagation = Propagation.REQUIRED)<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>public void outerMethod() {<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>// 外层事务方法<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>innerMethod();<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
      51. <bean id="transactionManager" >
      52. <bean id="messageSource" >
      53. <beans>
      54.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      55. </beans><property name="basename" value="messages"/>
      56. </bean><property name="dataSource" ref="dataSource"/>
      57. </bean>@Transactional(propagation = Propagation.NESTED)<tx:annotation-driven transaction-manager="transactionManager"/>
      58. <bean id="transactionManager" >
      59. <bean id="messageSource" >
      60. <beans>
      61.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      62. </beans><property name="basename" value="messages"/>
      63. </bean><property name="dataSource" ref="dataSource"/>
      64. </bean>public void innerMethod() {<tx:annotation-driven transaction-manager="transactionManager"/>
      65. <bean id="transactionManager" >
      66. <bean id="messageSource" >
      67. <beans>
      68.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      69. </beans><property name="basename" value="messages"/>
      70. </bean><property name="dataSource" ref="dataSource"/>
      71. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      72. <bean id="transactionManager" >
      73. <bean id="messageSource" >
      74. <beans>
      75.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      76. </beans><property name="basename" value="messages"/>
      77. </bean><property name="dataSource" ref="dataSource"/>
      78. </bean>// 内层事务方法,可以作为外层事务的嵌套事务<tx:annotation-driven transaction-manager="transactionManager"/>
      79. <bean id="transactionManager" >
      80. <bean id="messageSource" >
      81. <beans>
      82.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      83. </beans><property name="basename" value="messages"/>
      84. </bean><property name="dataSource" ref="dataSource"/>
      85. </bean>}}
      复制代码
    • 常见的事务传播举动:

      • REQUIRED:如果当前存在事务,则加入该事务,否则创建一个新事务。
      • NESTED:如果当前存在事务,则作为嵌套事务实行,否则创建一个新事务。


2. 怎样在Spring中实现分布式事务?

  • 答案

    • 可以利用以下几种方法实现分布式事务:

      • JTA(Java Transaction API):利用全局事务管理器,适用于多数据源或多资源的事务管理。
      • 分布式事务中间件,如Atomikos、Bitronix等:
        1. import javax.transaction.TransactionManager;import javax.transaction.UserTransaction;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.transaction.jta.JtaTransactionManager;import com.atomikos.icatch.jta.UserTransactionImp;import com.atomikos.icatch.jta.UserTransactionManager;@Configurationpublic class DistributedTransactionConfig {<tx:annotation-driven transaction-manager="transactionManager"/>
        2. <bean id="transactionManager" >
        3. <bean id="messageSource" >
        4. <beans>
        5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        6. </beans><property name="basename" value="messages"/>
        7. </bean><property name="dataSource" ref="dataSource"/>
        8. </bean>@Bean<tx:annotation-driven transaction-manager="transactionManager"/>
        9. <bean id="transactionManager" >
        10. <bean id="messageSource" >
        11. <beans>
        12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        13. </beans><property name="basename" value="messages"/>
        14. </bean><property name="dataSource" ref="dataSource"/>
        15. </bean>public UserTransaction userTransaction() throws Throwable {<tx:annotation-driven transaction-manager="transactionManager"/>
        16. <bean id="transactionManager" >
        17. <bean id="messageSource" >
        18. <beans>
        19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        20. </beans><property name="basename" value="messages"/>
        21. </bean><property name="dataSource" ref="dataSource"/>
        22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        23. <bean id="transactionManager" >
        24. <bean id="messageSource" >
        25. <beans>
        26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        27. </beans><property name="basename" value="messages"/>
        28. </bean><property name="dataSource" ref="dataSource"/>
        29. </bean>UserTransactionImp userTransactionImp = new UserTransactionImp();<tx:annotation-driven transaction-manager="transactionManager"/>
        30. <bean id="transactionManager" >
        31. <bean id="messageSource" >
        32. <beans>
        33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        34. </beans><property name="basename" value="messages"/>
        35. </bean><property name="dataSource" ref="dataSource"/>
        36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        37. <bean id="transactionManager" >
        38. <bean id="messageSource" >
        39. <beans>
        40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        41. </beans><property name="basename" value="messages"/>
        42. </bean><property name="dataSource" ref="dataSource"/>
        43. </bean>userTransactionImp.setTransactionTimeout(300);<tx:annotation-driven transaction-manager="transactionManager"/>
        44. <bean id="transactionManager" >
        45. <bean id="messageSource" >
        46. <beans>
        47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        48. </beans><property name="basename" value="messages"/>
        49. </bean><property name="dataSource" ref="dataSource"/>
        50. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        51. <bean id="transactionManager" >
        52. <bean id="messageSource" >
        53. <beans>
        54.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        55. </beans><property name="basename" value="messages"/>
        56. </bean><property name="dataSource" ref="dataSource"/>
        57. </bean>return userTransactionImp;<tx:annotation-driven transaction-manager="transactionManager"/>
        58. <bean id="transactionManager" >
        59. <bean id="messageSource" >
        60. <beans>
        61.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        62. </beans><property name="basename" value="messages"/>
        63. </bean><property name="dataSource" ref="dataSource"/>
        64. </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
        65. <bean id="transactionManager" >
        66. <bean id="messageSource" >
        67. <beans>
        68.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        69. </beans><property name="basename" value="messages"/>
        70. </bean><property name="dataSource" ref="dataSource"/>
        71. </bean>@Bean<tx:annotation-driven transaction-manager="transactionManager"/>
        72. <bean id="transactionManager" >
        73. <bean id="messageSource" >
        74. <beans>
        75.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        76. </beans><property name="basename" value="messages"/>
        77. </bean><property name="dataSource" ref="dataSource"/>
        78. </bean>public TransactionManager atomikosTransactionManager() {<tx:annotation-driven transaction-manager="transactionManager"/>
        79. <bean id="transactionManager" >
        80. <bean id="messageSource" >
        81. <beans>
        82.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        83. </beans><property name="basename" value="messages"/>
        84. </bean><property name="dataSource" ref="dataSource"/>
        85. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        86. <bean id="transactionManager" >
        87. <bean id="messageSource" >
        88. <beans>
        89.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        90. </beans><property name="basename" value="messages"/>
        91. </bean><property name="dataSource" ref="dataSource"/>
        92. </bean>return new UserTransactionManager();<tx:annotation-driven transaction-manager="transactionManager"/>
        93. <bean id="transactionManager" >
        94. <bean id="messageSource" >
        95. <beans>
        96.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        97. </beans><property name="basename" value="messages"/>
        98. </bean><property name="dataSource" ref="dataSource"/>
        99. </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
        100. <bean id="transactionManager" >
        101. <bean id="messageSource" >
        102. <beans>
        103.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        104. </beans><property name="basename" value="messages"/>
        105. </bean><property name="dataSource" ref="dataSource"/>
        106. </bean>@Bean<tx:annotation-driven transaction-manager="transactionManager"/>
        107. <bean id="transactionManager" >
        108. <bean id="messageSource" >
        109. <beans>
        110.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        111. </beans><property name="basename" value="messages"/>
        112. </bean><property name="dataSource" ref="dataSource"/>
        113. </bean>public JtaTransactionManager transactionManager() throws Throwable {<tx:annotation-driven transaction-manager="transactionManager"/>
        114. <bean id="transactionManager" >
        115. <bean id="messageSource" >
        116. <beans>
        117.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        118. </beans><property name="basename" value="messages"/>
        119. </bean><property name="dataSource" ref="dataSource"/>
        120. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        121. <bean id="transactionManager" >
        122. <bean id="messageSource" >
        123. <beans>
        124.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        125. </beans><property name="basename" value="messages"/>
        126. </bean><property name="dataSource" ref="dataSource"/>
        127. </bean>JtaTransactionManager transactionManager = new JtaTransactionManager();<tx:annotation-driven transaction-manager="transactionManager"/>
        128. <bean id="transactionManager" >
        129. <bean id="messageSource" >
        130. <beans>
        131.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        132. </beans><property name="basename" value="messages"/>
        133. </bean><property name="dataSource" ref="dataSource"/>
        134. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        135. <bean id="transactionManager" >
        136. <bean id="messageSource" >
        137. <beans>
        138.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        139. </beans><property name="basename" value="messages"/>
        140. </bean><property name="dataSource" ref="dataSource"/>
        141. </bean>transactionManager.setTransactionManager(atomikosTransactionManager());<tx:annotation-driven transaction-manager="transactionManager"/>
        142. <bean id="transactionManager" >
        143. <bean id="messageSource" >
        144. <beans>
        145.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        146. </beans><property name="basename" value="messages"/>
        147. </bean><property name="dataSource" ref="dataSource"/>
        148. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        149. <bean id="transactionManager" >
        150. <bean id="messageSource" >
        151. <beans>
        152.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        153. </beans><property name="basename" value="messages"/>
        154. </bean><property name="dataSource" ref="dataSource"/>
        155. </bean>transactionManager.setUserTransaction(userTransaction());<tx:annotation-driven transaction-manager="transactionManager"/>
        156. <bean id="transactionManager" >
        157. <bean id="messageSource" >
        158. <beans>
        159.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        160. </beans><property name="basename" value="messages"/>
        161. </bean><property name="dataSource" ref="dataSource"/>
        162. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
        163. <bean id="transactionManager" >
        164. <bean id="messageSource" >
        165. <beans>
        166.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        167. </beans><property name="basename" value="messages"/>
        168. </bean><property name="dataSource" ref="dataSource"/>
        169. </bean>return transactionManager;<tx:annotation-driven transaction-manager="transactionManager"/>
        170. <bean id="transactionManager" >
        171. <bean id="messageSource" >
        172. <beans>
        173.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
        174. </beans><property name="basename" value="messages"/>
        175. </bean><property name="dataSource" ref="dataSource"/>
        176. </bean>}}
        复制代码


四、Spring 与分布式系统
1. 怎样利用Spring Cloud实现服务间的负载均衡?

  • 答案

    • 利用Spring Cloud Ribbon:
      1. import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;@Configurationpublic class RibbonConfig {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Bean<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>@LoadBalanced<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>public RestTemplate restTemplate() {<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean>return new RestTemplate();<tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>}}
      复制代码
    • 在服务调用时利用RestTemplate:
      1. import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;@RestControllerpublic class ServiceConsumerController {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Autowired<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>private RestTemplate restTemplate;<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>@GetMapping("/callService")<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>public String callService() {<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>return restTemplate.getForObject("http://service-provider/hello", String.class);<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean>}}
      复制代码

2. 怎样利用Spring Cloud实现断路器模式(Hystrix)?

  • 答案

    • 利用@HystrixCommand注解:
      1. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ServiceConsumerController {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@HystrixCommand(fallbackMethod = "fallbackMethod")<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>@GetMapping("/callService")<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>public String callService() {<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean>// 服务调用逻辑<tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
      44. <bean id="transactionManager" >
      45. <bean id="messageSource" >
      46. <beans>
      47.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      48. </beans><property name="basename" value="messages"/>
      49. </bean><property name="dataSource" ref="dataSource"/>
      50. </bean>public String fallbackMethod() {<tx:annotation-driven transaction-manager="transactionManager"/>
      51. <bean id="transactionManager" >
      52. <bean id="messageSource" >
      53. <beans>
      54.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      55. </beans><property name="basename" value="messages"/>
      56. </bean><property name="dataSource" ref="dataSource"/>
      57. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      58. <bean id="transactionManager" >
      59. <bean id="messageSource" >
      60. <beans>
      61.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      62. </beans><property name="basename" value="messages"/>
      63. </bean><property name="dataSource" ref="dataSource"/>
      64. </bean>// 降级逻辑<tx:annotation-driven transaction-manager="transactionManager"/>
      65. <bean id="transactionManager" >
      66. <bean id="messageSource" >
      67. <beans>
      68.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      69. </beans><property name="basename" value="messages"/>
      70. </bean><property name="dataSource" ref="dataSource"/>
      71. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      72. <bean id="transactionManager" >
      73. <bean id="messageSource" >
      74. <beans>
      75.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      76. </beans><property name="basename" value="messages"/>
      77. </bean><property name="dataSource" ref="dataSource"/>
      78. </bean>return "Service is down. Please try again later.";<tx:annotation-driven transaction-manager="transactionManager"/>
      79. <bean id="transactionManager" >
      80. <bean id="messageSource" >
      81. <beans>
      82.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      83. </beans><property name="basename" value="messages"/>
      84. </bean><property name="dataSource" ref="dataSource"/>
      85. </bean>}}
      复制代码

五、Spring 与消息队列
1. 怎样在Spring中集成消息队列(如RabbitMQ)?

  • 答案

    • 首先,添加RabbitMQ依赖:
      1. <tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>org.springframework.boot<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>spring-boot-starter-amqp
      复制代码
    • 配置RabbitMQ:
      1. import org.springframework.amqp.core.Queue;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class RabbitMQConfig {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Bean<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>public Queue queue() {<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>return new Queue("myQueue");<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean>}}
      复制代码
    • 发送消息:
      1. import org.springframework.amqp.core.AmqpTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;@Componentpublic class MessageSender {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Autowired<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>private AmqpTemplate amqpTemplate;<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>public void sendMessage(String message) {<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean>amqpTemplate.convertAndSend("myQueue", message);<tx:annotation-driven transaction-manager="transactionManager"/>
      37. <bean id="transactionManager" >
      38. <bean id="messageSource" >
      39. <beans>
      40.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      41. </beans><property name="basename" value="messages"/>
      42. </bean><property name="dataSource" ref="dataSource"/>
      43. </bean>}}
      复制代码
    • 接收消息:
      1. import org.springframework.amqp.rabbit.annotation.RabbitListener;import org.springframework.stereotype.Component;@Componentpublic class MessageReceiver {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@RabbitListener(queues = "myQueue")<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>public void receiveMessage(String message) {<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>System.out.println("Received message: " + message);<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean>}}
      复制代码

六、Spring 性能优化
1. 怎样优化Spring应用的启动时间?

  • 答案

    • 可以从以下几个方面优化Spring应用的启动时间:

      • 淘汰自动配置:排除不必要的自动配置,利用exclude属性。
      1. import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})public class MySpringBootApp {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>public static void main(String[] args) {<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>SpringApplication.run(MySpringBootApp.class, args);<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>}}
      复制代码

      • 优化依赖注入:避免复杂的构造函数注入,利用@Lazy注解延长加载非关键的Bean。


2. 怎样优化Spring应用的内存利用?

  • 答案

    • 可以思量以下几点:

      • 公道利用缓存:利用Spring Cache抽象,如利用Redis作为缓存存储。
      1. import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Servicepublic class UserService {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Cacheable("users")<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>public User getUserById(Long id) {<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>// 从数据库获取用户信息<tx:annotation-driven transaction-manager="transactionManager"/>
      30. <bean id="transactionManager" >
      31. <bean id="messageSource" >
      32. <beans>
      33.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      34. </beans><property name="basename" value="messages"/>
      35. </bean><property name="dataSource" ref="dataSource"/>
      36. </bean>}}
      复制代码

      • 优化Bean的作用域:利用@Scope注解调整Bean的作用域,避免不必要的Bean创建。


七、Spring 框架深度剖析
1. 请解释Spring的设计模式和原则。

  • 答案

    • Spring大量利用了设计模式,例如:

      • 工厂模式:BeanFactory和ApplicationContext利用工厂模式创建Bean。
      • 代理模式:在AOP中利用代理模式实现切面逻辑。
      • 单例模式:默认环境下,Spring的Bean是单例模式,确保一个Bean只有一个实例。
      • 模板模式:如JdbcTemplate、JmsTemplate等模板类,将通用逻辑封装,让开发者专注于业务逻辑。


2. 怎样深入理解Spring的自动配置原理?

  • 答案

    • Spring Boot的自动配置基于@Conditional注解和AutoConfiguration类。Spring Boot会根据类路径下的依赖和配置条件自动配置Spring应用。
    • 焦点类包括:

      • @SpringBootApplication:组合了多个注解,包括@EnableAutoConfiguration。
      • @EnableAutoConfiguration:启用自动配置,通过AutoConfigurationImportSelector导入自动配置类。


八、Spring 与微服务架构的高级实践
1. 怎样实现服务网关(Spring Cloud Gateway)?

  • 答案

    • 首先,添加Spring Cloud Gateway依赖:
      1. <tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>org.springframework.cloud<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>spring-cloud-starter-gateway
      复制代码
    • 配置服务网关:
      1. import org.springframework.cloud.gateway.route.RouteLocator;import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class GatewayConfig {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>@Bean<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {<tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>return builder.routes()<beans>
      30. <tx:annotation-driven transaction-manager="transactionManager"/>
      31. <bean id="transactionManager" >
      32. <bean id="messageSource" >
      33. <beans>
      34.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      35. </beans><property name="basename" value="messages"/>
      36. </bean><property name="dataSource" ref="dataSource"/>
      37. </bean><bean id="userService" >
      38. <tx:annotation-driven transaction-manager="transactionManager"/>
      39. <bean id="transactionManager" >
      40. <bean id="messageSource" >
      41. <beans>
      42.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      43. </beans><property name="basename" value="messages"/>
      44. </bean><property name="dataSource" ref="dataSource"/>
      45. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      46. <bean id="transactionManager" >
      47. <bean id="messageSource" >
      48. <beans>
      49.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      50. </beans><property name="basename" value="messages"/>
      51. </bean><property name="dataSource" ref="dataSource"/>
      52. </bean><property name="userRepository" ref="userRepository"/>
      53. <tx:annotation-driven transaction-manager="transactionManager"/>
      54. <bean id="transactionManager" >
      55. <bean id="messageSource" >
      56. <beans>
      57.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      58. </beans><property name="basename" value="messages"/>
      59. </bean><property name="dataSource" ref="dataSource"/>
      60. </bean></bean>
      61. <tx:annotation-driven transaction-manager="transactionManager"/>
      62. <bean id="transactionManager" >
      63. <bean id="messageSource" >
      64. <beans>
      65.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      66. </beans><property name="basename" value="messages"/>
      67. </bean><property name="dataSource" ref="dataSource"/>
      68. </bean><bean id="userRepository" />
      69. </beans>.route("path_route", r -> r.path("/get")<beans>
      70. <tx:annotation-driven transaction-manager="transactionManager"/>
      71. <bean id="transactionManager" >
      72. <bean id="messageSource" >
      73. <beans>
      74.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      75. </beans><property name="basename" value="messages"/>
      76. </bean><property name="dataSource" ref="dataSource"/>
      77. </bean><bean id="userService" >
      78. <tx:annotation-driven transaction-manager="transactionManager"/>
      79. <bean id="transactionManager" >
      80. <bean id="messageSource" >
      81. <beans>
      82.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      83. </beans><property name="basename" value="messages"/>
      84. </bean><property name="dataSource" ref="dataSource"/>
      85. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      86. <bean id="transactionManager" >
      87. <bean id="messageSource" >
      88. <beans>
      89.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      90. </beans><property name="basename" value="messages"/>
      91. </bean><property name="dataSource" ref="dataSource"/>
      92. </bean><property name="userRepository" ref="userRepository"/>
      93. <tx:annotation-driven transaction-manager="transactionManager"/>
      94. <bean id="transactionManager" >
      95. <bean id="messageSource" >
      96. <beans>
      97.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      98. </beans><property name="basename" value="messages"/>
      99. </bean><property name="dataSource" ref="dataSource"/>
      100. </bean></bean>
      101. <tx:annotation-driven transaction-manager="transactionManager"/>
      102. <bean id="transactionManager" >
      103. <bean id="messageSource" >
      104. <beans>
      105.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      106. </beans><property name="basename" value="messages"/>
      107. </bean><property name="dataSource" ref="dataSource"/>
      108. </bean><bean id="userRepository" />
      109. </beans><beans>
      110. <tx:annotation-driven transaction-manager="transactionManager"/>
      111. <bean id="transactionManager" >
      112. <bean id="messageSource" >
      113. <beans>
      114.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      115. </beans><property name="basename" value="messages"/>
      116. </bean><property name="dataSource" ref="dataSource"/>
      117. </bean><bean id="userService" >
      118. <tx:annotation-driven transaction-manager="transactionManager"/>
      119. <bean id="transactionManager" >
      120. <bean id="messageSource" >
      121. <beans>
      122.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      123. </beans><property name="basename" value="messages"/>
      124. </bean><property name="dataSource" ref="dataSource"/>
      125. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      126. <bean id="transactionManager" >
      127. <bean id="messageSource" >
      128. <beans>
      129.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      130. </beans><property name="basename" value="messages"/>
      131. </bean><property name="dataSource" ref="dataSource"/>
      132. </bean><property name="userRepository" ref="userRepository"/>
      133. <tx:annotation-driven transaction-manager="transactionManager"/>
      134. <bean id="transactionManager" >
      135. <bean id="messageSource" >
      136. <beans>
      137.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      138. </beans><property name="basename" value="messages"/>
      139. </bean><property name="dataSource" ref="dataSource"/>
      140. </bean></bean>
      141. <tx:annotation-driven transaction-manager="transactionManager"/>
      142. <bean id="transactionManager" >
      143. <bean id="messageSource" >
      144. <beans>
      145.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      146. </beans><property name="basename" value="messages"/>
      147. </bean><property name="dataSource" ref="dataSource"/>
      148. </bean><bean id="userRepository" />
      149. </beans>  .uri("http://httpbin.org"))<beans>
      150. <tx:annotation-driven transaction-manager="transactionManager"/>
      151. <bean id="transactionManager" >
      152. <bean id="messageSource" >
      153. <beans>
      154.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      155. </beans><property name="basename" value="messages"/>
      156. </bean><property name="dataSource" ref="dataSource"/>
      157. </bean><bean id="userService" >
      158. <tx:annotation-driven transaction-manager="transactionManager"/>
      159. <bean id="transactionManager" >
      160. <bean id="messageSource" >
      161. <beans>
      162.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      163. </beans><property name="basename" value="messages"/>
      164. </bean><property name="dataSource" ref="dataSource"/>
      165. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      166. <bean id="transactionManager" >
      167. <bean id="messageSource" >
      168. <beans>
      169.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      170. </beans><property name="basename" value="messages"/>
      171. </bean><property name="dataSource" ref="dataSource"/>
      172. </bean><property name="userRepository" ref="userRepository"/>
      173. <tx:annotation-driven transaction-manager="transactionManager"/>
      174. <bean id="transactionManager" >
      175. <bean id="messageSource" >
      176. <beans>
      177.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      178. </beans><property name="basename" value="messages"/>
      179. </bean><property name="dataSource" ref="dataSource"/>
      180. </bean></bean>
      181. <tx:annotation-driven transaction-manager="transactionManager"/>
      182. <bean id="transactionManager" >
      183. <bean id="messageSource" >
      184. <beans>
      185.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      186. </beans><property name="basename" value="messages"/>
      187. </bean><property name="dataSource" ref="dataSource"/>
      188. </bean><bean id="userRepository" />
      189. </beans>.build();<tx:annotation-driven transaction-manager="transactionManager"/>
      190. <bean id="transactionManager" >
      191. <bean id="messageSource" >
      192. <beans>
      193.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      194. </beans><property name="basename" value="messages"/>
      195. </bean><property name="dataSource" ref="dataSource"/>
      196. </bean>}}
      复制代码

2. 怎样在Spring Cloud中实现配置中心(Spring Cloud Config)?

  • 答案

    • 配置Spring Cloud Config服务器:
      1. import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.config.server.EnableConfigServer;@SpringBootApplication@EnableConfigServerpublic class ConfigServerApplication {<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>public static void main(String[] args) {<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean><tx:annotation-driven transaction-manager="transactionManager"/>
      16. <bean id="transactionManager" >
      17. <bean id="messageSource" >
      18. <beans>
      19.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      20. </beans><property name="basename" value="messages"/>
      21. </bean><property name="dataSource" ref="dataSource"/>
      22. </bean>SpringApplication.run(ConfigServerApplication.class, args);<tx:annotation-driven transaction-manager="transactionManager"/>
      23. <bean id="transactionManager" >
      24. <bean id="messageSource" >
      25. <beans>
      26.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      27. </beans><property name="basename" value="messages"/>
      28. </bean><property name="dataSource" ref="dataSource"/>
      29. </bean>}}
      复制代码
    • 客户端配置:
      1. spring:  cloud:<tx:annotation-driven transaction-manager="transactionManager"/>
      2. <bean id="transactionManager" >
      3. <bean id="messageSource" >
      4. <beans>
      5.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      6. </beans><property name="basename" value="messages"/>
      7. </bean><property name="dataSource" ref="dataSource"/>
      8. </bean>config:<tx:annotation-driven transaction-manager="transactionManager"/>
      9. <bean id="transactionManager" >
      10. <bean id="messageSource" >
      11. <beans>
      12.     <bean id="customBean"  init-method="init" destroy-method="destroy"/>
      13. </beans><property name="basename" value="messages"/>
      14. </bean><property name="dataSource" ref="dataSource"/>
      15. </bean>  uri: http://localhost:8888
      复制代码

这些高级的Spring面试题涵盖了Spring框架在更复杂和高级场景下的应用,包括自定义扩展、分布式系统、性能优化、深度剖析以及微服务架构中的高级实践。在准备面试时,要深入理解这些知识点,结合本身的现实项目经验,能够对这些高级话题进行具体的阐述和现实操作演示,如允许以更好地展现本身在Spring框架方面的高级技能和开发经验。
最后

以上关于 Spring 的面试题,分为基础部分和高级部分,备战春招2025,盼望可以助你一臂之力,关注威哥爱编程,拿下春招就你行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表