IT评测·应用市场-qidao123.com
标题:
2025春招,Spring 面试题汇总
[打印本页]
作者:
我爱普洱茶
时间:
2025-1-23 13:39
标题:
2025春招,Spring 面试题汇总
大家好,我是 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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
<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 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><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>UserService userService = new 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>userService.setUserRepository(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><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 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>@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 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><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 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>}
}
复制代码
利用注解
:
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等:
import javax.transaction.TransactionManager;import javax.transaction.UserTransaction;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.transaction.jta.JtaTransactionManager;import com.atomikos.icatch.jta.UserTransactionImp;import com.atomikos.icatch.jta.UserTransactionManager;@Configurationpublic class DistributedTransactionConfig {<tx:annotation-driven transaction-manager="transactionManager"/>
<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 UserTransaction userTransaction() throws Throwable {<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>UserTransactionImp userTransactionImp = new UserTransactionImp();<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>userTransactionImp.setTransactionTimeout(300);<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 userTransactionImp;<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>public TransactionManager atomikosTransactionManager() {<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 UserTransactionManager();<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>public JtaTransactionManager transactionManager() throws Throwable {<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>JtaTransactionManager transactionManager = new JtaTransactionManager();<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>transactionManager.setTransactionManager(atomikosTransactionManager());<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>transactionManager.setUserTransaction(userTransaction());<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 transactionManager;<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 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
复制代码
配置服务网关:
import org.springframework.cloud.gateway.route.RouteLocator;import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class GatewayConfig {<tx:annotation-driven transaction-manager="transactionManager"/>
<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 RouteLocator customRouteLocator(RouteLocatorBuilder builder) {<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 builder.routes()<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>.route("path_route", r -> r.path("/get")<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><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> .uri("http://httpbin.org"))<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>.build();<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中实现配置中心(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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4