我有类Employee,它是spring.xml中定义的单例
public class Employee{
private Vehicle vehicle;
public Vehicle getVehicle() {
return vehicle;
}
public void setVehicle(Vehicle vehicle) {
this.vehicle = 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()时,我都会获得Vehicle的新对象。但是在getVehicle()方法中,我没有创建Vehicle的新对象,并且根据我的理解,spring并没有为Employee对象创建代理。所以有人请让我详细了解内部发生了什么以及getVehicle()是如何工作的?
答案 0 :(得分:1)
每次调用getVehicle()时,都不会获得新的Vehicle实例。每次Spring必须提供一个新的Vehicle实例。这可能以两种方式发生:
有关更详细的说明,请参阅this page。
答案 1 :(得分:0)
以下是我对此的发现
我已经通过删除初始化来更改了车辆的bean定义。
<bean id="employee" class="com.emp.Employee">
<property name="vehicle" ref="vehicle"></property>
</bean>
<bean id="vehicle" class="com.emp.Vehicle" scope="prototype">
<aop:scoped-proxy />
</bean>
我已经为这个场景创建了一个测试类
见下面的代码
public class TestScope {
@Autowired
Employee employee = null;
@Test
public void testScope()
{
employee.getVehicle().setName("bike");
System.out.println("vehicle name:"+employee.getVehicle().getName());
}
}
运行上面的代码后,输出低于
vehicle name:null
但是如果我将Vehicle的范围更改为默认(单例)类,我将得到以下结果
vehicle name:bike
总而言之,对于每个employee.getVehicle(),都会创建一个Vehicle的新实例,因为它在bean定义中明确声明,并且代理将引用此对象。但是如果我们删除范围定义,它将是单例并且将创建一个单独的对象,并且在整个bean的生命周期中将保持相同。