我是Spring 3的新手,特别是其他更精彩的附加注释
我不知道如何拥有一个控制器类B
,它扩展了控制器类A
,其中A
是通过xml文件定义的,有一些有用的东西 - 比如说db连接或其他什么。
如果我有一个(抽象)父bean A
和一个具体的bean B
,而B
是一个控制器,我正在使用注释 - 自动连线(你懂,
<context:component-scan base-package="package"/>
),我能以某种方式将B
与A
联系起来吗?我使用注释吗?我在哪里定义A
,因为A
需要放入一些随机的春豆?
答案 0 :(得分:2)
在@Shakedown提到的控制器中建立数据库连接是一种不好的做法。我知道这只是一个例子,但我想确保指出这一点。
对于大多数项目,使用Spring注释,几乎可以完全摆脱XML。
通常有一个AbstractController
类,从中派生出其他具体类。
@Controller
@RequestMapping(value = "/action")
public class AController extends AbstractController
{
@Autowired
private AService aService;
...
}
可以使用@Autowired
注释将依赖关系注入到Spring类中。如果你想将依赖项注入到AbstractController中,这在技术上不是一个Spring托管类 - 你可以通过添加@Component
注释来实现它。
@Component
public abstract class AbstractController
{
@Autowired
protected CommonService commonService;
@ExceptionHandler(MyException.class)
public ModelAndView handleMyException(MyException e)
{
ModelAndView model = new ModelAndView();
model.addObject("errorMessage", e.getMessage());
model.setViewName("error");
return model;
}
...
}
然后,您可以在子类中使用依赖项。
答案 1 :(得分:1)
这不是一个真正的答案 - 但它是我最终采取的解决方案!它几乎只是扩展了Beau和Skaffman给出的答案,我只是把它放在这里完成。
假设:
@Controller
class B extends A {
... B things done here! They use something!
}
和
abstact class A {
private Object something;
public void setSomething(Object something);
public Object getSomething();
}
以及我曾经拥有的地方:
<bean id="A" abstract="true"
class="package.to.A">
<property name="something">
<bean ref to something here>
</property>
</bean>
和
<bean id="B" parent="A"
class="package.to.B">
</bean>
我知道(dun dun DUUUN):
<context:component-scan base-package="package.to.A"/>
<bean ref to something here with an id - it was an inner bean before>
<!-- no A or B beans defined -->
和
abstact class A {
@Autowired
private Object something;
public void setSomething(Object something);
public Object getSomething();
}
我在AbstractController派生的抽象类上不需要@Component,但我认为你的意思是我需要@Component,如果我想用abstractController做一些事情?