如果getter工作(Singleton Bean)以防万一,我们通过aop scoped代理将原型bean注入到singleton bean中?

时间:2016-02-02 10:05:52

标签: java spring proxy

我有类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()是如何工作的?

2 个答案:

答案 0 :(得分:1)

每次调用getVehicle()时,都不会获得新的Vehicle实例。每次Spring必须提供一个新的Vehicle实例。这可能以两种方式发生:

  1. 你问Spring是否有车载豆
  2. Spring将一个Vehicle自动装配到Employee bean。这只发生一次,因为Employee是一个单身人士。所以,如果这是唯一的 使用车辆的方式,它也可能是一个单身人士。
  3. 有关更详细的说明,请参阅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的生命周期中将保持相同。