大家好,我是 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配置:
- <beans>
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><bean id="userService" >
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><property name="userRepository" ref="userRepository"/>
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean></bean>
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><bean id="userRepository" />
- </beans>
复制代码 - 利用Java配置类:
- 利用注解:
- import org.springframework.stereotype.Service;
- import org.springframework.beans.factory.annotation.Autowired;
- @Service
- public class UserService {
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Autowired
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>private UserRepository userRepository;
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 业务逻辑
- }
复制代码
二、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配置:
- <beans>
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><bean id="userService" >
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><property name="userRepository" ref="userRepository"/>
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean></bean>
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><bean id="userRepository" />
- </beans><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>
复制代码 - 利用注解:
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.aspectj.lang.annotation.Pointcut;
- @Aspect
- public class LoggingAspect {
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Pointcut("execution(* com.example.service.*.*(..))")
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void servicePointcut() {}
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Before("servicePointcut()")
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void beforeMethod() {
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>System.out.println("Before method execution");
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}
- }
复制代码
三、Spring 事务管理
1. 请解释Spring中的事务管理。
- 答案:
- Spring事务管理是一种机制,用于确保数据库操作的一致性和完整性。它可以将多个数据库操作封装在一个事务中,如果事务中的任何操作失败,全部操作都会回滚,保证数据的一致性。
- Spring支持编程式事务管理和声明式事务管理:
- 编程式事务管理:在代码中显式地控制事务的开始、提交和回滚。
- 声明式事务管理:通过配置或注解将事务管理从业务逻辑中分离出来,更简洁,通常利用@Transactional注解。
2. 怎样利用Spring的声明式事务管理?
- 答案:
- 利用XML配置:
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>
复制代码 - 利用注解:
- import org.springframework.transaction.annotation.Transactional;@Service@Transactionalpublic class UserService {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 业务逻辑}
复制代码
四、Spring 与数据库
1. 请解释Spring JDBC。
- 答案:
- Spring JDBC是Spring框架对JDBC的封装,提供了更简洁、方便的方式来实行SQL操作,避免了大量的样板代码,如连接的获取、关闭,效果集的处置惩罚等。
- 例如:
- import org.springframework.jdbc.core.JdbcTemplate;public class UserDao {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>private final JdbcTemplate jdbcTemplate;<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public UserDao(JdbcTemplate jdbcTemplate) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>this.jdbcTemplate = jdbcTemplate;<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void addUser(String name) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>String sql = "INSERT INTO users (name) VALUES (?)";<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>jdbcTemplate.update(sql, name);<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
2. 怎样利用Spring Data JPA?
- 答案:
- Spring Data JPA是Spring对JPA(Java Persistence API)的支持,它简化了数据访问层的开发。
- 例如:
- import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.stereotype.Repository;@Repositorypublic interface UserRepository extends JpaRepository {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </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中实现一个简朴的控制器?
- 答案:
- 利用注解:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@RequestMapping(value = "/hello", method = RequestMethod.GET)<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@ResponseBody<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public String hello() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>return "Hello, World!";<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </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应用:
- import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class MySpringBootApp {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public static void main(String[] args) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>SpringApplication.run(MySpringBootApp.class, args);<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
七、Spring Security
1. 请解释Spring Security的作用。
- 答案:
- Spring Security是Spring提供的一个安全框架,用于保护Spring应用程序的安全,提供了认证、授权、防止CSRF攻击等功能。
- 它可以轻松地集成到Spring应用中,确保只有经过授权的用户才能访问特定的资源。
2. 怎样配置Spring Security的基本认证?
- 答案:
- 利用Java配置:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>protected void configure(AuthenticationManagerBuilder auth) throws Exception {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>auth.inMemoryAuthentication()<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean> .withUser("user").password("{noop}password").roles("USER");<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
八、Spring 与微服务
1. 请解释Spring Cloud及其重要组件。
- 答案:
- Spring Cloud是构建分布式系统和微服务架构的工具集,提供了一系列的组件来解决微服务中的常见问题。
- 重要组件包括:
- Eureka:服务注册和发现,允许服务注册本身并发现其他服务。
- Ribbon:客户端负载均衡,将请求分配到多个服务实例。
- Feign:声明式REST客户端,简化了服务间的调用。
- Hystrix:断路器,防止服务雪崩,当服务不可用时提供降级和容错机制。
2. 怎样利用Spring Cloud实现服务注册和发现?
- 答案:
- 利用Eureka:
- 服务端(Eureka Server):
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public static void main(String[] args) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>SpringApplication.run(EurekaServerApplication.class, args);<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - 客户端(Eureka Client):
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public static void main(String[] args) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>SpringApplication.run(EurekaClientApplication.class, args);<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
九、Spring 测试
1. 怎样利用Spring Test进行单元测试和集成测试?
- 答案:
- 单元测试:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Autowired<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>private MockMvc mockMvc;<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Test<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void testHello() throws Exception {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>mockMvc.perform(get("/hello"))<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean> .andExpect(status().isOk())<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean> .andExpect(content().string("Hello, World!"));<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - 集成测试:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Autowired<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>private UserService userService;<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Test<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void testAddUser() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 测试逻辑<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
十、Spring 生态和其他
1. 请解释Spring中的事件(Event)机制。
- 答案:
- Spring事件机制允许组件之间进行松耦合的通信,一个组件可以发布事件,其他组件可以监听并处置惩罚这些事件。
- 例如:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>private ApplicationEventPublisher eventPublisher;<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>this.eventPublisher = eventPublisher;<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void addUser(String name) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 业务逻辑<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>eventPublisher.publishEvent(new UserAddedEvent(this, name));<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
2. 怎样在Spring中实现国际化(i18n)?
- 答案:
- 利用资源文件:
- 创建资源文件(如messages.properties、messages_zh_CN.properties)。
- 在Spring配置中启用国际化:
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>
复制代码
以上面试题涵盖了Spring框架的各个方面,从基础概念到高级应用,以及与其他Spring相干技术的集成。在准备2025年春招时,除了把握这些知识点,还必要对Spring框架的现实应用有深入的理解和实践经验,将理论知识与现实项目结合起来,展现本身解决问题的能力和开发经验。
Spring 高级部分
以下是Spring面试题的高级部分:
一、Spring高级配置与扩展
1. 怎样自定义Spring Bean的生命周期方法?
- 答案:
- 可以利用以下几种方法自定义Spring Bean的生命周期方法:
- 实现InitializingBean和DisposableBean接口:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void afterPropertiesSet() throws Exception {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 初始化方法,在Bean的属性设置完成后调用<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>System.out.println("CustomBean is initialized.");<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void destroy() throws Exception {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 烧毁方法,在Bean烧毁时调用<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>System.out.println("CustomBean is destroyed.");<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - 利用@PostConstruct和@PreDestroy注解:
- import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;import org.springframework.stereotype.Component;@Componentpublic class CustomBean {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@PostConstruct<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void init() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 初始化方法,在Bean的属性设置完成后调用<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>System.out.println("CustomBean is initialized.");<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@PreDestroy<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void destroy() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 烧毁方法,在Bean烧毁时调用<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>System.out.println("CustomBean is destroyed.");<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - 利用XML配置的init-method和destroy-method:
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>
复制代码
2. 怎样在Spring中实现条件化的Bean创建?
- 答案:
- 利用@Conditional注解:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Bean<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Conditional(MyCondition.class)<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public MyBean myBean() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>return new MyBean();<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - MyCondition是一个实现了Condition接口的类,用于判断是否满意创建Bean的条件:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 可以根据环境变量、系统属性等条件来判断是否创建Bean<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>return true;<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
3. 怎样在Spring中扩展BeanFactoryPostProcessor和BeanPostProcessor?
- 答案:
- BeanFactoryPostProcessor:
- 可以在Bean实例化之前修改Bean的定义,例如修改Bean的属性值。
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 可以修改BeanFactory中的Bean定义<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - BeanPostProcessor:
- 可以在Bean实例化之后,初始化之前和初始化之后对Bean进行处置惩罚,例如对Bean进行包装或添加额外的属性。
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 在Bean初始化之前处置惩罚<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>return bean;<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Override<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 在Bean初始化之后处置惩罚<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>return bean;<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
二、Spring AOP高级话题
1. 怎样实现自定义的切入点表达式?
- 答案:
- 可以利用AspectJ的切入点表达式语言,或者实现Pointcut接口:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Pointcut("execution(* *(..)) && @annotation(MyAnnotation)")<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void customPointcut() {}<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Before("customPointcut()")<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void beforeMethod() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 自定义切入点逻辑<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - 这里利用了自定义注解@MyAnnotation来定义切入点,而且可以根据必要自定义注解:
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- public class MyAnnotation {
- }
复制代码
2. 怎样在Spring AOP中传递参数给通知(Advice)?
- 答案:
- 可以利用args关键字传递参数:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Pointcut("execution(* *(..)) && args(param)")<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void parameterPointcut(String param) {}<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Before("parameterPointcut(param)")<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void beforeMethod(String param) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 利用参数<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>System.out.println("Parameter: " + param);<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
三、Spring事务高级话题
1. 怎样处置惩罚嵌套事务?
- 答案:
- Spring支持多种事务传播举动,可以利用@Transactional注解的propagation属性来设置:
- import org.springframework.transaction.annotation.Transactional;import org.springframework.stereotype.Service;@Servicepublic class NestedTransactionService {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Transactional(propagation = Propagation.REQUIRED)<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void outerMethod() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 外层事务方法<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>innerMethod();<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Transactional(propagation = Propagation.NESTED)<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void innerMethod() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 内层事务方法,可以作为外层事务的嵌套事务<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - 常见的事务传播举动:
- REQUIRED:如果当前存在事务,则加入该事务,否则创建一个新事务。
- NESTED:如果当前存在事务,则作为嵌套事务实行,否则创建一个新事务。
2. 怎样在Spring中实现分布式事务?
- 答案:
- 可以利用以下几种方法实现分布式事务:
- JTA(Java Transaction API):利用全局事务管理器,适用于多数据源或多资源的事务管理。
- 分布式事务中间件,如Atomikos、Bitronix等:
四、Spring 与分布式系统
1. 怎样利用Spring Cloud实现服务间的负载均衡?
- 答案:
- 利用Spring Cloud Ribbon:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Bean<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@LoadBalanced<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public RestTemplate restTemplate() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>return new RestTemplate();<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - 在服务调用时利用RestTemplate:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Autowired<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>private RestTemplate restTemplate;<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@GetMapping("/callService")<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public String callService() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>return restTemplate.getForObject("http://service-provider/hello", String.class);<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
2. 怎样利用Spring Cloud实现断路器模式(Hystrix)?
- 答案:
- 利用@HystrixCommand注解:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@HystrixCommand(fallbackMethod = "fallbackMethod")<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@GetMapping("/callService")<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public String callService() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 服务调用逻辑<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public String fallbackMethod() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 降级逻辑<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>return "Service is down. Please try again later.";<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
五、Spring 与消息队列
1. 怎样在Spring中集成消息队列(如RabbitMQ)?
- 答案:
- 首先,添加RabbitMQ依赖:
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>org.springframework.boot<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>spring-boot-starter-amqp
复制代码 - 配置RabbitMQ:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Bean<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public Queue queue() {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>return new Queue("myQueue");<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - 发送消息:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Autowired<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>private AmqpTemplate amqpTemplate;<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void sendMessage(String message) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>amqpTemplate.convertAndSend("myQueue", message);<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - 接收消息:
- import org.springframework.amqp.rabbit.annotation.RabbitListener;import org.springframework.stereotype.Component;@Componentpublic class MessageReceiver {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@RabbitListener(queues = "myQueue")<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public void receiveMessage(String message) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>System.out.println("Received message: " + message);<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
六、Spring 性能优化
1. 怎样优化Spring应用的启动时间?
- 答案:
- 可以从以下几个方面优化Spring应用的启动时间:
- 淘汰自动配置:排除不必要的自动配置,利用exclude属性。
- import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})public class MySpringBootApp {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public static void main(String[] args) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>SpringApplication.run(MySpringBootApp.class, args);<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码
- 优化依赖注入:避免复杂的构造函数注入,利用@Lazy注解延长加载非关键的Bean。
2. 怎样优化Spring应用的内存利用?
- 答案:
- 可以思量以下几点:
- 公道利用缓存:利用Spring Cache抽象,如利用Redis作为缓存存储。
- import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Servicepublic class UserService {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>@Cacheable("users")<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public User getUserById(Long id) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>// 从数据库获取用户信息<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </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依赖:
- <tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>org.springframework.cloud<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>spring-cloud-starter-gateway
复制代码 - 配置服务网关:
2. 怎样在Spring Cloud中实现配置中心(Spring Cloud Config)?
- 答案:
- 配置Spring Cloud Config服务器:
- 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"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>public static void main(String[] args) {<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean><tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>SpringApplication.run(ConfigServerApplication.class, args);<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>}}
复制代码 - 客户端配置:
- spring: cloud:<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean>config:<tx:annotation-driven transaction-manager="transactionManager"/>
- <bean id="transactionManager" >
- <bean id="messageSource" >
- <beans>
- <bean id="customBean" init-method="init" destroy-method="destroy"/>
- </beans><property name="basename" value="messages"/>
- </bean><property name="dataSource" ref="dataSource"/>
- </bean> uri: http://localhost:8888
复制代码
这些高级的Spring面试题涵盖了Spring框架在更复杂和高级场景下的应用,包括自定义扩展、分布式系统、性能优化、深度剖析以及微服务架构中的高级实践。在准备面试时,要深入理解这些知识点,结合本身的现实项目经验,能够对这些高级话题进行具体的阐述和现实操作演示,如允许以更好地展现本身在Spring框架方面的高级技能和开发经验。
最后
以上关于 Spring 的面试题,分为基础部分和高级部分,备战春招2025,盼望可以助你一臂之力,关注威哥爱编程,拿下春招就你行。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |