Несколько ключевых «отличий» в «Стиле» внутри более широкого баннера ООП.
Во всех случаях утверждение о статической или динамической системе типа означает преимущественно одну или другую, проблема далеко не ясна или четко определена. Также многие языки предпочитают стирать грань между вариантами, так что это ни в коем случае не список двоичных вариантов.
или «что означает foo.Bar(x)
?»
1 часто используется в статически типизированных средах, где это ошибка, проверяется во время компиляции на отсутствие такой реализации. Кроме того, языки часто различают Bar (x) и Bar (y), если x и y - разные типы. Это перегрузка методов, и результирующие методы с одинаковыми именами рассматриваются как совершенно разные.
2 часто используется в динамических языках (которые имеют тенденцию избегать перегрузки методов), так как возможно, что во время выполнения тип foo не имеет «обработчика» для сообщения с именем «Bar», разные языки обрабатывают это по-разному пути.
Оба могут быть реализованы за кулисами одним и тем же способом, если это необходимо (часто по умолчанию для второго стиля Smalltalk является вызов функции, но это не является определенным поведением во всех случаях). Поскольку первый метод часто может быть легко реализован как простые вызовы функции смещения указателя, его можно легче сделать относительно быстро. Это не означает, что другие стили также не могут быть сделаны быстро, но может потребоваться больше работы, чтобы гарантировать, что при этом не будет нарушена большая гибкость.
или «Откуда берутся дети?»
Снова 1 имеет тенденцию происходить в статических языках, 2 в динамике, хотя это ни в коем случае не является требованием, они просто поддаются стилю.
или «что или как?»
Это очень не бинарный выбор. Большинство языков на основе классов допускают концепцию абстрактных методов (еще не реализованных). Если у вас есть класс, в котором все методы являются абстрактными (называемыми в C ++ чисто виртуальными), то этот класс в значительной степени представляет собой интерфейс, хотя и тот, который, возможно, также определил некоторое состояние (поля). Настоящий Интерфейс не должен иметь состояния (поскольку он определяет только , что возможно, а не как это происходит.
Только более старые языки ООП склонны полагаться исключительно на один или другой.
VB6 имеет только интерфейсы и не имеет наследования реализации.
Simula позволяет вам объявлять чисто виртуальные классы, но вы можете создавать их экземпляры (с использованием ошибок времени выполнения)
или «Кто такой папа?»
Этот вопрос вызывает серьезные споры, тем более что он является ключевым отличием между реализацией ООП в C ++ и многими современными статически типизированными языками, которые воспринимаются как возможные преемники, такие как c # и java.
или «что вы хотите со мной сделать?»
Зачастую это не все или ничего, это просто значение по умолчанию (наиболее часто используемые языки ООП по умолчанию изменяются по умолчанию). Это может оказать большое влияние на структуру языка. Многие в основном функциональные языки, включающие функции ООП, по умолчанию устанавливают неизменное состояние объектов.
или «Является ли все объектом?»
Это довольно сложно, так как такие приемы, как автобокс примитивов, создают впечатление, что все есть, но вы обнаружите, что существует несколько граничных случаев, где эта «магия компилятора» обнаружен, и пресловутый волшебник Оз находится за занавесом, в результате чего возникают проблемы или ошибки. В языках с неизменяемостью по умолчанию это менее вероятно, поскольку ключевой аспект объектов (то, что они содержат оба метода и состояние ) означает, что вещи, которые похожи на объекты, но не совсем, имеют меньше возможностей для осложнения.
или «Кем вы себя считаете?»
Гораздо более распространенный аспект языкового дизайна, и здесь не один, но присущий выбор на это решение влияют многие аспекты ООП, как упоминалось ранее.
Только аспекты полиморфного позднего связывания могут зависеть от:
Чем динамичнее язык, тем более сложными становятся эти решения, но наоборот тем больше вводит пользователь языка, а не разработчик языка в решении. Давать примеры здесь было бы несколько глупо, поскольку статически типизированные языки могут быть модифицированы для включения динамических аспектов (например, c # 4.0).
Мне сегодня посчастливилось поговорить с консультантом по этому вопросу, - он смог помочь мне во всем разобраться.
Итак, моя проблема в том, что Spring MVC создавал два разных контекста , один контекст приложения, определенный в applicationContext.xml, и один веб-контекст, определенный в dispatcher-servlet.xml.
Beans из одного контекст не может взаимодействовать с beans в другом контексте, поэтому, когда я инициализировал свой контекст постоянства внутри applicationContext.xml, я не мог получить к нему доступ в beans, загруженном с помощью dispatcher-servlet.xml, то есть моих контроллеров.
Когда Netbeans автоматически сгенерировал база для моего Spring MVC, он настроил это по умолчанию. В некоторых крупных веб-приложениях имеет смысл отделить веб-часть приложения в контексте, отличном от остальной логики (постоянство, бизнес-код и т. Д.). В моем случае, когда я пытаюсь автоматически внедрить свой диспетчер сущностей непосредственно в свои контроллеры, это сработало против меня.
Чтобы устранить проблему, я переместил строку
<import resource="classpath:META-INF/persistence-context.xml"/>
из applicationContext.xml в свой dispatcher-servlet.xml. Затем в мои контроллеры были правильно введены EntityManager из аннотации @PersistanceContext.
Я думаю, вам нужен файл persistence.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="GenericPU">
<class>com.domain.MyClass</class>
</persistence-unit>
</persistence>
Я думаю, что он не будет работать, если у файла будет другое имя, особенно потому, что у вас его нет сообщить фабрике EntityManager новое имя где угодно.
Раньше я работал со старой версией Spring, когда вам нужно было поместить setProperty () в bean-компонент и установить тег свойства внутри определения Spring-Bean, например:
<bean id="Generic" class="com.application.web.GenericController" />
<property name="em" ref="entityManager" />
</bean>
Возможно, вам стоит работать с компонентами transactionManager или entityManagerFactory ...
PD: Лично я предпочитаю старый способ внедрения зависимостей.