无论春天的母豆发生了什么?

时间:2011-12-01 17:42:09

标签: spring annotations parent-child

我是Spring 3的新手,特别是其他更精彩的附加注释

我不知道如何拥有一个控制器类B,它扩展了控制器类A,其中A是通过xml文件定义的,有一些有用的东西 - 比如说db连接或其他什么。

如果我有一个(抽象)父bean A和一个具体的bean B,而B是一个控制器,我正在使用注释 - 自动连线(你懂,     <context:component-scan base-package="package"/> ),我能以某种方式将BA联系起来吗?我使用注释吗?我在哪里定义A,因为A需要放入一些随机的春豆?

2 个答案:

答案 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做一些事情?