Какие знаешь свойства бина в Bean Definition?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Свойства бина в Bean Definition
Bean Definition в Spring Framework содержит полную информацию о том, как создавать и конфигурировать бины в контейнере IoC. Это класс BeanDefinition, который описывает метаданные бина.
Ключевые свойства Bean Definition
1. Имя бина (Bean Name/ID)
// XML конфигурация
<bean id="userService" class="com.example.UserService" />
// Annotation конфигурация
@Bean(name = "userService")
public UserService userService() {
return new UserService();
}
// Несколько имен для одного бина
@Bean(name = {"userService", "userSvc"})
public UserService userService() {
return new UserService();
}
// Java конфигурация: получение информации
BeanDefinition definition = beanFactory.getBeanDefinition("userService");
String beanName = definition.getBeanClassName();
2. Класс бина (Bean Class)
Полное имя класса, экземпляр которого будет создан:
// XML
<bean id="userService" class="com.example.UserService" />
// Программный доступ
BeanDefinition definition = beanFactory.getBeanDefinition("userService");
String className = definition.getBeanClassName(); // com.example.UserService
Class<?> beanClass = Class.forName(definition.getBeanClassName());
3. Scope (Область видимости)
Определяет, как часто создаются экземпляры бина:
// singleton (по умолчанию) — один экземпляр на приложение
@Bean
@Scope("singleton")
public UserService userService() {
return new UserService();
}
// prototype — новый экземпляр при каждом запросе
@Bean
@Scope("prototype")
public UserService userService() {
return new UserService();
}
// request — новый экземпляр для каждого HTTP запроса (web)
@Bean
@Scope("request")
public UserService userService() {
return new UserService();
}
// session — один экземпляр на HTTP сессию
@Bean
@Scope("session")
public UserService userService() {
return new UserService();
}
// Проверка scope
BeanDefinition definition = beanFactory.getBeanDefinition("userService");
String scope = definition.getScope(); // "singleton" или "prototype"
boolean isSingleton = definition.isSingleton();
4. Зависимости (Dependencies)
Другие бины, необходимые для создания данного бина:
// Constructor injection
@Component
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
// Setter injection
@Component
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
// Field injection
@Component
public class UserService {
@Autowired
private UserRepository userRepository;
}
// XML конфигурация
<bean id="userService" class="com.example.UserService">
<constructor-arg ref="userRepository" />
</bean>
<bean id="userRepository" class="com.example.UserRepository" />
// Проверка зависимостей
BeanDefinition definition = beanFactory.getBeanDefinition("userService");
PropertyValues propertyValues = definition.getPropertyValues();
for (PropertyValue pv : propertyValues.getPropertyValues()) {
System.out.println("Property: " + pv.getName());
}
5. Свойства (Properties)
Значения, которые устанавливаются на поля бина:
// XML конфигурация
<bean id="userService" class="com.example.UserService">
<property name="maxUsers" value="100" />
<property name="timeout" value="30000" />
<property name="enabled" value="true" />
</bean>
// Annotation конфигурация
@Component
public class UserService {
@Value("${max.users:100}")
private int maxUsers;
@Value("${timeout:30000}")
private long timeout;
}
// Java конфигурация
@Configuration
public class AppConfig {
@Bean
public UserService userService(
@Value("${max.users:100}") int maxUsers) {
UserService service = new UserService();
service.setMaxUsers(maxUsers);
return service;
}
}
6. Метод инициализации (Init Method)
Метод, вызываемый после создания бина:
// Annotation способ
@Component
public class UserService {
@PostConstruct
public void init() {
System.out.println("Bean инициализирован");
// Запуск асинхронного процесса
// Инициализация ресурсов
}
}
// Интерфейс InitializingBean
@Component
public class UserService implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Bean инициализирован");
}
}
// XML конфигурация
<bean id="userService" class="com.example.UserService"
init-method="init" />
// Java конфигурация
@Bean(initMethod = "init")
public UserService userService() {
return new UserService();
}
7. Метод уничтожения (Destroy Method)
Метод, вызываемый при завершении приложения:
// Annotation способ
@Component
public class UserService {
@PreDestroy
public void destroy() {
System.out.println("Bean уничтожается");
// Закрытие соединений
// Освобождение ресурсов
}
}
// Интерфейс DisposableBean
@Component
public class UserService implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("Bean уничтожается");
}
}
// XML конфигурация
<bean id="userService" class="com.example.UserService"
destroy-method="cleanup" />
// Java конфигурация
@Bean(destroyMethod = "cleanup")
public UserService userService() {
return new UserService();
}
8. Ленивая инициализация (Lazy Initialization)
Бин создается только при первом обращении:
// Annotation
@Component
@Lazy
public class UserService {
public UserService() {
System.out.println("UserService создан"); // Выведется позже
}
}
// Java конфигурация
@Bean
@Lazy
public UserService userService() {
return new UserService();
}
// XML конфигурация
<bean id="userService" class="com.example.UserService" lazy-init="true" />
// Проверка ленивой инициализации
BeanDefinition definition = beanFactory.getBeanDefinition("userService");
boolean isLazy = definition.isLazyInit();
9. Primary bean (Основной бин)
Указывает, какой бин выбирать при конфликте автопроводки:
// Два реализации интерфейса
@Component
public class PostgresUserRepository implements UserRepository { }
@Component
@Primary // Этот бин будет выбран по умолчанию
public class MongoUserRepository implements UserRepository { }
// Автопроводка выберет MongoUserRepository
@Service
public class UserService {
@Autowired
private UserRepository userRepository; // MongoUserRepository
}
10. Qualifier (Квалификатор)
Очные имя бина для разрешения конфликтов:
@Component("postgresRepo")
public class PostgresUserRepository implements UserRepository { }
@Component("mongoRepo")
public class MongoUserRepository implements UserRepository { }
// Явное указание нужного бина
@Service
public class UserService {
@Autowired
@Qualifier("mongoRepo")
private UserRepository userRepository; // MongoUserRepository
}
// Или в конструкторе
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public UserService(@Qualifier("mongoRepo") UserRepository repo) {
this.userRepository = repo;
}
}
11. Abstract flag (Абстрактный бин)
Бин-шаблон для наследования другими определениями:
// XML конфигурация
<bean id="baseService" class="com.example.BaseService" abstract="true">
<property name="maxRetries" value="3" />
<property name="timeout" value="30000" />
</bean>
<bean id="userService" class="com.example.UserService" parent="baseService" />
<bean id="orderService" class="com.example.OrderService" parent="baseService" />
12. Autowiring mode (Режим автопроводки)
Как Spring должен внедрять зависимости:
// XML: no (по умолчанию), byName, byType, constructor
<bean id="userService" class="com.example.UserService"
autowire="byType" />
// Annotation (явно)
@Component
public class UserService {
@Autowired(required = false) // Опциональная зависимость
private UserRepository userRepository;
}
Программный доступ к свойствам
@Component
public class BeanDefinitionInspector {
@Autowired
private DefaultListableBeanFactory beanFactory;
public void inspectBean(String beanName) {
BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
System.out.println("Bean Name: " + beanName);
System.out.println("Class: " + definition.getBeanClassName());
System.out.println("Scope: " + definition.getScope());
System.out.println("Singleton: " + definition.isSingleton());
System.out.println("Lazy Init: " + definition.isLazyInit());
System.out.println("Abstract: " + definition.isAbstract());
System.out.println("Primary: " + definition.isPrimary());
System.out.println("Autowire Mode: " + definition.getAutowireMode());
System.out.println("Init Method: " + definition.getInitMethodName());
System.out.println("Destroy Method: " + definition.getDestroyMethodName());
}
}
Полное понимание Bean Definition критично для работы с Spring Framework, особенно при настройке сложных приложений с множественными зависимостями.