У меня есть класс Employee, который синглтон, как определено в spring.xmlКак работает геттер (Singleton Bean) в случае, если мы вставляем прототип bean в singleton bean через доверенный прокси-сервер?
public class Employee{
private Vehicle vehicle;
public Vehicle getVehicle() {
return vehicle;
}
public void setVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
}
}
У меня есть класс автомобиля, который является прототипом, как это определено в spring.xml
public class Vehicle {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Ниже приводится spring.xml
<bean id="employee" class="com.example.factory.Employee">
<property name="vehicle" ref="vehicle"></property>
</bean>
<bean id="vehicle" class="com.example.factory.Vehicle" scope="prototype">
<property name="name" value="car"></property>
<aop:scoped-proxy />
</bean>
Теперь я знаю, что весна создаст прокси для автомобиля. Каждый раз, когда я вызываю getVehicle() на объект employee, я получаю новый объект Vehicle. Но в методе getVehicle() я не создаю новый объект Vehicle, и, согласно моему пониманию, Spring не создает прокси для объекта Employee. Итак, кто-то, пожалуйста, заставьте меня детально понять, что происходит внутри, и как работает getVehicle()?
Фактически 'getVehicle()' всегда возвращает тот же объект, который фактически является прокси-сервером для фактического экземпляра 'Vehicle'. Для каждого вызова метода, который вы делаете на «Vehicle», вы получите новый экземпляр, потому что это то, что вы сказали ему, чтобы сделать с scoped-прокси и «scope = prototype». В принципе, прокси-сервер с ограниченной видимостью не имеет смысла для «scope = prototype» только для областей «запрос» и «сеанс» (и некоторых других, которые не предоставляются по умолчанию). –
, если 'getVehicle()' всегда возвращает один и тот же объект, то почему при выполнении этого оператора 'System.out.println (getVehicle())' каждый раз выводит другой хэш-код? – lavish
Поскольку он возвращает прокси вместо фактического объекта, прокси-сервер всегда один и тот же. Метод 'hashCode' передается фактическому базовому объекту (в основном с использованием' hashCode', чтобы проверить, является ли он одним и тем же объектом, не очень хорошо, особенно если не используются прокси-серверы). –