@scope - 弹簧 - 设定范围"原型"使用注释,表现得像单身。我哪里错了?

时间:2016-08-03 12:28:59

标签: java spring scope annotations

当我尝试在类上使用@scope(" prototype")时,我发现它的行为类似于" singleton"我不确定我错在哪里。对此有任何帮助非常感谢。

员工类 - 设置范围 - 原型

 import org.springframework.context.annotation.Scope; 
@Scope("prototype")
public class Employee {

    private String emp_name;
    public String getEmp_name() {
        return emp_name;
    }

    public void setEmp_name(String emp_name) {
        this.emp_name = emp_name;
    }
}

部门班级设定范围 - 单身人士

import org.springframework.context.annotation.Scope;
@Scope("singleton")
public class Department {
private String dep_name;

public String getDep_name() {
    return dep_name;
}
public void setDep_name(String dep_name) {
    this.dep_name = dep_name;
}   

}

的beans.xml

<context:component-scan base-package="com"/> 

 <!-- Scope Annotations -->
     <bean id="dep_scope" class="com.scope.annotation.Department" >
     </bean>
    <bean id="emp_scope" class="com.scope.annotation.Employee" >
     </bean>

主要应用程序

public class MainApp {
       public static void main(String[] args) {
          ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

          Employee emp = (Employee) context.getBean("emp_scope");
          emp.setEmp_name("Saro");
          System.out.println("first"+emp.getEmp_name());

          Employee emp2 = (Employee) context.getBean("emp_scope");
          System.out.println("second"+emp2.getEmp_name());

          Department dep = (Department) context.getBean("dep_scope");
          dep.setDep_name("Maths");
          System.out.println("first"+dep.getDep_name());

          Department dep2 = (Department) context.getBean("dep_scope");
          System.out.println("second"+dep2.getDep_name());
       }
    }

输出:

firstSaro secondSaro firstMaths secondMaths

I expected secondnull instead of secondSaro

3 个答案:

答案 0 :(得分:1)

尝试在bean标签中的beans.xml文件中定义范围....你正在使用注释和xml ...只需使用...

或者您可以尝试使用注释定义bean ... 为此,您可以使用 @Bean 注释。

@Configuration
public class Config {

   @Bean(scope=DefaultScopes.PROTOTYPE) 
   public TestBean testBean(){
      return new TestBean();
   }
}

在您的主逻辑中,您可以使用以下代码

TestBean testBean = ctx.getBean(TestBean.class);

答案 1 :(得分:1)

它表现为单例,因为这是在xml conf中定义的方式。默认范围是单例,原型应该声明如下

<bean id="dep_scope" class="com.scope.annotation.Department" scope="prototype">
 </bean>

如果您想使用注释,javadoc声明@Scope应与@Component一起使用,就像这样

@Component
@Scope("prototype")
public class Employee {
    //...
}

public class ExampleUsingEmployee {    
    @Inject
    private Employee enployee; //will be automatically injected by spring    
    // ... do other stuff
}

您应该避免(如果可能)同时使用xml和注释。

答案 2 :(得分:0)

你已经放

context:component-scan base-package="com" 

如果使用@Component或其他bean注释(如@Service等)进行注释,将尝试实例化bean。但这并不会使spring进程成为其他注释配置。

如果要处理其他弹簧注释,则必须注册

context:annotation-config> .

也是为了让spring在定义的bean中查找注释。

摘要

context:component-scan :如果使用合适的注释注释,将在包中实例化bean

context:annotation-config :将处理已配置bean中的注释,无论它们是通过注释还是xml定义。