2

我需要在through中注入object一个 java 类。我的控制器将是,spring controllerapplicaionContext.xml

@Controller
public class SpringController{

private MyClass obj;

}

我知道我可以通过@Autowired注释来做到这一点。

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

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

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

4

4 回答 4

3

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

但它也有一些缺点,比如如果你使用,那么Spring 托管 bean 之间@Autowired将没有任何明确的文档。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>
于 2013-09-12T07:54:04.593 回答
1

实际上,使用 xml 和注解的注入在幕后是相同的。Xml 是旧时尚,而注解是较新的。

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

按名字

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

您可以使用 xml 和注释为 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>

按类型

按属性数据类型自动装配。Spring 容器查看在 XML 配置文件中将 autowire 属性设置为 byType 的 bean 的属性。然后,如果属性的类型与配置文件中的一个 bean 名称完全匹配,它会尝试匹配和连接属性。如果存在多个此类 bean,则会引发致命异常。

默认的自动连线模式是 byType,所以 spring 会在自动连线中寻找匹配的类型。none但是,旧版本的 Spring在注入时具有默认行为。如果你想使用 xml 注入 byType,你应该明确告诉 spring 容器。

例如 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 自动布线

于 2013-09-12T07:23:14.507 回答
1

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

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

现在要注入特定对象,您可以使用基于构造函数和设置器的注入。或者您可以按名称或类型使用 Autowring 来自动注入对象。确保您还在应用程序上下文中声明了该对象的 bean。

在 DispatcherServlet 收到请求并完成解析语言环境、主题等的工作后,它会尝试使用 HandlerMapping 解析 Controller。当找到一个Controller来处理请求时,会调用定位到的Controller的handleRequest方法;定位到的控制器然后负责处理实际请求,并 - 如果适用 - 返回适当的 ModelAndView。

就是这样。

于 2013-09-12T09:29:23.290 回答
0

我遇到了这样的问题。我得到“发现不明确的映射”。(我也使用 xml 配置,并且我正在将一个 bean 注入我的控制器)然后看着我的控制台,我意识到我的控制器被实例化了两次。更详细地看,我注意到我的注释

@Controller(value = "aController")

(注意值 = “aController”)

与我的 xml 配置不同

<bean id="aControleRRRRR" class="package.ControllerClassName"
    p:property-ref="beanToInject" />

(注 id="aControleRRRRR")

因此,总而言之,您的 @Controller 名称 (value = " aController ") 需要与您在 XML 配置中提供的名称 (id=" aControleRRRRR ") 完全相同,以便 Spring 可以设法区分它们指的是相同的豆(实例)

希望这可以帮助

于 2015-06-02T07:31:38.493 回答