2014-01-15 2 views
0

Может кто-нибудь объяснить, что происходит, когда мы называемРеализация «Context.getApplicationContext(). GetBean»

ApplicationContext.getApplicationContext().getBean(abcclassName.class) 

будучи abcclassName быть абстрактным классом.

Я понимаю, что абстрактный класс не может быть создан. Тогда как это работает?

ответ

0

Я никогда не делал этого с абстрактными классами, но с интерфейсами.

Что нужно сделать, так это получить экземпляр подкласса, определенный в вашем контексте. Другими словами, если у вас есть компонент класса Cat (подкласс Animal), определенный в вашем контексте, и вы используете класс Animal для перехода к вашему ApplicationContext.getBean(). Ты вернешь Кота.

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

Смотрите это для справки: http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/beans/factory/BeanFactory.html#getBean%28java.lang.Class%29

0

Просматривая исходный код для DefaultListableBeanFactory - source - должен ответить на ваш вопрос. (Обе ссылки предназначены для версии 3.0.x, так как это то, что я нашел с GrepCode. Я полагаю, что мало что изменилось с точки зрения поиска соответствующих компонентов по типу)

В принципе, он берет класс и выглядит для Beans в ApplicationContext, которые присваиваются предоставленному типу.

Метод AbstractBeanFactory#isTypeMatch(String, Class<?>) содержит код, который будет вам интересен, и есть путь, который достигает его с помощью метода DefulatListableBeanFactory#getBean(Class<?>).

0

После прохождения Исходный код Spring 3.0.5, когда вы делаете
ApplicationContext.getApplicationContext().getBean(abcclassName.class) на абстрактном классе, и если абстрактный класс не настроен как @component, то AbstractBeanFactory вызывает метод isTypematch для получения Корректной сущности.

В основном он принимает все бобы (которые когда-либо инициировались в контексте) и повторяется один за другим, и проверяет, что компонент для фабрики запрошен или компонент может быть назначен для запрошенного.
Если только один бит разрешен с использованием этого типа, тогда он возвращает этот bean-компонент

, если он обнаружил несколько боб и затем возвратил ошибку.

return !BeanFactoryUtils.isFactoryDereference(name) && 
        typeToMatch.isAssignableFrom(beanInstance.getClass()); 

typeToMatch.isAssignableFrom(beanInstance.getClass()); использование вызова собственного метода в классе Object public native boolean isAssignableFrom(Class<?> cls); проверить