Определенная цель
Позвольте мне кратко описать проблему, которую эта статья хочет решить: как больше не использовать Spring для создания экземпляров бобов весной, но передавайте процесс создания бобов для разработчиков.
Ясное мышление
Как создать экземпляр боба:
1) Через конструктор (с или без параметров)
Метод: <bean id=""/>
2) с помощью метода статического завода
Метод: <bean id="" factory-method="静态工厂方法"/>
Примечание: экземпляр класса фабрики не создан
3) Через фабричный метод экземпляра (нестатический метод)
Способ:
<bean id="factory"/>
<bean id="" factory-bean="factory" factory-method="实例工厂方法"/>
Примечание: создан экземпляр класса заводского класса
Практический метод
Пример 1 :
нуждаться:
1 Я не хочу создавать экземпляр бобов, когда загружается bean.xml, но я хочу отделить загруженный Bean.xml от создания объекта.
2 Внедрить синглтонский бон
В вышеупомянутых ситуациях бобы могут быть созданы через заводской метод.
Таким образом, когда Bean.xml загружается, бобы не будут создаваться напрямую, но начнут быть по-настоящему создаваться только тогда, когда называется метод, на который называется фабрика-метод.
Реализация: Создайте Singleton Bean через Spring Factory-Method
Сначала создать объект Singleton через статический внутренний класс
пакет com.spring.test.factorymethod; public class stage {public void erform () {System.out.println ("Show Start ..."); } private Stage () {} частный статический класс Staysingletonholder {static stage ancess = new Stage (); } public static stage getInstance () {return stadesingletonholder.instance; }}Укажите метод загрузки в файле конфигурации пружины GetInstance
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://www.spramework.orgg/schema" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id = "thestour" factory-method = "getInstance"> </beans> </beans> </beans> </beans> </beans> </beans> </bean
Получить экземпляр, вызывая бобы в контексте приложения
пакет com.spring.test.factorymethod; import org.springframework.context.applicationContext; import org.springframework.context.support.classpathxmlapplicationContext; Стадия stage = ((Stage) ctx.getbean ("Theestage")); //. GetInstance (); stare.perform (); }}Результаты исполнения
24 января 2015 г., 18:38:18 org.springframework.context.support.abstractapplicationcontext Подготовка информации: обновления org.springframework.context.support.classpathxmlapplicationcontext@512dbd1a: дата начала [SAT SAP 24:38:38:18:18 CST 2015]; Корень контекста иерархийский д. org.springframework.beans.factory.support.default-letristablebeanfactory preinstantiatesingletons Информация: предварительные инстанции одиноких в org.springframework.beans.factory.support.defaultistablebeanfactory@2d1879e. Корень фабрики иерархия начинается ...
Введение в фабричный метод создание бобов
1. Создайте боб, используя метод статического завода
При создании экземпляра боба с использованием метода статического завода также должен быть указан атрибут класса, но в настоящее время атрибут класса - это не класс реализации, который определяет экземпляр Bean, а класс статического завода. Потому что весна нужно знать, какую фабрику использовать для создания экземпляра бобов. Кроме того, вам необходимо использовать заводской метод, чтобы указать имя метода статического завода. Spring вызовет метод статического завода (может содержать набор параметров), чтобы вернуть экземпляр боба. После получения указанного экземпляра боба шаги обработки после пружины точно такие же, как создание экземпляра бобов с использованием обычных методов. Следует отметить, что при использовании статических фабричных методов для создания бобов этот фабричный метод должен быть статичным. Этот отрывок звучит немного головокружительно, не сказав, пожалуйста, добавьте код:
Сначала определите интерфейс, и статический метод создаст экземпляр интерфейса:
Public Interface Animal {public void sayshello ();}Вот два класса реализации интерфейса:
Общедоступный класс Cat реализует Animal {Private String MSG; // метод сеттера, необходимый во время инъекции зависимости public void setMsg (String msg) {this.msg = msg; } @Override public void sayshello () {System.out.println (msg + ", meow ~ meow ~"); }} Общедоступный класс Dog реализует Animal {Private String MSG; // метод сеттера, необходимый во время инъекции зависимости public void setMsg (String msg) {this.msg = msg; } @Override public void sayshello () {System.out.println (msg + ", strong ~ ~ ~"); }}На заводе Animalfactory ниже содержится статический метод GetAnimal, который определит, какой объект создает на основе пропущенных параметров. Это типичный статический заводской дизайн.
public clas Animalfactory {public Static Animal GetAnimal (String Type) {if ("cat" .EqualsIgnoreCase (type)) {return new Cat (); } else {return new Dog (); }}}Если вам нужно указать, что Spring использует AnimalFactory для генерации объектов животных, вы можете настроить следующее в файле конфигурации пружины:
<!-- Configure the getAnimalFactory's getAnimal method to generate Cat --><bean id="cat" factory-method="getAnimal"> <!-- Configure the parameters of the static factory method, the getAnimal method will generate Cat-type objects --> <constructor-arg value="cat" /> <!-- Normal properties injected through setter--> <property name="msg" value = "cat" /> < /bean> <!-Настройте метод GetAnimalFactory GetAnimal для генерации собаки-> <Bean Id = "Dog" Factory-method = "GetAnimal"> <!-Настройка параметров статического метода заводской фабрики. Setter-> <name = name = "msg" value = "dog" /> < /bean>
Из приведенной выше конфигурации мы видим, что класс и фабричный метод двух конфигураций бобов кошки и собаки точно одинаковы, потому что оба экземпляра генерируются с использованием одного и того же статического фабричного класса и одного и того же статического фабричного метода. Просто параметры, указанные для этого статического заводского метода, различны, используйте элемент <constructor-arg /> для указания параметров для статического фабричного метода.
Метод основной программы для получения двух экземпляров бобов Кошка и собака остается неизменным. Вам нужно только позвонить в GetBean () из пружинного контейнера:
открытый тест класса {public static void main (string args []) {ApplicationContext context = new ClassPathxMlApplicationContext ("ApplicationContext.xml"); Животное A1 = контекст.getbean ("cat", Animal.class); a1.sayhello (); Животное A2 = context.getbean ("Dog", Animal.class); a2.sayhello (); }}Результат вывода:
<code> cat, meow ~ meow ~ dog, strong ~ all ~ </code>
При создании экземпляра с использованием статического фабричного метода вы должны предоставить заводский класс и метод статического завода, который генерирует экземпляр. При создании экземпляра с помощью статического фабричного метода вам необходимо внести следующие изменения в файл конфигурации пружины;
Атрибут класса - это не класс реализации экземпляра Bean, а статический фабричный класс, который генерирует экземпляр боба
Используйте фабрику-метод, чтобы указать статический фабричный метод для производства экземпляра боба
Если метод статического завода требует параметров, используйте элемент <constructor-arg /> для его настройки
Когда мы указываем, что Spring использует статический фабричный метод для создания экземпляра бобов, Spring сначала проанализирует файл конфигурации и вызовет статический метод фабрики статического класса фабрики посредством отражения на основе информации, указанной файлом конфигурации, и используйте возвращаемое значение статического метода фабрики в качестве экземпляра Bean. В этом процессе Spring больше не несет ответственности за создание экземпляра бобов, а экземпляр Bean предоставляется методом статического завода, предоставленного пользователем.
2. Создайте боб, используя метод завода экземпляра
Метод завода экземпляра немного отличается от метода статического завода: вызов статического фабричного метода требует только использования заводского класса, и вызов метода завода экземпляра должен использовать заводский экземпляр. Следовательно, существует только одно отличие в конфигурации пружины: настроить метод статического завода, чтобы указать статический фабричный класс и настройка метода завода экземпляра для указания экземпляра завода. Тот же пример выше изменяет AnimalFactory на:
public clas Animalfactory {public Animal GetAnimal (String Type) {// Здесь статическое ключевое слово удаляется только if ("cat" .equalsignorecase (type)) {return new cat (); } else {return new Dog (); }}}Файл Spring изменен на:
<!-Сначала настройте фабричный класс-> <bean id = "Animalfactory" /> <!-Здесь мы используем заводские бобы для указания объекта заводского класса экземпляра-> <bean id = "cat" factory-bean = "Animalfactory" Factory-method = "getAnimal"> <!-Также указывает параметры Factory-method-> <constructor-ar value = "cate" /" /" /"" /" /" " /" /"" /" /" " /" " /" /"" /" /" " /" /" /" " /" /"" /"" /" /" /"" /"" /"" /"" /"" /"" /"" /" /" " /" /"" /" /" " /" /"" /" /" ". value = "cat" /> < /bean> <bean id = "dog" factory-bean = "AnveryFactory" factory-method = "getAnimal"> <constructor-arg value = "dog" /> <name = "msg" value = "dog" /> < /bean>
Тестовый класс не должен быть изменен, результаты выходных данных такие же, как и выше.
Во многих случаях <bean id = "bean1" class = "..." /> используется для определения боба. Таким образом, Spring вызовет конструктор без параметра по умолчанию для создания экземпляра боба. Кроме того, вы также можете использовать завод для создания экземпляров бобов для разделения создания и использования бобов, а также передать работу по созданию фабрики на завод.
Есть три способа настройки заводских бобов.
Аннотация интерфейс:
публичный интерфейс imusicbox {public void play (); } 1. Получить примеры бобов для статического фабричного метода
Категория фабрики:
public class musicboxfactory {public static imusicbox createmusicbox () {return new imusicbox () {public void play () {System.out.println ("Play Piano ..."); }}; }}Файл конфигурации:
<bean id = "musicbox" factory-method = "createmusicbox" />
Тестовый класс:
public static void main (String [] args) {ApplicationContext ctx = new classpathxmlapplicationContext ("bean-config.xml"); Imusicbox musicbox = (imusicbox) ctx.getbean ("Musicbox"); musicbox.play (); }2. Метод заводского экземпляра получает экземпляр боба
Категория фабрики:
public class musicboxfactory {public imusicbox createmusicbox () {// Нет статической модификации возвращать новый imusicbox () {public void play () {System.out.println ("Play Piano ..."); }}; }}Файл конфигурации:
<Bean Id = "Factorybean" /> <Bean Id = "Musicbox" Factory-bean = "Factorybean" Factory-method = "createMusicbox" />
Атрибут «Заводские бобы» указывает фабрику, а атрибут «фабрика-метод» указывает метод завода для получения экземпляра бобов.
Тестовый класс:
public static void main (String [] args) {ApplicationContext ctx = new classpathxmlapplicationContext ("bean-config.xml"); Imusicbox musicbox = (imusicbox) ctx.getbean ("Musicbox"); musicbox.play (); } 3. Заводской класс реализует org.springframework.beans.factory.facotrybean interface
Категория фабрики:
Импорт org.springframework.beans.factory.factorybean; Public Class MusicBoxFactory2 реализует FactoryBean {public Object getObject () Throws Exception {return new iMusicbox () {public void play () {System.out.println ("Play Piano ..."); }}; } public Class getObjectType () {return imusicbox.class; } public boolean issingleton () {return false; }}Файл конфигурации:
<bean id = "musicbox"/>
Тестовый класс:
public static void main (String [] args) {ApplicationContext ctx = new classpathxmlapplicationContext ("bean-config.xml"); // не добавляется и возвращает «продукт» заводского Imusicbox Musicbox = (imusicbox) ctx.getbean ("Musicbox"); musicbox.play (); // Добавить и возвращать объект экземпляра класса заводского класса obj = ctx.getbean ("& musicbox"); System.out.println (obj.getClass (). GetName ()); }Классы, которые реализуют интерфейс Factorybean, не будут рассматриваться как обычные бобы, Spring автоматически обнаружит их и вызовет метод GetObject, чтобы получить экземпляр боба.
Суммировать
Это конец введения к созданию экземпляров бобов в Spring Factory Methods. Если у вас есть какие -либо недостатки, вы можете оставить сообщение, чтобы указать. Спасибо, друзья, за вашу поддержку на этом сайте!