在spring控制器中注入类对象的方法?

时间:2013-09-12 06:54:48

标签: java spring spring-mvc controller spring-annotations

我需要在objectspring controller中注入一个applicaionContext.xml的java类。我的控制器将是,

@Controller
public class SpringController{

private MyClass obj;

}

我知道我可以使用@Autowired注释来完成。

controllerapplicaionContext.xml创建对象真的很好吗?我也可以使用<property>标记内的<bean>标记在控制器中注入一个类的对象吗?

这真的有可能吗?如果这是一个愚蠢的问题,请原谅我。

我需要知道如何在Spring控制器中注入类的对象的可能方法?

4 个答案:

答案 0 :(得分:3)

您当然可以使用@Autowired注释来自动关联关系,这可以减少为controller文件中的applicationContext.xml定义属性和构造函数参数的需要。并且为了向类添加依赖项,您不需要修改配置文件。

但它也有一些缺点,比如使用@Autowired,Spring管理bean之间的wiring details将没有任何明确的文档。要了解bean之间的关系,您必须通过托管bean。但是,如果您使用configuration files来定义关系,则可以在一个位置找到关系详细信息。

您可以通过applicaionContext.xml将一个类的对象注入控制器,如下所示:

基于构造函数的注入

@Controller
public class SpringController{

private MyClass obj;

public SpringController(MyClass obj){
this.obj=obj;
}
}

<bean id="myClassImpl" class="x.y.z.MyClassImpl"></bean>

<bean id="springController" class="x.y.z.web.controllers.SpringController">
    <constructor-arg ref="myClassImpl"></constructor-arg>
</bean>

基于Setter的注射

@Controller
public class SpringController{

private MyClass obj;

public void setObj(MyClass obj){
this.obj=obj;
}
public MyClass getObj(){
return obj;
}
}

<bean id="myClassImpl" class="x.y.z.MyClassImpl"></bean>

<bean id="springController" class="x.y.z.web.controllers.SpringController">
    <property name="obj" ref="myClassImpl"></property>
</bean>

答案 1 :(得分:1)

实际上,在场景后面注入xml和注释是一样的。 Xml是旧时尚,而注释则更新。

基本上,有两种注射类型。

byName

  

按属性名称自动装配。 Spring容器查看属性   在XML中将autowire属性设置为byName的bean   配置文件。然后它尝试匹配并连接其属性   使用配置文件中相同名称定义的bean。

您可以使用xml和annotation为bean指定显式名称。

@Service("BeanName")
@Component("BeanName")
@Controller("BeanName")

<bean name="BeanName" class="someclass"></bean>

并使用@Qualifier注释注入bean。

@Autowired
 @Qualifier("BeanName")

和xml

<bean id="MyBean2" class="MyBean2 class">
<property name="Property of MyBean2 which refers to injecting bean" ref="BeanName" />
</bean>

byType

  

按属性数据类型自动装配。 Spring容器看着   autowire属性设置为byType的bean的属性   在XML配置文件中。然后它尝试匹配并连接   属性,如果其类型与其中一个bean名称匹配   配置文件。如果存在多个这样的豆类,则致命   抛出异常。

默认自动接线模式是byType,因此spring将在自动接线中查找匹配类型。但是,旧版本的Spring在注入时具有默认行为none。如果你想使用xml注入byType,你应该明确告诉spring contaioner。

例如,MyBean2具有对MyBean的引用,通过将autowired属性设置为byType,它会自动处理注入。

<bean id="MyBean" class="MyBean class">
<property name="Property of MyBean2 which refers to injecting bean" ref="BeanName" />
</bean>

<bean id="MyBean2" class="MyBean2 class" 
      autowire="byType">      
 </bean>

它还取决于代码中注入的位置。有两种类型,setter getter注入和构造函数注入。

注意:@Controller没有区别,因为它们已经处于春季环境中。

另见

Spring Beans Auto wiring

答案 2 :(得分:1)

如果你想在控制器中注入一个对象而你特别想要使用xml,那么你应该在应用程序上下文中创建一个单例范围控制器类的bean,而不是Controller的组件扫描。 您的控制器类不需要使用@Controller进行注释。

然后你必须扩展一些控制器,如AbstractCommandController, AbstractController, AbstractFormController, AbstractWizardFormController, BaseCommandController, CancellableFormController, MultiActionController SimpleFormController, UrlFilenameViewController

现在要注入特定对象,您可以使用基于构造函数和基于Setter的注入。 或者您可以按名称或类型使用Autowring来自动注入对象。 确保您还在Application Context中声明了该对象的bean。

在DispatcherServlet收到请求并完成其工作以解析区域设置,主题等之后,它会尝试使用HandlerMapping解析Controller。当找到Controller来处理请求时,将调用所定位的Controller的handleRequest方法;然后,定位的Controller负责处理实际请求,并且 - 如果适用 - 返回适当的ModelAndView。

多数民众赞成。

答案 3 :(得分:0)

我遇到了这样的问题。我得到了“模糊映射”。 (我也使用xml配置,我正在向我的控制器中注入一个bean) 然后看着我的控制台,我意识到我的控制器被实例化了两次。 在更详细的外观中,我注意到了我的注释

@Controller(value = "aController")

(注意值=“aController”)

与我的xml配置不同,其中我正在使用不同的bean id

来实现相同的控制器
<bean id="aControleRRRRR" class="package.ControllerClassName"
    p:property-ref="beanToInject" />

(注意id =“aControleRRRRR”)

总之,你的@Controller名称(value =“ aController ”)需要与你在XML配置中给出的名称完全相同(id =“ aControleRRRRR “),以便Spring可以设法区分它们引用相同的bean(实例)

希望这有帮助