Java 如何在spring控制器中注入类的对象?

Java 如何在spring控制器中注入类的对象?,java,spring,spring-mvc,controller,spring-annotations,Java,Spring,Spring Mvc,Controller,Spring Annotations,我需要通过applicationcontext.xml在spring控制器中注入java类的对象。我的控制器将是 @Controller public class SpringController{ private MyClass obj; } 我知道我可以用@Autowired注释来完成 @Service("BeanName") @Component("BeanName") @Controller("BeanName") <bean name="BeanName" class="

我需要通过
applicationcontext.xml
spring控制器中注入java类的
对象。我的控制器将是

@Controller
public class SpringController{

private MyClass obj;

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

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

<bean name="BeanName" class="someclass"></bean>
@Autowired
 @Qualifier("BeanName")
通过
applicationcontext.xml
控制器创建对象真的很好吗?我还可以在
标记中使用
标记在控制器中注入类的对象吗

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


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

实际上,在幕后注入xml和注释也是一样的。Xml是旧的时尚,而注释是新的

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

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

您可以使用xml和注释为bean指定显式名称

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

<bean name="BeanName" class="someclass"></bean>
@Autowired
 @Qualifier("BeanName")
并使用xml

<bean id="MyBean2" class="MyBean2 class">
<property name="Property of MyBean2 which refers to injecting bean" ref="BeanName" />
</bean>
这还取决于注入在代码中发生的位置。有两种类型,setter-getter注入和构造函数注入

注意:
@Controller
中没有区别,因为它们已经在spring上下文中

另请参见


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

但是它也有一些缺点,比如如果使用
@Autowired
,那么Spring托管bean之间的
布线细节将没有任何明确的文档。要了解bean之间的关系,必须检查托管bean。但是,如果使用
配置文件
定义关系,则可以在一个位置找到关系详细信息

您可以通过
applicationcontext.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>
@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>
@控制器
公共类SpringController{
私人MyClass obj;
公共SpringController(MyClass obj){
obj=obj;
}
}
基于Setter的注入

@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>
@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>
@控制器
公共类SpringController{
私人MyClass obj;
公共无效设置对象(MyClass对象){
obj=obj;
}
公共MyClass getObj(){
返回obj;
}
}

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

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

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

DispatcherServlet收到请求并完成解析区域设置、主题等类似内容的工作后,它会尝试使用HandlerMapping解析控制器。当找到一个控制器来处理请求时,将调用所定位控制器的HandlerRequest方法;然后,定位的控制器负责处理实际请求,并(如果适用)返回适当的ModelAndView


就是这样。

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

@Controller(value = "aController")
(注意value=“aController”)

与我的xml配置不同,在xml配置中,我使用不同的bean id安装相同的控制器

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

(注意id=“acontrolerrr”)

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


希望这对您有所帮助

谢谢您的回复。但我知道自动布线。我在问如何注入XML?请参阅我的编辑。然而,您的问题并没有特别提到xml注入。我特别问控制器。我认为控制器也在spring上下文中,没有区别。尝试此链接会很有用,谢谢您的回答。但我知道自动布线。我问的是如何注入XML?我问的是关于控制器的问题?你的问题不清楚,我们这里有一个问题。谢谢你的回答。我不喜欢构造函数注入。我做了setter和gertter注入。但是构造函数将被调用两次,因为通过这种方式创建了两个对象。然后我的请求将如何进入控制器,如果我没有指定@Controller?应用程序上下文是一个容器,负责实例化和自动连接所有bean或对象