作者:螃蟹来源:itxxz.com/a/javashili/tuozhan/2014/0601/7.html
скопировать код
В качестве настольной книги в работе и учебе шаблоны проектирования часто оказываются в затруднительном положении, когда они не используются часто, Дело не в том, что мы часто забываем, а в том, что у нас нет памяти. Как классическая инфраструктура в отрасли, Spring является моделью в отрасли как с точки зрения проектирования архитектуры, так и с точки зрения написания кода.
Что ж, без лишних слов, давайте приступим к сегодняшнему содержанию. Весной обычно используются девять шаблонов дизайна, и мы приводим примеры.
В будущем я больше не буду бояться, что интервьюер спросит меня: какие шаблоны проектирования используются в Spring.
1Простой заводской шаблон
Также известен как шаблон метода статической фабрики (метод StaticFactory), но не является одним из 23 шаблонов проектирования GOF.
Суть простого фабричного шаблона заключается в том, что фабричный класс динамически решает, какой класс продукта следует создать в соответствии с входящими параметрами.
BeanFactory in spring — это воплощение простого фабричного шаблона.Объект bean-компонента получается путем передачи уникального идентификатора, но создавать ли его после передачи параметров или до передачи параметров, зависит от конкретной ситуации. Следующая конфигурация предназначена для создания itxxzBean в классе HelloItxxz.
<beans> <bean id="singletonBean" class="com.itxxz.HelloItxxz"> <constructor-arg> <value>Hello! 这是singletonBean</value> </constructor-arg> </ bean> <bean id="itxxzBean" class="com.itxxz.HelloItxxz" singleton="false"> <constructor-arg> <value>Hello! 这是itxxzBean! </value> </constructor-arg> </bean></beans>
скопировать код
2
Шаблон фабричного метода
Обычно прикладная программа напрямую использует new для создания нового объекта.Чтобы разделить создание и использование объекта, принимается фабричный шаблон, то есть прикладная программа передает создание и инициализацию объекта фабричному объекту. .
В общем, приложение имеет свой собственный фабричный объект для создания бинов.Если собственный фабричный объект приложения передан в управление Spring, то Spring управляет не обычными бинами, а фабричными бинами.
Возьмите статический метод в фабричном методе в качестве примера, чтобы объяснить:
import java.util.Random;public class StaticFactoryBean { public static Integer createRandom() { return new Integer(new Random().nextInt()); }}
скопировать код
Создайте файл конфигурации config.xm и включите его в контейнер Spring для управления.Вам необходимо указать имя статического метода через factory-method:
<bean id="random"class="example.chapter3.StaticFactoryBean" factory-method="createRandom" scope="prototype"/>
скопировать код
контрольная работа:
public static void main(String[] args) {//调用getBean()时,返回随机数.如果没有指定factory-method,会返回StaticFactoryBean的实例,即返回工厂Bean的实例 XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml")); System.out.println("我是IT学习者创建的实例:"+factory.getBean("random").toString());}
скопировать код
3
одноэлементный шаблон
Гарантирует наличие только одного экземпляра класса и предоставляет к нему глобальную точку доступа. Шаблон singleton в spring завершает вторую половину предложения, которое предоставляет глобальную точку доступа BeanFactory. Но на уровне конструктора нет одноэлементного управления, потому что Spring управляет произвольными объектами Java.
Основной совет: bean-компоненты по умолчанию в Spring — это синглтоны, которые можно указать с помощью singleton="true|false" или scope="?".
4режим адаптера
В Spring Aop Advice используется для улучшения функциональности прокси-класса. Принцип реализации этой АОП-функции в Spring заключается в использовании режима прокси (1. динамический прокси-сервер JDK. 2. прокси-сервер технологии генерации байт-кода CGLib.) для улучшения аспекта класса на уровне метода, то есть для создания прокси-сервера. класс прокси-класса, и Перед методом прокси-класса устанавливается перехватчик, и функция прокси-метода расширяется за счет выполнения содержимого перехватчика, и реализуется аспектно-ориентированное программирование.
Интерфейс класса адаптера: Цель
public interface AdvisorAdapter {boolean supportsAdvice(Advice advice); MethodInterceptor getInterceptor(Advisor advisor);} MethodBeforeAdviceAdapter类,Adapterclass MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable { public boolean supportsAdvice(Advice advice) { return (advice instanceof MethodBeforeAdvice); } public MethodInterceptor getInterceptor(Advisor advisor) { MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice(); return new MethodBeforeAdviceInterceptor(advice); }}
скопировать код
5
шаблон обертки
Мы столкнулись с такой проблемой в нашем проекте: наш проект должен подключаться к нескольким базам данных, и разные клиенты будут обращаться к разным базам данных в соответствии со своими потребностями при каждом посещении. Раньше мы настраивали источник данных в фреймворках spring и hibernate, поэтому свойство dataSource объекта sessionFactory всегда указывает на этот источник данных и является постоянным, и все DAO обращаются к базе данных через этот источник данных при использовании sessionFactory.
Но теперь, в связи с потребностями проекта, нашему DAO приходится постоянно переключаться между несколькими источниками данных при доступе к sessionFactory, и возникает проблема: как сделать так, чтобы sessionFactory могла динамически переключаться в соответствии с потребностями клиентов при сохранении данных. источники данных? Можем ли мы решить это с небольшой модификацией в рамках Spring? Существуют ли какие-либо шаблоны проектирования, которые можно использовать?
Первая мысль — настроить все источники данных в Spring applicationContext. Эти источники данных могут быть разных типов, например разные базы данных: Oracle, SQL Server, MySQL и т. д., или разные источники данных: например, org.apache.commons.dbcp.BasicDataSource, предоставляемый apache, org.springframework.jndi.JndiObjectFactoryBean. и Т. Д. Затем sessionFactory устанавливает для свойства dataSource другой источник данных в соответствии с каждым запросом клиента, чтобы достичь цели переключения источника данных.
Шаблон оболочки, используемый в Spring, имеет два проявления в имени класса: во-первых, имя класса содержит Wrapper, а во-вторых, имя класса содержит Decorator. По сути, все дело в динамическом добавлении дополнительных обязанностей к объекту.
6прокси-режим
Предоставляет прокси для других объектов для управления доступом к этому объекту. Структурно он похож на паттерн Decorator, но Proxy — это элемент управления, больше похожий на ограничение функций, а Decorator — на усиление обязанностей. Режим прокси Spring отражается в aop, например JdkDynamicAopProxy и Cglib2AopProxy.
7Шаблон наблюдателя
Определяет зависимость между объектами "один ко многим". При изменении состояния объекта все зависящие от него объекты получают уведомление и автоматически обновляются. Наиболее часто используемое место в шаблоне Observer весной — это реализация слушателя. Например, ApplicationListener.
8режим стратегии
Определите серию алгоритмов, инкапсулируйте их один за другим и сделайте их взаимозаменяемыми. Этот шаблон позволяет алгоритму изменяться независимо от клиента, использующего его. Шаблон Strategy используется при создании экземпляров объектов в spring.SimpleInstantiationStrategy имеет следующий код, иллюстрирующий использование шаблона стратегии:
9Шаблон метода шаблона
Определить скелет алгоритма в операции, отложив некоторые шаги на подклассы. Шаблонный метод позволяет подклассам переопределять определенные шаги алгоритма без изменения его структуры.
Режим шаблонного метода обычно необходимо наследовать. Здесь я хочу исследовать другое понимание шаблонного метода. JdbcTemplate in spring не хочет наследовать этот класс при использовании этого класса, потому что в этом классе слишком много методов, но мы по-прежнему хотим использовать существующее стабильное и общедоступное подключение к базе данных JdbcTemplate, так что же нам делать? Мы можем извлечь измененные вещи в качестве параметра и передать их в метод JdbcTemplate. Но измененная вещь — это часть кода, и этот код будет использовать переменные в JdbcTemplate. что делать? Затем воспользуемся объектом обратного вызова.
В этом объекте обратного вызова определите метод для управления переменными в JdbcTemplate. Мы реализуем этот метод и концентрируем здесь изменения. Затем мы передаем этот объект обратного вызова в JdbcTemplate для завершения вызова. Это может быть еще одна реализация шаблонного метода, не требующая наследования.
Ниже приведен конкретный пример: выполнить метод в JdbcTemplate
JdbcTemplate выполняет метод выполнения
Серия статей о том, как стать Java-инженеромВ обновлении GitHub добро пожаловать в подписку, добро пожаловать в звезду.
Столкнувшись с проблемой Java 206: что такое регулярные выражения
Road to God Issue 015: Углубленное изучение IO в Java
Углубленная проблема параллелизма 006: правильное использование пулов потоков Java
- ЕЩЕ | Другие интересные статьи -
-
Весенний набор 2019 вот-вот начнется, все, что вам нужно, здесь!
-
Netty в действии: как написать веб-контейнер со всем необходимым
-
Что такое ДНС? Что такое загрязнение DNS? Что такое перехват DNS снова?
Если вам нравится эта статья.
Пожалуйста, нажмите и удерживайте QR-код, чтобы подписаться на Холлис
Переадресация круга друзей - самая большая поддержка для меня.