Может ли @Autowired по типу создать определение компонента? - PullRequest
2 голосов
/ 22 марта 2011

Когда вы используете @Autowired в пружине @Component, spring определяет кандидатов на автопроводку для каждого экземпляра компонента, что не очень хорошо, если вы используете веб-материал с областью действия @ Request / @ Session. Почему Spring не может просто сделать определение bean-компонента внутри ApplicationContext и использовать его повторно? Есть ли способ заставить это сделать?

Ответы [ 5 ]

1 голос
/ 22 марта 2011

AutowiredAnnotationBeanPostProcessor - это BeanPostProcessor, а не BeanFactoryPostProcessor, поэтому он не может редактировать определения Бина по своему замыслу.Реализация этого по-другому нарушит ожидаемую функциональность:

public class MyBean{

    @Autowired(required=false)
    public void setOtherBean(OtherBean o){this.otherBean=o;}
    private OtherBean otherBean;

}

Если экземпляр OtherBean недоступен, ни один не будет подключен, но как только один станет доступным (и я легко могу подключить один), следующийMyBean экземпляр (если область не одноэлементная) получит новый OtherBean (который не был доступен ранее).

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

1 голос
/ 22 марта 2011

Да: Spring будет повторно использовать компонент, когда вы устанавливаете область действия на что-то другое (то есть вы не должны использовать прототип, сеанс или запрос). Так что хитрость заключается в использовании двух бобов: одного, в котором есть все, что не меняется. И один компонент, который присоединен к сеансу / запросу и имеет только одну зависимость: первый компонент.

Spring не может сделать это за вас, поскольку не существует правила, когда бин достаточно «статичен» - вы, как разработчик, должны это определить.

[EDIT] Вы должны собрать статические части компонента (те, которые не изменятся со временем) в DAO / компоненте службы. Затем используйте этот боб в вашем @Component -> одном поиске.

Чтобы ускорить поиск, прикрепите имя к компоненту. Для поиска на основе типов Spring должен выполнять итерацию по всему контексту (поскольку могут совпадать несколько bean-компонентов), в то время как поиск на основе имени / идентификатора - это просто поиск на карте.

Чтобы дать бину имя, укажите его в @Context или используйте @Bean(name="name"). Чтобы сообщить Spring, какой компонент использовать из контекста, используйте @Resource(name) или @Qualifier("businessObject").

0 голосов
/ 23 марта 2011

Установите атрибут proxyMode для аннотации @Scope для ваших bean-компонентов области запросов / сеансов. Spring создаст прокси, который будет автоматически подключен - прокси будет искать фактический компонент, для которого вызывается метод.

0 голосов
/ 22 марта 2011

Ручная альтернатива заключается в том, чтобы внедрить Provider синглтонной области в ваши bean-компоненты, которые обеспечивают bean-объекты с прототипом.

Это означает, что программист проделал большую работу, но, тем не менее, снижение производительности будет устранено.

0 голосов
/ 22 марта 2011

Рекомендуется использовать классы обслуживания, компоненты, DAO и т. Д. В качестве одиночных элементов и иметь только один экземпляр в контексте приложения. @ Аннотация для компонента приводит к тому, что в процессе сканирования компонентов обнаруживаются только исходные данные, что означает, что они кандидаты на авто-сканирование и живые экземпляры в весеннем контексте. Например:

@Component
public class StudentDAO {
        @Override
        public String toString() {
                return " inside StudentDAO";
        }
}

StudentDAO является объектом доступа к данным, и в передовых практиках более одного экземпляра этой службы не требуется в контексте. Это в основном класс обслуживания. Это идеальный кандидат на синглтон. Если вокруг только один экземпляр этого объекта, автопроводка также работает эффективно 8-). Но вы все равно должны остерегаться доступа к одноэлементным методам и решите пометить ваши методы как синхронизированные, чтобы предотвратить нежелательные эффекты потоков.

...