← Назад к вопросам

Какие знаешь свойства бина в Bean Definition?

2.0 Middle🔥 151 комментариев
#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Свойства бина в 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, особенно при настройке сложных приложений с множественными зависимостями.