我需要在object
到spring controller
中注入一个applicaionContext.xml
的java类。我的控制器将是,
@Controller
public class SpringController{
private MyClass obj;
}
我知道我可以使用@Autowired
注释来完成。
为controller
到applicaionContext.xml
创建对象真的很好吗?我也可以使用<property>
标记内的<bean>
标记在控制器中注入一个类的对象吗?
这真的有可能吗?如果这是一个愚蠢的问题,请原谅我。
我需要知道如何在Spring控制器中注入类的对象的可能方法?
答案 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是旧时尚,而注释则更新。
基本上,有两种注射类型。
按属性名称自动装配。 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>
按属性数据类型自动装配。 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
没有区别,因为它们已经处于春季环境中。
另见
答案 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(实例)
希望这有帮助