Интервьюер: Какие шаблоны проектирования используются в Spring?

Java Spring
作者:螃蟹来源: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

- ЕЩЕ | Другие интересные статьи -

Если вам нравится эта статья.

Пожалуйста, нажмите и удерживайте QR-код, чтобы подписаться на Холлис

Переадресация круга друзей - самая большая поддержка для меня.