当我尝试在类上使用@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
答案 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定义。