概述
Spring Bean 是Spring IoC容器管理的对象,是Spring框架的核心概念之一。Bean的生命周期、作用域、依赖关系都由Spring容器负责管理,这种管理方式实现了对象的松耦合和高可维护性。
核心概念
- Bean:由Spring IoC容器实例化、组装和管理的对象
- Bean定义:描述如何创建Bean实例的配置元数据
- Bean容器:Spring IoC容器,负责Bean的完整生命周期管理
- Bean工厂:创建和管理Bean实例的工厂模式实现
Bean管理的优势
| 优势 | 描述 | 效果 |
|---|---|---|
| 生命周期管理 | 自动管理对象创建到销毁的完整过程 | 减少内存泄漏风险 |
| 依赖注入 | 自动解析和注入对象间的依赖关系 | 降低组件耦合度 |
| 作用域控制 | 灵活控制对象的作用范围和生存期 | 优化资源使用 |
| AOP集成 | 无缝集成面向切面编程 | 实现横切关注点 |
| 配置管理 | 统一的配置方式管理对象属性 | 提高可维护性 |
💡 提示: 理解Bean管理是掌握Spring框架的基础,也是构建企业级应用的关键。
Bean基础概念
Bean与普通Java对象的区别
1. 普通Java对象
// 传统的Java对象创建和管理
public class UserService {
private UserRepository userRepository;
public UserService() {
// 硬编码依赖创建
this.userRepository = new UserRepositoryImpl();
}
public User getUser(Long id) {
return userRepository.findById(id);
}
}
// 客户端代码需要手动管理对象
public class Application {
public static void main(String[] args) {
UserService userService = new UserService();
User user = userService.getUser(1L);
}
}
2. Spring管理的Bean
// Spring Bean:由容器管理的对象
@Service
public class UserService {
private final UserRepository userRepository;
// 依赖由Spring容器注入
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUser(Long id) {
return userRepository.findById(id);
}
}
@Repository
public class UserRepositoryImpl implements UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public User findById(Long id) {
String sql = "SELECT * FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new UserRowMapper(), id);
}
}
// 客户端代码通过容器获取Bean
@Component
public class Application {
@Autowired
private UserService userService;
public void run() {
User user = userService.getUser(1L);
System.out.println("User: " + user.getName());
}
}
Bean定义的组成要素
1. Bean标识信息
@Configuration
public class BeanIdentityConfig {
// 使用方法名作为Bean名称
@Bean
public UserService userService() {
return new UserServiceImpl();
}
// 指定Bean名称
@Bean(name = "primaryUserService")
public UserService primaryUserService() {
return new UserServiceImpl();
}
// 指定多个别名
@Bean(name = {"userSvc", "userManager", "userHandler"})
public UserService aliasedUserService() {
return new UserServiceImpl();
}
}
2. Bean类型信息
public interface UserService {
User getUser(Long id);
User saveUser(User user);
}
@Service
public class UserServiceImpl implements UserService {
// 实现接口的具体类
@Override
public User getUser(Long id) {
// 实现逻辑
return new User();
}
@Override
public User saveUser(User user) {
// 实现逻辑
return user;
}
}
// Bean类型可以是接口、抽象类或具体类
@Configuration
public class BeanTypeConfig {
@Bean
public UserService userService() {
return new UserServiceImpl(); // 返回接口类型
}
@Bean
public UserServiceImpl userServiceImpl() {
return new UserServiceImpl(); // 返回具体类型
}
}
Bean定义与配置
XML配置方式
1. 基础Bean定义
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 基本Bean定义 -->
<bean id="userRepository" class="com.example.repository.UserRepositoryImpl"/>
<!-- 带属性的Bean定义 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/testdb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
<property name="maximumPoolSize" value="20"/>
<property name="minimumIdle" value="5"/>
</bean>
<!-- 构造器参数注入 -->
<bean id="userService" class="com.example.service.UserServiceImpl">
<constructor-arg ref="userRepository"/>
<constructor-arg value="defaultUserService"/>
</bean>
<!-- 属性注入 -->
<bean id="emailService" class="com.example.service.EmailServiceImpl">
<property name="smtpHost" value="smtp.example.com"/>
<property name="smtpPort" value="587"/>
<property name="username" value="user@example.com"/>
<property name="password" value="emailPassword"/>
</bean>
<!-- 集合属性注入 -->
<bean id="configService" class="com.example.service.ConfigServiceImpl">
<property name="supportedLanguages">
<list>
<value>zh-CN</value>
<value>en-US</value>
<value>ja-JP</value>
</list>
</property>
<property name="configProperties">
<map>
<entry key="timeout" value="30"/>
<entry key="retryCount" value="3"/>
<entry key="enableCache" value="true"/>
</map>
</property>
<property name="adminEmails">
<set>
<value>admin1@example.com</value>
<value>admin2@example.com</value>
<value>admin3@example.com</value>
</set>
</property>
</bean>
</beans>
2. 高级XML配置
<!-- 命名空间和高级特性 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 使用p命名空间简化属性注入 -->
<bean id="emailService"
class="com.example.service.EmailServiceImpl"
p:smtpHost="smtp.example.com"
p:smtpPort="587"
p:username="user@example.com"
p:password="password"/>
<!-- 使用c命名空间简化构造器注入 -->
<bean id="userService"
class="com.example.service.UserServiceImpl"
c:userRepository-ref="userRepository"
c:serviceName="userService"/>
<!-- 使用util命名空间定义集合Bean -->
<util:list id="supportedLanguages">
<value>zh-CN</value>
<value>en-US</value>
<value>ja-JP</value>
</util:list>
<util:map id="systemProperties">
<entry key="app.name" value="MyApplication"/>
<entry key="app.version" value="1.0.0"/>
<entry key="app.environment" value="production"/>
</util:map>
<!-- 引用util集合 -->
<bean id="applicationConfig" class="com.example.config.ApplicationConfig">
<property name="supportedLanguages" ref="supportedLanguages"/>
<property name="systemProperties" ref="systemProperties"/>
</bean>
<!-- Bean别名定义 -->
<alias name="userService" alias="userManager"/>
<alias name="userService" alias="userHandler"/>
<!-- 抽象Bean定义 -->
<bean id="abstractDataSource" abstract="true">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="validationQuery" value="SELECT 1"/>
</bean>
<!-- 继承抽象Bean -->
<bean id="primaryDataSource"
class="com.zaxxer.hikari.HikariDataSource"
parent="abstractDataSource">
<property name="jdbcUrl" value="jdbc:mysql://primary:3306/app"/>
<property name="username" value="app_user"/>
<property name="password" value="app_password"/>
</bean>
<bean id="secondaryDataSource"
class="com.zaxxer.hikari.HikariDataSource"
parent="abstractDataSource">
<property name="jdbcUrl" value="jdbc:mysql://secondary:3306/app"/>
<property name="username" value="app_user"/>
<property name="password" value="app_password"/>
</bean>
</beans>
Java配置方式
1. 基础Java配置
@Configuration
public class AppConfig {
/**
* 基础Bean定义
*/
@Bean
public UserRepository userRepository() {
return new UserRepositoryImpl();
}
/**
* 带依赖的Bean定义
*/
@Bean
public UserService userService(UserRepository userRepository) {
return new UserServiceImpl(userRepository);
}
/**
* 复杂Bean配置
*/
@Bean
public DataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/testdb");
dataSource.setUsername("root");
dataSource.setPassword("password");
dataSource.setMaximumPoolSize(20);
dataSource.setMinimumIdle(5);
dataSource.setConnectionTimeout(30000);
dataSource.setIdleTimeout(600000);
dataSource.setMaxLifetime(1800000);
return dataSource;
}
/**
* 使用@Value注入属性值
*/
@Bean
public EmailService emailService(@Value("${email.smtp.host}") String smtpHost,
@Value("${email.smtp.port}") int smtpPort,
@Value("${email.username}") String username,
@Value("${email.password}") String password) {
EmailServiceImpl emailService = new EmailServiceImpl();
emailService.setSmtpHost(smtpHost);
emailService.setSmtpPort(smtpPort);
emailService.setUsername(username);
emailService.setPassword(password);
return emailService;
}
/**
* 集合类型Bean
*/
@Bean
public List<String> supportedLanguages() {
return Arrays.asList("zh-CN", "en-US", "ja-JP", "ko-KR");
}
@Bean
public Map<String, String> systemProperties() {
Map<String, String> properties = new HashMap<>();
properties.put("app.name", "MyApplication");
properties.put("app.version", "1.0.0");
properties.put("app.environment", "production");
return properties;
}
}
2. 高级Java配置
@Configuration
@PropertySource("classpath:application.properties")
public class AdvancedConfig {
@Autowired
private Environment environment;
/**
* 条件化Bean创建
*/
@Bean
@Profile("development")
public DataSource developmentDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:schema.sql")
.addScript("classpath:test-data.sql")
.build();
}
@Bean
@Profile("production")
public DataSource productionDataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(environment.getProperty("db.url"));
dataSource.setUsername(environment.getProperty("db.username"));
dataSource.setPassword(environment.getProperty("db.password"));
return dataSource;
}
/**
* Bean初始化和销毁方法
*/
@Bean(initMethod = "initialize", destroyMethod = "cleanup")
public CustomService customService() {
return new CustomServiceImpl();
}
/**
* 作用域配置
*/
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public TaskProcessor taskProcessor() {
return new TaskProcessorImpl();
}
/**
* 延迟初始化
*/
@Bean
@Lazy
public ExpensiveService expensiveService() {
return new ExpensiveServiceImpl();
}
/**
* Primary Bean
*/
@Bean
@Primary
public MessageService primaryMessageService() {
return new EmailMessageService();
}
@Bean
public MessageService smsMessageService() {
return new SmsMessageService();
}
/**
* 工厂Bean
*/
@Bean
public FactoryBean<Connection> connectionFactory() {
return new ConnectionFactoryBean();
}
}
public class CustomServiceImpl implements CustomService {
public void initialize() {
System.out.println("CustomService 初始化完成");
// 初始化逻辑
}
public void cleanup() {
System.out.println("CustomService 清理资源");
// 清理逻辑
}
}
Bean实例化方式
构造器实例化
1. 默认构造器
// Bean类定义
public class UserService {
public UserService() {
System.out.println("UserService 通过默认构造器创建");
}
public void processUser(User user) {
System.out.println("处理用户: " + user.getName());
}
}
// XML配置
<bean id="userService" class="com.example.service.UserService"/>
// Java配置
@Configuration
public class Config {
@Bean
public UserService userService() {
return new UserService();
}
}
// 注解配置
@Service
public class UserService {
// Spring会使用默认构造器创建实例
}
2. 参数化构造器
// 带参数的构造器
public class UserService {
private final UserRepository userRepository;
private final EmailService emailService;
private final String serviceName;
public UserService(UserRepository userRepository,
EmailService emailService,
String serviceName) {
this.userRepository = userRepository;
this.emailService = emailService;
this.serviceName = serviceName;
System.out.println("UserService 通过参数化构造器创建: " + serviceName);
}
public User createUser(String name, String email) {
User user = new User(name, email);
User savedUser = userRepository.save(user);
emailService.sendWelcomeEmail(savedUser.getEmail());
return savedUser;
}
}
// XML配置
<bean id="userService" class="com.example.service.UserService">
<constructor-arg ref="userRepository"/>
<constructor-arg ref="emailService"/>
<constructor-arg value="primaryUserService"/>
</bean>
// 按类型匹配构造器参数
<bean id="userService" class="com.example.service.UserService">
<constructor-arg type="com.example.repository.UserRepository" ref="userRepository"/>
<constructor-arg type="com.example.service.EmailService" ref="emailService"/>
<constructor-arg type="java.lang.String" value="primaryUserService"/>
</bean>
// 按索引匹配构造器参数
<bean id="userService" class="com.example.service.UserService">
<constructor-arg index="0" ref="userRepository"/>
<constructor-arg index="1" ref="emailService"/>
<constructor-arg index="2" value="primaryUserService"/>
</bean>
// Java配置
@Configuration
public class Config {
@Bean
public UserService userService(UserRepository userRepository,
EmailService emailService) {
return new UserService(userRepository, emailService, "primaryUserService");
}
}
静态工厂方法实例化
1. 静态工厂类
// 静态工厂类
public class UserServiceFactory {
private static final Map<String, UserService> serviceCache = new ConcurrentHashMap<>();
/**
* 静态工厂方法创建UserService实例
*/
public static UserService createUserService(UserRepository userRepository,
String serviceType) {
String cacheKey = serviceType + "_" + userRepository.getClass().getSimpleName();
return serviceCache.computeIfAbsent(cacheKey, key -> {
System.out.println("通过静态工厂方法创建 UserService: " + serviceType);
switch (serviceType) {
case "standard":
return new StandardUserService(userRepository);
case "premium":
return new PremiumUserService(userRepository);
case "enterprise":
return new EnterpriseUserService(userRepository);
default:
throw new IllegalArgumentException("不支持的服务类型: " + serviceType);
}
});
}
/**
* 创建带缓存的UserService
*/
public static UserService createCachedUserService(UserRepository userRepository) {
System.out.println("创建带缓存的 UserService");
UserService userService = new StandardUserService(userRepository);
return new CachedUserServiceWrapper(userService);
}
/**
* 清理工厂缓存
*/
public static void clearCache() {
serviceCache.clear();
System.out.println("UserService 工厂缓存已清理");
}
}
// 不同类型的UserService实现
public class StandardUserService implements UserService {
private final UserRepository userRepository;
public StandardUserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public User createUser(String name, String email) {
return userRepository.save(new User(name, email));
}
}
public class PremiumUserService implements UserService {
private final UserRepository userRepository;
public PremiumUserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public User createUser(String name, String email) {
User user = new User(name, email);
user.setPremium(true);
return userRepository.save(user);
}
}
// XML配置静态工厂方法
<bean id="userRepository" class="com.example.repository.UserRepositoryImpl"/>
<bean id="standardUserService"
class="com.example.factory.UserServiceFactory"
factory-method="createUserService">
<constructor-arg ref="userRepository"/>
<constructor-arg value="standard"/>
</bean>
<bean id="premiumUserService"
class="com.example.factory.UserServiceFactory"
factory-method="createUserService">
<constructor-arg ref="userRepository"/>
<constructor-arg value="premium"/>
</bean>
<bean id="cachedUserService"
class="com.example.factory.UserServiceFactory"
factory-method="createCachedUserService">
<constructor-arg ref="userRepository"/>
</bean>
// Java配置静态工厂方法
@Configuration
public class Config {
@Bean
public UserService standardUserService(UserRepository userRepository) {
return UserServiceFactory.createUserService(userRepository, "standard");
}
@Bean
public UserService premiumUserService(UserRepository userRepository) {
return UserServiceFactory.createUserService(userRepository, "premium");
}
@Bean
public UserService cachedUserService(UserRepository userRepository) {
return UserServiceFactory.createCachedUserService(userRepository);
}
}
实例工厂方法实例化
1. 实例工厂类
// 实例工厂类
@Component
public class UserServiceFactory {
private final UserRepository userRepository;
private final EmailService emailService;
private final MetricsService metricsService;
public UserServiceFactory(UserRepository userRepository,
EmailService emailService,
MetricsService metricsService) {
this.userRepository = userRepository;
this.emailService = emailService;
this.metricsService = metricsService;
System.out.println("UserServiceFactory 实例创建完成");
}
/**
* 实例工厂方法创建UserService
*/
public UserService createUserService(String serviceLevel) {
System.out.println("通过实例工厂方法创建 UserService: " + serviceLevel);
UserService userService;
switch (serviceLevel.toLowerCase()) {
case "basic":
userService = new BasicUserService(userRepository);
break;
case "standard":
userService = new StandardUserService(userRepository, emailService);
break;
case "premium":
userService = new PremiumUserService(userRepository, emailService, metricsService);
break;
default:
throw new IllegalArgumentException("不支持的服务级别: " + serviceLevel);
}
// 工厂可以对创建的实例进行后处理
configureUserService(userService, serviceLevel);
return userService;
}
/**
* 创建带监控的UserService
*/
public UserService createMonitoredUserService() {
UserService userService = new StandardUserService(userRepository, emailService);
return new MonitoringUserServiceProxy(userService, metricsService);
}
/**
* 创建集群环境下的UserService
*/
public UserService createClusteredUserService(String nodeId) {
UserService userService = new StandardUserService(userRepository, emailService);
return new ClusteredUserServiceWrapper(userService, nodeId);
}
private void configureUserService(UserService userService, String serviceLevel) {
// 根据服务级别进行配置
if (userService instanceof ConfigurableUserService) {
ConfigurableUserService configurable = (ConfigurableUserService) userService;
configurable.setServiceLevel(serviceLevel);
configurable.setMaxConcurrentUsers(getMaxConcurrentUsers(serviceLevel));
}
}
private int getMaxConcurrentUsers(String serviceLevel) {
switch (serviceLevel.toLowerCase()) {
case "basic": return 100;
case "standard": return 500;
case "premium": return 1000;
default: return 100;
}
}
}
// 可配置的UserService接口
public interface ConfigurableUserService extends UserService {
void setServiceLevel(String serviceLevel);
void setMaxConcurrentUsers(int maxUsers);
}
// XML配置实例工厂方法
<bean id="userServiceFactory" class="com.example.factory.UserServiceFactory">
<constructor-arg ref="userRepository"/>
<constructor-arg ref="emailService"/>
<constructor-arg ref="metricsService"/>
</bean>
<bean id="basicUserService"
factory-bean="userServiceFactory"
factory-method="createUserService">
<constructor-arg value="basic"/>
</bean>
<bean id="standardUserService"
factory-bean="userServiceFactory"
factory-method="createUserService">
<constructor-arg value="standard"/>
</bean>
<bean id="monitoredUserService"
factory-bean="userServiceFactory"
factory-method="createMonitoredUserService"/>
// Java配置实例工厂方法
@Configuration
public class Config {
@Bean
public UserService basicUserService(UserServiceFactory factory) {
return factory.createUserService("basic");
}
@Bean
public UserService standardUserService(UserServiceFactory factory) {
return factory.createUserService("standard");
}
@Bean
public UserService monitoredUserService(UserServiceFactory factory) {
return factory.createMonitoredUserService();
}
@Bean
public UserService clusteredUserService(UserServiceFactory factory) {
return factory.createClusteredUserService("node-1");
}
}
FactoryBean实例化
1. 自定义FactoryBean
// 自定义FactoryBean实现
@Component
public class UserServiceFactoryBean implements FactoryBean<UserService> {
private UserRepository userRepository;
private EmailService emailService;
private String serviceType = "standard";
private boolean singleton = true;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Autowired
public void setEmailService(EmailService emailService) {
this.emailService = emailService;
}
public void setServiceType(String serviceType) {
this.serviceType = serviceType;
}
public void setSingleton(boolean singleton) {
this.singleton = singleton;
}
@Override
public UserService getObject() throws Exception {
System.out.println("FactoryBean 创建 UserService 实例: " + serviceType);
// 根据配置创建不同类型的UserService
UserService userService;
switch (serviceType.toLowerCase()) {
case "basic":
userService = createBasicUserService();
break;
case "standard":
userService = createStandardUserService();
break;
case "premium":
userService = createPremiumUserService();
break;
case "enterprise":
userService = createEnterpriseUserService();
break;
default:
throw new IllegalArgumentException("不支持的服务类型: " + serviceType);
}
// FactoryBean可以对创建的对象进行后处理
postProcessUserService(userService);
return userService;
}
@Override
public Class<?> getObjectType() {
return UserService.class;
}
@Override
public boolean isSingleton() {
return singleton;
}
private UserService createBasicUserService() {
return new BasicUserService(userRepository);
}
private UserService createStandardUserService() {
StandardUserService service = new StandardUserService(userRepository);
service.setEmailService(emailService);
return service;
}
private UserService createPremiumUserService() {
PremiumUserService service = new PremiumUserService(userRepository);
service.setEmailService(emailService);
service.enablePremiumFeatures();
return service;
}
private UserService createEnterpriseUserService() {
EnterpriseUserService service = new EnterpriseUserService(userRepository);
service.setEmailService(emailService);
service.enableEnterpriseFeatures();
service.setupAuditLogging();
return service;
}
private void postProcessUserService(UserService userService) {
// 对创建的UserService进行后处理
if (userService instanceof InitializingBean) {
try {
((InitializingBean) userService).afterPropertiesSet();
} catch (Exception e) {
throw new RuntimeException("UserService 初始化失败", e);
}
}
// 注册JMX监控
registerJmxMonitoring(userService);
}
private void registerJmxMonitoring(UserService userService) {
// JMX监控注册逻辑
System.out.println("为 UserService 注册 JMX 监控");
}
}
// XML配置FactoryBean
<bean id="userServiceFactory" class="com.example.factory.UserServiceFactoryBean">
<property name="serviceType" value="premium"/>
<property name="singleton" value="true"/>
</bean>
<!-- 获取FactoryBean创建的对象 -->
<bean id="userService" factory-bean="userServiceFactory"/>
<!-- 获取FactoryBean本身 -->
<bean id="userServiceFactoryBean" class="com.example.factory.UserServiceFactoryBean"/>
// Java配置FactoryBean
@Configuration
public class Config {
@Bean
public UserServiceFactoryBean userServiceFactory() {
UserServiceFactoryBean factory = new UserServiceFactoryBean();
factory.setServiceType("premium");
factory.setSingleton(true);
return factory;
}
// Spring会自动调用FactoryBean.getObject()
@Bean
public UserService userService(UserServiceFactoryBean factory) throws Exception {
return factory.getObject();
}
}
Bean作用域详解
Singleton作用域(默认)
1. Singleton特性
@Service
public class SingletonUserService {
private int counter = 0;
private final String instanceId = UUID.randomUUID().toString();
public int incrementCounter() {
return ++counter;
}
public String getInstanceId() {
return instanceId;
}
public int getCounter() {
return counter;
}
}
// 测试Singleton行为
@Component
public class SingletonDemo {
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void demonstrateSingleton() {
// 多次获取Bean,都是同一个实例
SingletonUserService service1 = applicationContext.getBean(SingletonUserService.class);
SingletonUserService service2 = applicationContext.getBean(SingletonUserService.class);
System.out.println("service1 == service2: " + (service1 == service2)); // true
System.out.println("service1 实例ID: " + service1.getInstanceId());
System.out.println("service2 实例ID: " + service2.getInstanceId()); // 相同ID
// 状态共享
System.out.println("service1 计数器: " + service1.incrementCounter()); // 1
System.out.println("service2 计数器: " + service2.incrementCounter()); // 2
System.out.println("service1 计数器: " + service1.getCounter()); // 2
}
}
// XML配置Singleton(默认)
<bean id="userService" class="com.example.service.SingletonUserService"/>
<!-- 或显式指定 -->
<bean id="userService" class="com.example.service.SingletonUserService" scope="singleton"/>
// Java配置Singleton
@Configuration
public class Config {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) // 默认可省略
public SingletonUserService userService() {
return new SingletonUserService();
}
}
Prototype作用域
1. Prototype特性
@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PrototypeUserService {
private int counter = 0;
private final String instanceId = UUID.randomUUID().toString();
private final long creationTime = System.currentTimeMillis();
public PrototypeUserService() {
System.out.println("创建 PrototypeUserService 实例: " + instanceId);
}
public int incrementCounter() {
return ++counter;
}
public String getInstanceId() {
return instanceId;
}
public long getCreationTime() {
return creationTime;
}
public int getCounter() {
return counter;
}
}
// 测试Prototype行为
@Component
public class PrototypeDemo {
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void demonstratePrototype() {
// 每次获取Bean都是新实例
PrototypeUserService service1 = applicationContext.getBean(PrototypeUserService.class);
PrototypeUserService service2 = applicationContext.getBean(PrototypeUserService.class);
System.out.println("service1 == service2: " + (service1 == service2)); // false
System.out.println("service1 实例ID: " + service1.getInstanceId());
System.out.println("service2 实例ID: " + service2.getInstanceId()); // 不同ID
// 状态独立
System.out.println("service1 计数器: " + service1.incrementCounter()); // 1
System.out.println("service2 计数器: " + service2.incrementCounter()); // 1
System.out.println("service1 计数器: " + service1.getCounter()); // 1
// 创建时间不同
System.out.println("创建时间差: " + (service2.getCreationTime() - service1.getCreationTime()) + "ms");
}
}
// XML配置Prototype
<bean id="userService" class="com.example.service.PrototypeUserService" scope="prototype"/>
// Java配置Prototype
@Configuration
public class Config {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public PrototypeUserService userService() {
return new PrototypeUserService();
}
}
2. Prototype注入到Singleton的问题
// 问题:Prototype Bean注入到Singleton Bean中
@Service
public class SingletonService {
@Autowired
private PrototypeUserService prototypeService; // 只会注入一次!
public void usePrototypeService() {
System.out.println("使用 PrototypeService: " + prototypeService.getInstanceId());
prototypeService.incrementCounter();
}
}
// 解决方案1:使用ApplicationContext查找
@Service
public class SingletonService {
@Autowired
private ApplicationContext applicationContext;
public void usePrototypeService() {
// 每次都获取新的Prototype实例
PrototypeUserService prototypeService = applicationContext.getBean(PrototypeUserService.class);
System.out.println("使用 PrototypeService: " + prototypeService.getInstanceId());
prototypeService.incrementCounter();
}
}
// 解决方案2:使用@Lookup方法注入
@Service
public abstract class SingletonService {
public void usePrototypeService() {
PrototypeUserService prototypeService = getPrototypeService();
System.out.println("使用 PrototypeService: " + prototypeService.getInstanceId());
prototypeService.incrementCounter();
}
@Lookup
protected abstract PrototypeUserService getPrototypeService();
}
// 解决方案3:使用Provider接口
@Service
public class SingletonService {
@Autowired
private Provider<PrototypeUserService> prototypeServiceProvider;
public void usePrototypeService() {
// 每次调用get()都获取新实例
PrototypeUserService prototypeService = prototypeServiceProvider.get();
System.out.println("使用 PrototypeService: " + prototypeService.getInstanceId());
prototypeService.incrementCounter();
}
}
Web作用域
1. Request作用域
// Request作用域Bean:每个HTTP请求一个实例
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {
private final String requestId = UUID.randomUUID().toString();
private final long requestStartTime = System.currentTimeMillis();
private final Map<String, Object> requestData = new HashMap<>();
public RequestScopedBean() {
System.out.println("创建 RequestScopedBean: " + requestId);
}
public void addData(String key, Object value) {
requestData.put(key, value);
}
public Object getData(String key) {
return requestData.get(key);
}
public String getRequestId() {
return requestId;
}
public long getRequestDuration() {
return System.currentTimeMillis() - requestStartTime;
}
public Map<String, Object> getAllData() {
return new HashMap<>(requestData);
}
}
// 使用Request作用域Bean
@RestController
@RequestMapping("/api/request-demo")
public class RequestScopeController {
@Autowired
private RequestScopedBean requestBean;
@GetMapping("/info")
public Map<String, Object> getRequestInfo() {
requestBean.addData("endpoint", "/api/request-demo/info");
requestBean.addData("timestamp", System.currentTimeMillis());
Map<String, Object> response = new HashMap<>();
response.put("requestId", requestBean.getRequestId());
response.put("duration", requestBean.getRequestDuration());
response.put("data", requestBean.getAllData());
return response;
}
@PostMapping("/data")
public Map<String, Object> addData(@RequestBody Map<String, Object> data) {
data.forEach(requestBean::addData);
Map<String, Object> response = new HashMap<>();
response.put("requestId", requestBean.getRequestId());
response.put("allData", requestBean.getAllData());
return response;
}
}
// XML配置Request作用域
<bean id="requestBean" class="com.example.RequestScopedBean" scope="request">
<aop:scoped-proxy/>
</bean>
2. Session作用域
// Session作用域Bean:每个HTTP会话一个实例
@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionScopedBean {
private final String sessionId = UUID.randomUUID().toString();
private final long sessionStartTime = System.currentTimeMillis();
private final Map<String, Object> sessionData = new ConcurrentHashMap<>();
private int requestCount = 0;
public SessionScopedBean() {
System.out.println("创建 SessionScopedBean: " + sessionId);
}
public synchronized void incrementRequestCount() {
requestCount++;
}
public void putData(String key, Object value) {
sessionData.put(key, value);
}
public Object getData(String key) {
return sessionData.get(key);
}
public String getSessionId() {
return sessionId;
}
public long getSessionDuration() {
return System.currentTimeMillis() - sessionStartTime;
}
public int getRequestCount() {
return requestCount;
}
public Map<String, Object> getAllData() {
return new HashMap<>(sessionData);
}
}
// 使用Session作用域Bean
@RestController
@RequestMapping("/api/session-demo")
public class SessionScopeController {
@Autowired
private SessionScopedBean sessionBean;
@GetMapping("/info")
public Map<String, Object> getSessionInfo() {
sessionBean.incrementRequestCount();
Map<String, Object> response = new HashMap<>();
response.put("sessionId", sessionBean.getSessionId());
response.put("duration", sessionBean.getSessionDuration());
response.put("requestCount", sessionBean.getRequestCount());
response.put("data", sessionBean.getAllData());
return response;
}
@PostMapping("/preferences")
public Map<String, Object> setPreferences(@RequestBody Map<String, Object> preferences) {
sessionBean.incrementRequestCount();
preferences.forEach(sessionBean::putData);
Map<String, Object> response = new HashMap<>();
response.put("sessionId", sessionBean.getSessionId());
response.put("preferences", sessionBean.getAllData());
return response;
}
}
3. Application作用域
// Application作用域Bean:整个Web应用一个实例
@Component
@Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ApplicationScopedBean {
private final String applicationId = UUID.randomUUID().toString();
private final long applicationStartTime = System.currentTimeMillis();
private final AtomicLong totalRequests = new AtomicLong(0);
private final AtomicLong totalSessions = new AtomicLong(0);
private final Map<String, Object> applicationData = new ConcurrentHashMap<>();
public ApplicationScopedBean() {
System.out.println("创建 ApplicationScopedBean: " + applicationId);
initializeApplicationData();
}
private void initializeApplicationData() {
applicationData.put("version", "1.0.0");
applicationData.put("startTime", applicationStartTime);
applicationData.put("environment", System.getProperty("spring.profiles.active", "default"));
}
public void incrementRequestCount() {
totalRequests.incrementAndGet();
}
public void incrementSessionCount() {
totalSessions.incrementAndGet();
}
public void putData(String key, Object value) {
applicationData.put(key, value);
}
public Object getData(String key) {
return applicationData.get(key);
}
public String getApplicationId() {
return applicationId;
}
public long getUptime() {
return System.currentTimeMillis() - applicationStartTime;
}
public long getTotalRequests() {
return totalRequests.get();
}
public long getTotalSessions() {
return totalSessions.get();
}
public Map<String, Object> getAllData() {
Map<String, Object> data = new HashMap<>(applicationData);
data.put("totalRequests", getTotalRequests());
data.put("totalSessions", getTotalSessions());
data.put("uptime", getUptime());
return data;
}
}
// 使用Application作用域Bean
@RestController
@RequestMapping("/api/app-stats")
public class ApplicationStatsController {
@Autowired
private ApplicationScopedBean appBean;
@Autowired
private SessionScopedBean sessionBean;
@GetMapping("/info")
public Map<String, Object> getApplicationInfo() {
appBean.incrementRequestCount();
return appBean.getAllData();
}
@PostMapping("/config")
public Map<String, Object> updateConfig(@RequestBody Map<String, Object> config) {
appBean.incrementRequestCount();
config.forEach(appBean::putData);
return appBean.getAllData();
}
}
自定义作用域
1. 实现自定义作用域
// 自定义线程作用域
public class ThreadScope implements Scope {
private static final String THREAD_SCOPE_NAME = "thread";
private final ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<Map<String, Object>>() {
@Override
protected Map<String, Object> initialValue() {
return new HashMap<>();
}
};
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
Map<String, Object> scope = threadLocal.get();
Object obj = scope.get(name);
if (obj == null) {
obj = objectFactory.getObject();
scope.put(name, obj);
System.out.println("创建线程作用域Bean: " + name + " in thread: " + Thread.currentThread().getName());
}
return obj;
}
@Override
public Object remove(String name) {
Map<String, Object> scope = threadLocal.get();
return scope.remove(name);
}
@Override
public void registerDestructionCallback(String name, Runnable callback) {
// 线程结束时的清理回调
// 这里可以注册线程结束时的清理逻辑
}
@Override
public Object resolveContextualObject(String key) {
return null;
}
@Override
public String getConversationId() {
return Thread.currentThread().getName();
}
public void clearScope() {
threadLocal.remove();
}
}
// 注册自定义作用域
@Configuration
public class CustomScopeConfig implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
beanFactory.registerScope("thread", new ThreadScope());
System.out.println("注册自定义线程作用域");
}
}
// 使用自定义作用域
@Component
@Scope("thread")
public class ThreadScopedService {
private final String threadId = Thread.currentThread().getName();
private final long creationTime = System.currentTimeMillis();
private int operationCount = 0;
public ThreadScopedService() {
System.out.println("创建 ThreadScopedService in thread: " + threadId);
}
public void performOperation() {
operationCount++;
System.out.println("线程 " + threadId + " 执行操作 " + operationCount);
}
public String getThreadId() {
return threadId;
}
public int getOperationCount() {
return operationCount;
}
public long getCreationTime() {
return creationTime;
}
}
// 测试自定义作用域
@Component
public class ThreadScopeDemo {
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void demonstrateThreadScope() throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 0; i < 5; i++) {
final int taskId = i;
executor.submit(() -> {
ThreadScopedService service = applicationContext.getBean(ThreadScopedService.class);
service.performOperation();
service.performOperation();
System.out.println("Task " + taskId + " - Service thread: " + service.getThreadId() +
", operations: " + service.getOperationCount());
});
}
executor.shutdown();
executor.awaitTermination(10, TimeUnit.SECONDS);
}
}
Bean生命周期
完整生命周期流程
1. 生命周期演示Bean
@Component
public class LifecycleDemoBean implements BeanNameAware, BeanFactoryAware,
ApplicationContextAware, EnvironmentAware,
InitializingBean, DisposableBean {
private String beanName;
private BeanFactory beanFactory;
private ApplicationContext applicationContext;
private Environment environment;
// 1. 构造器
public LifecycleDemoBean() {
System.out.println("1. 构造器:创建Bean实例");
}
// 2. 属性注入
@Autowired
public void setUserService(UserService userService) {
System.out.println("2. 属性注入:注入依赖对象");
}
@Value("${app.name:DefaultApp}")
public void setAppName(String appName) {
System.out.println("2. 属性注入:注入配置值 - " + appName);
}
// 3. Aware接口回调
@Override
public void setBeanName(String name) {
this.beanName = name;
System.out.println("3. BeanNameAware:设置Bean名称 - " + name);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
System.out.println("4. BeanFactoryAware:设置BeanFactory");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
System.out.println("5. ApplicationContextAware:设置ApplicationContext");
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
System.out.println("6. EnvironmentAware:设置Environment");
}
// 4. BeanPostProcessor前置处理(在自定义BeanPostProcessor中实现)
// 5. 初始化方法
@PostConstruct
public void postConstruct() {
System.out.println("7. @PostConstruct:初始化注解方法");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("8. InitializingBean:afterPropertiesSet方法");
}
// 6. 自定义初始化方法
public void customInit() {
System.out.println("9. 自定义初始化方法:customInit");
}
// 7. BeanPostProcessor后置处理(在自定义BeanPostProcessor中实现)
// Bean就绪,可以使用
public void doWork() {
System.out.println("10. Bean工作中:执行业务逻辑");
}
// 8. 销毁前方法
@PreDestroy
public void preDestroy() {
System.out.println("11. @PreDestroy:销毁前注解方法");
}
@Override
public void destroy() throws Exception {
System.out.println("12. DisposableBean:destroy方法");
}
// 9. 自定义销毁方法
public void customDestroy() {
System.out.println("13. 自定义销毁方法:customDestroy");
}
// Getter方法
public String getBeanName() { return beanName; }
public BeanFactory getBeanFactory() { return beanFactory; }
public ApplicationContext getApplicationContext() { return applicationContext; }
public Environment getEnvironment() { return environment; }
}
2. 自定义BeanPostProcessor
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof LifecycleDemoBean) {
System.out.println("6. BeanPostProcessor:初始化前处理 - " + beanName);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof LifecycleDemoBean) {
System.out.println("10. BeanPostProcessor:初始化后处理 - " + beanName);
// 可以返回代理对象
if (needsProxy(bean)) {
return createProxy(bean);
}
}
return bean;
}
private boolean needsProxy(Object bean) {
// 判断是否需要创建代理
return bean.getClass().isAnnotationPresent(ProxyRequired.class);
}
private Object createProxy(Object bean) {
return Proxy.newProxyInstance(
bean.getClass().getClassLoader(),
bean.getClass().getInterfaces(),
(proxy, method, args) -> {
System.out.println("代理拦截方法调用: " + method.getName());
return method.invoke(bean, args);
}
);
}
}
// 标记需要代理的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ProxyRequired {
}
3. 配置生命周期方法
// Java配置方式
@Configuration
public class LifecycleConfig {
@Bean(initMethod = "customInit", destroyMethod = "customDestroy")
public LifecycleDemoBean lifecycleDemoBean() {
return new LifecycleDemoBean();
}
}
// XML配置方式
<bean id="lifecycleDemoBean"
class="com.example.LifecycleDemoBean"
init-method="customInit"
destroy-method="customDestroy"/>
// 全局默认初始化和销毁方法
<beans default-init-method="init" default-destroy-method="cleanup">
<bean id="bean1" class="com.example.Bean1"/>
<bean id="bean2" class="com.example.Bean2"/>
</beans>
4. 生命周期测试
@Component
public class LifecycleTest {
@Autowired
private LifecycleDemoBean lifecycleBean;
@PostConstruct
public void testLifecycle() {
System.out.println("\n=== 开始测试Bean生命周期 ===");
// 使用Bean
lifecycleBean.doWork();
// 打印Bean信息
System.out.println("Bean名称: " + lifecycleBean.getBeanName());
System.out.println("ApplicationContext类型: " +
lifecycleBean.getApplicationContext().getClass().getSimpleName());
System.out.println("=== Bean生命周期测试完成 ===\n");
}
}
// 应用关闭时触发销毁
@Component
public class ShutdownDemo {
@EventListener
public void handleContextClose(ContextClosedEvent event) {
System.out.println("ApplicationContext关闭,触发Bean销毁过程");
}
}
生命周期管理最佳实践
1. 资源管理Bean
@Component
public class ResourceManagerBean implements InitializingBean, DisposableBean {
private ExecutorService executorService;
private ConnectionPool connectionPool;
private ScheduledExecutorService scheduler;
private final List<AutoCloseable> resources = new ArrayList<>();
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("初始化资源管理器");
// 初始化线程池
executorService = Executors.newFixedThreadPool(10);
resources.add(() -> {
executorService.shutdown();
try {
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
Thread.currentThread().interrupt();
}
});
// 初始化连接池
connectionPool = new ConnectionPool();
connectionPool.initialize();
resources.add(connectionPool);
// 初始化调度器
scheduler = Executors.newScheduledThreadPool(2);
resources.add(() -> {
scheduler.shutdown();
try {
if (!scheduler.awaitTermination(30, TimeUnit.SECONDS)) {
scheduler.shutdownNow();
}
} catch (InterruptedException e) {
scheduler.shutdownNow();
Thread.currentThread().interrupt();
}
});
// 启动健康检查
startHealthCheck();
}
private void startHealthCheck() {
scheduler.scheduleWithFixedDelay(() -> {
try {
checkResourceHealth();
} catch (Exception e) {
System.err.println("健康检查失败: " + e.getMessage());
}
}, 30, 30, TimeUnit.SECONDS);
}
private void checkResourceHealth() {
System.out.println("执行资源健康检查");
// 检查连接池状态
// 检查线程池状态
// 检查其他资源状态
}
public void submitTask(Runnable task) {
if (executorService != null && !executorService.isShutdown()) {
executorService.submit(task);
}
}
public Connection getConnection() throws Exception {
if (connectionPool != null) {
return connectionPool.getConnection();
}
throw new IllegalStateException("连接池未初始化");
}
@Override
public void destroy() throws Exception {
System.out.println("清理资源管理器");
// 按逆序清理资源
Collections.reverse(resources);
for (AutoCloseable resource : resources) {
try {
resource.close();
System.out.println("清理资源: " + resource.getClass().getSimpleName());
} catch (Exception e) {
System.err.println("清理资源失败: " + e.getMessage());
}
}
resources.clear();
}
}
// 连接池示例
public class ConnectionPool implements AutoCloseable {
private final Queue<Connection> connections = new ConcurrentLinkedQueue<>();
private volatile boolean initialized = false;
public void initialize() {
if (initialized) {
return;
}
// 初始化连接池
for (int i = 0; i < 10; i++) {
connections.offer(createConnection());
}
initialized = true;
System.out.println("连接池初始化完成,连接数: " + connections.size());
}
public Connection getConnection() throws Exception {
if (!initialized) {
throw new IllegalStateException("连接池未初始化");
}
Connection connection = connections.poll();
if (connection == null) {
connection = createConnection();
}
return connection;
}
public void returnConnection(Connection connection) {
if (initialized && connection != null) {
connections.offer(connection);
}
}
private Connection createConnection() {
// 创建数据库连接的模拟实现
return new MockConnection();
}
@Override
public void close() throws Exception {
initialized = false;
Connection connection;
while ((connection = connections.poll()) != null) {
connection.close();
}
System.out.println("连接池已关闭");
}
}
Bean后处理器
BeanPostProcessor详解
1. 方法增强处理器
@Component
public class MethodEnhancementPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 检查Bean是否需要方法增强
if (needsMethodEnhancement(bean)) {
return createEnhancedProxy(bean, beanName);
}
return bean;
}
private boolean needsMethodEnhancement(Object bean) {
Class<?> beanClass = bean.getClass();
// 检查类级别注解
if (beanClass.isAnnotationPresent(MethodTiming.class)) {
return true;
}
// 检查方法级别注解
for (Method method : beanClass.getDeclaredMethods()) {
if (method.isAnnotationPresent(MethodTiming.class) ||
method.isAnnotationPresent(LogExecution.class) ||
method.isAnnotationPresent(CacheResult.class)) {
return true;
}
}
return false;
}
private Object createEnhancedProxy(Object bean, String beanName) {
System.out.println("为Bean创建增强代理: " + beanName);
return Proxy.newProxyInstance(
bean.getClass().getClassLoader(),
bean.getClass().getInterfaces(),
new MethodEnhancementHandler(bean)
);
}
}
// 方法增强处理器
public class MethodEnhancementHandler implements InvocationHandler {
private final Object target;
private final Map<Method, MethodEnhancer> enhancers = new ConcurrentHashMap<>();
public MethodEnhancementHandler(Object target) {
this.target = target;
initializeEnhancers();
}
private void initializeEnhancers() {
for (Method method : target.getClass().getDeclaredMethods()) {
List<MethodEnhancer> methodEnhancers = new ArrayList<>();
// 添加时间统计增强器
if (method.isAnnotationPresent(MethodTiming.class)) {
methodEnhancers.add(new TimingEnhancer());
}
// 添加日志增强器
if (method.isAnnotationPresent(LogExecution.class)) {
methodEnhancers.add(new LoggingEnhancer());
}
// 添加缓存增强器
if (method.isAnnotationPresent(CacheResult.class)) {
methodEnhancers.add(new CacheEnhancer());
}
if (!methodEnhancers.isEmpty()) {
enhancers.put(method, new CompositeMethodEnhancer(methodEnhancers));
}
}
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MethodEnhancer enhancer = enhancers.get(method);
if (enhancer != null) {
return enhancer.enhance(target, method, args);
} else {
return method.invoke(target, args);
}
}
}
// 方法增强器接口
public interface MethodEnhancer {
Object enhance(Object target, Method method, Object[] args) throws Throwable;
}
// 时间统计增强器
public class TimingEnhancer implements MethodEnhancer {
@Override
public Object enhance(Object target, Method method, Object[] args) throws Throwable {
long startTime = System.nanoTime();
try {
Object result = method.invoke(target, args);
return result;
} finally {
long endTime = System.nanoTime();
long duration = endTime - startTime;
System.out.printf("方法 %s.%s 执行时间: %.2f ms%n",
target.getClass().getSimpleName(),
method.getName(),
duration / 1_000_000.0);
}
}
}
// 日志增强器
public class LoggingEnhancer implements MethodEnhancer {
@Override
public Object enhance(Object target, Method method, Object[] args) throws Throwable {
System.out.println("执行方法: " + target.getClass().getSimpleName() + "." + method.getName());
System.out.println("参数: " + Arrays.toString(args));
try {
Object result = method.invoke(target, args);
System.out.println("返回值: " + result);
return result;
} catch (Exception e) {
System.out.println("方法执行异常: " + e.getMessage());
throw e;
}
}
}
// 组合增强器
public class CompositeMethodEnhancer implements MethodEnhancer {
private final List<MethodEnhancer> enhancers;
public CompositeMethodEnhancer(List<MethodEnhancer> enhancers) {
this.enhancers = new ArrayList<>(enhancers);
}
@Override
public Object enhance(Object target, Method method, Object[] args) throws Throwable {
return executeEnhancers(0, target, method, args);
}
private Object executeEnhancers(int index, Object target, Method method, Object[] args) throws Throwable {
if (index >= enhancers.size()) {
return method.invoke(target, args);
}
MethodEnhancer currentEnhancer = enhancers.get(index);
return currentEnhancer.enhance(new EnhancerTarget(target, method, args, index + 1), method, args);
}
private class EnhancerTarget {
private final Object target;
private final Method method;
private final Object[] args;
private final int nextIndex;
public EnhancerTarget(Object target, Method method, Object[] args, int nextIndex) {
this.target = target;
this.method = method;
this.args = args;
this.nextIndex = nextIndex;
}
public Object proceed() throws Throwable {
return executeEnhancers(nextIndex, target, method, args);
}
}
}
// 方法增强注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodTiming {
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecution {
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheResult {
String key() default "";
int ttl() default 300; // 秒
}
BeanFactoryPostProcessor详解
1. 动态Bean定义修改器
@Component
public class DynamicBeanDefinitionPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("开始处理Bean定义");
// 1. 修改现有Bean定义
modifyExistingBeanDefinitions(beanFactory);
// 2. 动态注册新的Bean定义
registerDynamicBeanDefinitions(beanFactory);
// 3. 设置Bean定义的依赖关系
configureBeanDependencies(beanFactory);
// 4. 根据配置条件化注册Bean
conditionalBeanRegistration(beanFactory);
}
private void modifyExistingBeanDefinitions(ConfigurableListableBeanFactory beanFactory) {
String[] beanNames = beanFactory.getBeanDefinitionNames();
for (String beanName : beanNames) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
// 修改UserService的作用域
if (beanName.endsWith("UserService")) {
System.out.println("修改Bean作用域: " + beanName);
beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE);
}
// 为所有Service添加延迟初始化
if (beanName.endsWith("Service")) {
System.out.println("设置延迟初始化: " + beanName);
beanDefinition.setLazyInit(true);
}
// 为特定Bean添加依赖
if (beanName.equals("orderService")) {
beanDefinition.setDependsOn("userService", "emailService");
System.out.println("设置Bean依赖: " + beanName);
}
}
}
private void registerDynamicBeanDefinitions(ConfigurableListableBeanFactory beanFactory) {
// 动态注册Bean定义
// 1. 注册配置Bean
registerConfigurationBean(beanFactory);
// 2. 注册工具Bean
registerUtilityBeans(beanFactory);
// 3. 注册监控Bean
registerMonitoringBeans(beanFactory);
}
private void registerConfigurationBean(ConfigurableListableBeanFactory beanFactory) {
GenericBeanDefinition configBeanDef = new GenericBeanDefinition();
configBeanDef.setBeanClass(DynamicConfigurationBean.class);
configBeanDef.setScope(BeanDefinition.SCOPE_SINGLETON);
// 设置属性值
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.add("environment", System.getProperty("spring.profiles.active", "development"));
propertyValues.add("version", "1.0.0");
configBeanDef.setPropertyValues(propertyValues);
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("dynamicConfig", configBeanDef);
System.out.println("注册动态配置Bean: dynamicConfig");
}
private void registerUtilityBeans(ConfigurableListableBeanFactory beanFactory) {
// 注册ID生成器
GenericBeanDefinition idGeneratorDef = new GenericBeanDefinition();
idGeneratorDef.setBeanClass(IdGenerator.class);
idGeneratorDef.setFactoryMethodName("getInstance");
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("idGenerator", idGeneratorDef);
System.out.println("注册ID生成器Bean: idGenerator");
// 注册日期工具
GenericBeanDefinition dateUtilDef = new GenericBeanDefinition();
dateUtilDef.setBeanClass(DateUtil.class);
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("dateUtil", dateUtilDef);
System.out.println("注册日期工具Bean: dateUtil");
}
private void registerMonitoringBeans(ConfigurableListableBeanFactory beanFactory) {
// 只在启用监控时注册监控Bean
String monitoringEnabled = System.getProperty("monitoring.enabled", "false");
if ("true".equals(monitoringEnabled)) {
GenericBeanDefinition monitorBeanDef = new GenericBeanDefinition();
monitorBeanDef.setBeanClass(ApplicationMonitor.class);
monitorBeanDef.setInitMethodName("startMonitoring");
monitorBeanDef.setDestroyMethodName("stopMonitoring");
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("applicationMonitor", monitorBeanDef);
System.out.println("注册应用监控Bean: applicationMonitor");
}
}
private void configureBeanDependencies(ConfigurableListableBeanFactory beanFactory) {
// 为动态注册的Bean配置依赖关系
if (beanFactory.containsBeanDefinition("applicationMonitor")) {
BeanDefinition monitorDef = beanFactory.getBeanDefinition("applicationMonitor");
monitorDef.setDependsOn("dynamicConfig");
}
}
private void conditionalBeanRegistration(ConfigurableListableBeanFactory beanFactory) {
// 根据环境条件注册不同的Bean
String environment = System.getProperty("spring.profiles.active", "development");
if ("development".equals(environment)) {
registerDevelopmentBeans(beanFactory);
} else if ("production".equals(environment)) {
registerProductionBeans(beanFactory);
}
}
private void registerDevelopmentBeans(ConfigurableListableBeanFactory beanFactory) {
GenericBeanDefinition mockServiceDef = new GenericBeanDefinition();
mockServiceDef.setBeanClass(MockExternalService.class);
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("externalService", mockServiceDef);
System.out.println("注册开发环境Mock服务: externalService");
}
private void registerProductionBeans(ConfigurableListableBeanFactory beanFactory) {
GenericBeanDefinition realServiceDef = new GenericBeanDefinition();
realServiceDef.setBeanClass(RealExternalService.class);
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.add("endpoint", System.getProperty("external.service.endpoint"));
propertyValues.add("timeout", Integer.parseInt(System.getProperty("external.service.timeout", "30")));
realServiceDef.setPropertyValues(propertyValues);
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("externalService", realServiceDef);
System.out.println("注册生产环境真实服务: externalService");
}
}
// 动态配置Bean
public class DynamicConfigurationBean {
private String environment;
private String version;
public DynamicConfigurationBean() {
System.out.println("创建动态配置Bean");
}
// getters and setters
public String getEnvironment() { return environment; }
public void setEnvironment(String environment) { this.environment = environment; }
public String getVersion() { return version; }
public void setVersion(String version) { this.version = version; }
}
// ID生成器工具类
public class IdGenerator {
private static final IdGenerator INSTANCE = new IdGenerator();
private final AtomicLong counter = new AtomicLong(0);
private IdGenerator() {}
public static IdGenerator getInstance() {
return INSTANCE;
}
public String generateId() {
return "ID_" + System.currentTimeMillis() + "_" + counter.incrementAndGet();
}
}
// 应用监控器
public class ApplicationMonitor {
private ScheduledExecutorService scheduler;
public void startMonitoring() {
System.out.println("启动应用监控");
scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleWithFixedDelay(() -> {
System.out.println("应用监控检查 - " + new Date());
// 监控逻辑
}, 10, 30, TimeUnit.SECONDS);
}
public void stopMonitoring() {
System.out.println("停止应用监控");
if (scheduler != null) {
scheduler.shutdown();
}
}
}
总结
Spring Bean管理是Spring框架的核心功能,通过IoC容器实现了对象的创建、配置、组装和生命周期管理的完全自动化。
🎯 核心价值
- 生命周期管理:从创建到销毁的完整生命周期自动管理
- 依赖注入:自动解析和注入对象间的复杂依赖关系
- 作用域控制:灵活的作用域机制满足不同场景需求
- 配置灵活性:支持XML、注解、Java配置多种方式
🛠️ 技术要点
- Bean定义:XML配置、Java配置、注解配置
- 实例化方式:构造器、静态工厂、实例工厂、FactoryBean
- 作用域管理:Singleton、Prototype、Web作用域、自定义作用域
- 生命周期:完整的创建到销毁过程管理
- 后处理器:BeanPostProcessor、BeanFactoryPostProcessor
🚀 最佳实践
- 合理选择作用域:无状态用Singleton,有状态用Prototype
- 生命周期管理:正确实现初始化和清理方法
- 依赖设计:避免循环依赖,使用事件驱动
- 性能优化:延迟初始化、条件化创建
- 资源管理:在销毁方法中正确清理资源
相关文章
Spring核心系列
- Spring 事务管理完整指南 - 声明式事务管理
- Spring MVC 拦截器完整指南 - Web层组件管理
- Web程序设计笔记01——Spring基本应用 - Spring入门基础
Web程序设计系列
- Web程序设计笔记04——Spring中的Bean - Bean配置详解
- Web程序设计笔记05——Spring AOP - 切面编程
- Web程序设计笔记06——Spring代理实现 - 代理模式
企业级集成
- SpringBoot整合MyBatis - 现代Spring应用
- SpringBoot项目结构 - 项目组织方式
- MyBatis动态SQL指南 - 数据访问层集成