Что случилось с весенним родительским бобом? - PullRequest
3 голосов
/ 01 декабря 2011

Я новичок в Spring 3 и его необычных дополнительных аннотациях, в частности

. Я понятия не имею, как создать класс контроллера B, который расширяет класс контроллера A, где Aопределяется через XML-файлы, чтобы иметь что-то полезное - скажем, соединение БД или что-то еще.

Если у меня есть (абстрактный) родительский компонент A и конкретный компонент B, а B - это контроллер, И я использую автоматическую разметку аннотаций (вы знаете,<context:component-scan base-package="package"/>), можно как-нибудь привязать B к A?Я использую аннотации?Где я могу определить A, учитывая, что в A нужно вставить какой-нибудь случайный весенний боб?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Использование соединения с базой данных на вашем контроллере, как упоминает @Shakedown, является плохой практикой. Я знаю, что это всего лишь пример, но я хотел убедиться, что на это было указано.

С помощью аннотаций Spring вы можете почти полностью отказаться от XML для большинства проектов.

Обычно существует класс AbstractController, из которого получены другие конкретные классы.

@Controller
@RequestMapping(value = "/action")
public class AController extends AbstractController
{
    @Autowired
    private AService aService;
    ...
}

Зависимости могут быть внедрены в классы Spring с помощью аннотации @Autowired. Если вы хотите внедрить зависимости в ваш 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 голос
/ 03 декабря 2011

Это не совсем ответ - но это решение, которое я принял в конце концов!Это в значительной степени просто расширяет ответ, данный Бо и Скаффманом, я просто приведу его здесь, чтобы завершить.

Дано:

@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();
}

Мне не нужен @Component для моего абстрактного класса, производного от AbstractController, но я так понимаю, вы имеете в виду, что мне нужен @Component, если я хочу что-то сделать с abstractController?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...