1. Расскажите о своем понимании Spring IOC и DI, в чем разница между ними?
Инверсия управления IoC Концепция инверсии управления заключается в передаче управления объектом UserService, который изначально был создан вручную в программе, в среду Spring.
DI: внедрение зависимостей Внедрение зависимостей, когда среда Spring отвечает за создание объекта Bean, динамически внедряет зависимый объект в компонент Bean.
Вопрос из интервью: в чем разница между IoC и DI?
Инверсия управления IoC относится к инверсии прав на создание объекта в контейнере Spring, внедрение зависимостей DI относится к процессу создания объекта Spring, свойства зависимости объекта вводятся через конфигурацию
2. В чем разница между интерфейсом BeanFactory и интерфейсом ApplicationContext?
①Интерфейс ApplicationContext наследует интерфейс BeanFactory. Основной фабрикой Spring является BeanFactory. BeanFactory использует ленивую загрузку. Bean будет инициализирован при первом получении Bean. ApplicationContext инициализирует Bean при загрузке файла конфигурации. ②ApplicationContext — это расширение BeanFactory, которое может выполнять обработку интернационализации, доставку событий и автоматическую сборку bean-компонентов, а также контекстную реализацию различных прикладных уровней.ApplicationContext в основном используется при разработке, веб-проекты используют WebApplicationContext, а BeanFactory используется редко.
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
IHelloService helloService = (IHelloService) beanFactory.getBean("helloService");
helloService.sayHello();
3. Каковы способы создания экземпляра bean-компонента конфигурации Spring?
1) Используйте конструктор класса для создания экземпляра (по умолчанию без параметров)
<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>
2) Создание экземпляра с использованием статического фабричного метода (простой фабричный шаблон)
//下面这段配置的含义:调用Bean2Factory的getBean2方法得到bean2
<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2"></bean>
3) Создание экземпляра с использованием фабричного метода экземпляра (шаблон фабричного метода)
//Сначала создайте экземпляр фабрики bean3Factory, а затем создайте экземпляр целевого компонента через экземпляр фабрики
<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
4. Кратко расскажите о жизненном цикле весны?
1) В конфигурационном элементе
<beanid="lifeCycleBean"class="cn.itcast.spring.d_lifecycle.LifeCycleBean"init-method="setup"destroy-method="teardown"></bean>
Вопросы, о которых следует знать:
* Метод destroy действителен только для scope="singleton"
* Метод уничтожения, объект ApplicationContext должен быть закрыт (вызван вручную), прежде чем он будет вызван
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
applicationContext.close();
2) Полный жизненный цикл Bean (11 шагов) [понять содержание, но это поможет понять внутреннюю работу Spring]
① создание экземпляра объекта bean-компонента
② заполнить свойства пакета свойств
③ Если Бин реализует BeanNameAware, выполните setBeanName
④ Если Бин реализует BeanFactoryAware или ApplicationContextAware, установите фабрику setBeanFactory или объект контекста setApplicationContext.
⑤ Если имеется класс, который реализует BeanPostProcessor (Бин постобработки), выполните postProcessBeforeInitialization, а интерфейс BeanPostProcessor предоставляет функции-ловушки для динамического расширения и изменения Бин. (Программа автоматически вызывает Bean постобработки)
publicclassMyBeanPostProcessorimplementsBeanPostProcessor{
publicObject postProcessAfterInitialization(Object bean,String beanName)
throwsBeansException{
System.out.println("第八步:后处理Bean,after初始化。");
//后处理Bean,在这里加上一个动态代理,就把这个Bean给修改了。
return bean;//返回bean,表示没有修改,如果使用动态代理,返回代理对象,那么就修改了。
}
publicObject postProcessBeforeInitialization(Object bean,String beanName)
throwsBeansException{
System.out.println("第五步:后处理Bean的:before初始化!!");
//后处理Bean,在这里加上一个动态代理,就把这个Bean给修改了。
return bean;//返回bean本身,表示没有修改。
}
}
Примечание. Этот bean-компонент предварительной обработки и bean-компонент постобработки будут перехватывать все bean-компоненты. ⑥ Если Бин реализует InitializingBean, выполните afterPropertiesSet
⑦Вызовите
⑧ Если есть класс, реализующий BeanPostProcessor (обрабатывающий Bean), выполнить postProcessAfterInitialization.
⑨ Выполнение бизнес-обработки
⑩ Если Бин реализует DisposableBean, выполнить destroy
⑪Вызовите
5. Расскажите, пожалуйста, о жизненном цикле и области действия bean-компонентов в среде Spring.
(1) определение компонента
Используйте
(2) инициализация бина
Есть два способа инициализации:
A. Это делается путем указания атрибута init-method в конфигурационном файле
B. Реализуйте интерфейс org.springframwork.beans.factory.InitializingBean.
(3) вызов фасоли
Есть три способа получить экземпляр компонента и вызвать его.
(4) уничтожение фасоли
Есть два способа уничтожить
A. Используйте свойство destroy-method, указанное в файле конфигурации.
B. Реализуйте интерфейс org.springframwork.bean.factory.DisposeableBean.
##Сфера
singleton
Когда областью действия bean-компонента является singleton, в контейнере Spring IoC имеется только один общий экземпляр bean-компонента, и все запросы к bean-компоненту, пока идентификатор соответствует определению bean-компонента, будут возвращать только один и тот же экземпляр bean-компонента.
prototype
Bean-компонент с областью действия прототипа вызывает создание нового экземпляра bean-компонента каждый раз, когда запрашивается bean-компонент (либо путем внедрения его в другой bean-компонент, либо путем программного вызова метода getBean() контейнера). Как правило, вы должны использовать область прототипа для всех bean-компонентов с состоянием и область singleton для bean-компонентов без сохранения состояния.
request
В HTTP-запросе определение bean-компонента соответствует экземпляру, то есть каждый HTTP-запрос будет иметь собственный экземпляр bean-компонента, который создается в соответствии с определением bean-компонента. Эта область действительна только в контексте веб-приложения Spring ApplicationContext.
session
В сеансе HTTP определение компонента соответствует экземпляру. Эта область действительна только в контексте веб-приложения Spring ApplicationContext.
global session
В глобальном сеансе HTTP определение компонента соответствует экземпляру. Обычно это работает только при использовании контекста портлета. Эта область действительна только в контексте веб-приложения Spring ApplicationContext.
6. Каковы способы инъекций Bean?
Spring поддерживает внедрение конструктора и внедрение метода установки Внедрение конструктора, завершение внедрения через элемент7. Что такое АОП и какова роль АОП?
Аспектно-ориентированное программирование (АОП) предлагает другой способ осмысления структуры программы и, таким образом, компенсирует недостатки объектно-ориентированного программирования (ООП).Помимо классов, АОП предоставляет аспекты. Аспекты объединяют проблемы, такие как управление транзакциями для нескольких типов и объектов.
Ключевым компонентом Spring является среда АОП, которая позволяет вам выбирать, использовать ли АОП для предоставления декларативных корпоративных служб, особенно для замены декларативных служб EJB. Наиболее важным сервисом является декларативное управление транзакциями, основанное на абстрактном управлении транзакциями Spring. Позволяет пользователям реализовывать пользовательские аспекты и использовать АОП для улучшения использования ООП. Spring AOP можно рассматривать как усовершенствование Spring.
8. Каковы основные классы Spring и каковы функции каждого из них?
BeanFactory: создайте новый экземпляр, который может реализовать шаблон singleton.
BeanWrapper: предоставляет унифицированные методы получения и установки.
ApplicationContext: обеспечивает реализацию фреймворка, включая все функции BeanFactory.
9. Как настроить драйвер базы данных в Spring?
Используйте источник данных "org.springframework.jdbc.datasource.DriverManagerDataSource" для настройки драйвера базы данных. Пример выглядит следующим образом:<bean id=”dataSource”>
<property name=”driverClassName”>
- <value>org.hsqldb.jdbcDriver</value>
- </property>
<property name=”url”>
<value>jdbc:hsqldb:db/appfuse</value>
</property>
<property name=”username”><value>abc</value></property>
<property name=”password”><value>abc</value></property>
</bean>
10. Можно ли изменить имя файла applicationContext.xml в Spring на другое имя?
ContextLoaderListener — это ServletContextListener, который инициализируется при запуске вашего веб-приложения. По умолчанию он ищет конфигурацию Spring в файле WEB-INF/applicationContext.xml. Вы можете изменить расположение файла конфигурации Spring, определив элемент
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/xyz.xml</param-value>
</context-param>
</listener-class>
</listener>
11. Как определить отображение спящего режима в Spring?
Добавьте файл отображения гибернации в файл applicationContext.xml в каталоге web/WEB-INF. Пример выглядит следующим образом:
<property name=”mappingResources”>
<list>
<value>org/appfuse/model/User.hbm.xml</value>
</list>
</property>
12. Как Spring обрабатывает параллелизм потоков?
Spring использует ThreadLocal для решения проблем безопасности потоков.
Мы знаем, что в многопоточной среде можно совместно использовать только bean-компоненты без сохранения состояния, а в Spring большинство bean-компонентов можно объявить как singleton scope. Это связано с тем, что Spring использует ThreadLocal для обработки не потокобезопасных состояний в некоторых bean-компонентах (таких как RequestContextHolder, TransactionSynchronizationManager, LocaleContextHolder и т. д.), что делает их потокобезопасными, поскольку bean-компоненты с состоянием могут совместно использоваться несколькими потоками.
И ThreadLocal, и механизмы синхронизации потоков предназначены для решения проблемы конфликта доступа к одной и той же переменной в нескольких потоках.
В механизме синхронизации механизм блокировки объекта гарантирует, что только один поток одновременно обращается к переменной. В настоящее время переменная совместно используется несколькими потоками.Использование механизма синхронизации требует, чтобы программа тщательно анализировала, когда следует читать и записывать переменную, когда блокировать объект и когда снимать блокировку объекта и другие сложные вопросы. и писать относительно сложно.
ThreadLocal решает одновременный доступ нескольких потоков с другой точки зрения. ThreadLocal предоставит каждому потоку независимую копию переменной, тем самым изолируя конфликт доступа нескольких потоков к данным. Поскольку у каждого потока есть собственная копия переменной, нет необходимости синхронизировать переменную. ThreadLocal предоставляет потокобезопасные общие объекты.При написании многопоточного кода небезопасные переменные могут быть инкапсулированы в ThreadLocal.
Поскольку объект любого типа может храниться в ThreadLocal, функция get(), предоставляемая более ранней версией JDK, возвращает объект Object, для которого требуется преобразование типа. Но JDK5.0 хорошо решает эту проблему за счет дженериков, что в определенной степени упрощает использование ThreadLocal.
Подводя итог, для проблемы многопоточного совместного использования ресурсов механизм синхронизации принимает метод «обмена времени на пространство», а ThreadLocal использует метод «обмена пространства на время». Первый предоставляет переменную только для разных потоков, ставящихся в очередь на доступ, а второй предоставляет переменную для каждого потока, поэтому к ним можно обращаться одновременно, не влияя друг на друга.
13. Почему вещи распространяют поведение?
14. Представьте управление транзакциями Spring
Транзакция — это унифицированная операция фиксации или отката для серии операций с базой данных (например, вставка нескольких фрагментов данных). Если вставка прошла успешно, она будет выполнена вместе. Если в середине есть исключение, все предыдущие операции будут отменены. откат. Это предотвращает грязные данные и предотвращает проблемы с данными базы данных.
Чтобы избежать этой ситуации в разработке, обычно выполняется управление транзакциями. Spring также имеет свой собственный механизм управления транзакциями, которым обычно управляет TransactionMananger, что может быть реализовано с помощью внедрения Spring. Spring предоставляет несколько классов для обработки транзакций:
TransactionDefinition //Определение атрибута транзакции
TranscationStatus //Представляет текущую транзакцию, которую можно зафиксировать и откатить.
PlatformTransactionManager — это базовый интерфейс, предоставляемый Spring для управления транзакциями.Существует абстрактный класс, реализующий AbstractPlatformTransactionManager.Используемые нами классы управления транзакциями, такие как DataSourceTransactionManager, являются подклассами этого класса.
Общие шаги определения транзакции:
TransactionDefinition td =newTransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
-
try
{ - //do sth
transactionManager.commit(ts);
-
}
catch(Exception e){ - transactionManager.rollback( ts);
- }
Программно в основном используется transactionTemplate. Некоторые фиксации, откаты и ряд определений объектов транзакций опущены, а объекты управления транзакциями необходимо внедрить.
void add(){
transactionTemplate.execute(newTransactionCallback(){
- pulic Object doInTransaction( TransactionStatus ts){
- //do sth
- }
}
}
Использование TransactionProxyFactoryBean: PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED, только для чтения
Динамические прокси вокруг Poxy могут автоматически фиксировать и откатывать транзакции.
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
PROPAGATION_REQUIRED — поддерживает текущую транзакцию, если текущей транзакции нет, создать новую транзакцию. Это самый распространенный выбор.
PROPAGATION_SUPPORTS — поддерживать текущую транзакцию, если текущей транзакции нет, выполнять в нетранзакционном режиме.
PROPAGATION_MANDATORY — поддерживает текущую транзакцию, выдает исключение, если текущей транзакции нет.
PROPAGATION_REQUIRES_NEW — создать новую транзакцию, если есть текущая транзакция, приостановить текущую транзакцию.
PROPAGATION_NOT_SUPPORTED — выполняет операцию без транзакций, приостанавливая текущую транзакцию, если она есть.
PROPAGATION_NEVER — выполнять нетранзакционно, выдавать исключение, если в данный момент есть транзакция.
PROPAGATION_NESTED — если транзакция в настоящее время существует, выполняется во вложенной транзакции. Если текущих транзакций нет, сделайте что-то похожее на PROPAGATION_REQUIRED.
15. Объясните некоторые термины в Spring AOP
Аспект: модульность проблем, которые могут пересекаться с несколькими объектами. Управление транзакциями — хороший пример сквозных задач в приложениях J2EE. В Spring AOP аспекты могут быть реализованы с использованием универсальных классов (стиль на основе схемы) или в обычных классах с аннотациями @Aspect (@стильAspectJ).
Точка присоединения: определенная точка во время выполнения программы, например, когда вызывается метод или когда обрабатывается исключение. В Spring AOP точка соединения всегда представляет выполнение метода. Объявив параметр типа org.aspectj.lang.JoinPoint, основная часть совета (Advice) может получить информацию о точке соединения.
Совет: действие, выполняемое в определенной точке соединения аспекта. Существуют различные типы уведомлений, в том числе «вокруг», «до» и «после». Типы уведомлений обсуждаются в следующем разделе. Многие фреймворки АОП, включая Spring, используют перехватчики в качестве своей модели рекомендаций и поддерживают цепочку перехватчиков, ориентированную на точку соединения.
Pointcut: утверждение, соответствующее точке соединения. Advice связан с выражением pointcut и выполняется в точках соединения, которые удовлетворяют этому pointcut (например, когда выполняется метод с определенным именем). То, как выражение pointcut соответствует точке соединения, лежит в основе АОП: Spring по умолчанию использует синтаксис pointcut AspectJ.
Введение: (также известное как межтиповое объявление). Объявите дополнительные методы или поля определенного типа. Spring позволяет вводить новые интерфейсы (и соответствующую реализацию) для любого прокси-объекта. Например, вы можете использовать импорт, чтобы компонент реализовал интерфейс IsModified, чтобы упростить механизм кэширования.
Целевой объект: объект, рекомендованный одним или несколькими аспектами. Некоторые называют это «рекомендуемым» объектом. Поскольку Spring AOP реализуется через прокси-серверы времени выполнения, этот объект всегда является прокси-объектом.
Прокси-сервер AOP (прокси-сервер AOP): объект, созданный платформой AOP для реализации контракта аспекта (включая такие функции, как информирование о выполнении метода). В Spring прокси-серверы AOP могут быть динамическими прокси-серверами JDK или прокси-серверами CGLIB. Примечание. Благодаря недавно представленному стилю на основе схемы и объявлениям аспектов в стиле аннотаций @AspectJ в Spring 2.0 создание прокси прозрачно для пользователей этих стилей.
Сплетение: соедините аспекты с другими типами приложений или объектами и создайте рекомендуемый объект. Это можно сделать во время компиляции (например, с помощью компилятора AspectJ), во время загрузки класса и во время выполнения. Spring, как и другие чистые среды Java AOP, выполняет переплетение во время выполнения.
16. Какие типы уведомлений существуют?
Перед советом: совет, который выполняется до точки соединения, но который не может предотвратить выполнение до точки соединения (если только он не выдает исключение). Совет после возврата: совет, который выполняется после нормального завершения точки соединения: например, метод возвращается нормально, не вызывая никаких исключений.Совет после выдачи: Совет, который выполняется, когда метод завершает работу с выброшенным исключением.
После (наконец) совет): совет, который нужно выполнить, когда точка соединения выходит (независимо от того, возвращается ли она нормально или выходит ненормально).
Вокруг совета: совет, который окружает точку соединения, например, вызов метода. Это самый мощный тип уведомлений. Рекомендации по объемному звучанию можно использовать для реализации пользовательского поведения до и после вызовов методов. Он также выбирает, следует ли продолжить выполнение точки соединения, либо просто вернуть собственное возвращаемое значение, либо выдать исключение для завершения выполнения.
Круговые уведомления являются наиболее часто используемым типом уведомлений. Большинство основанных на перехвате AOP-фреймворков, таких как Nanning и JBoss4, предоставляют только рекомендации по обходу.
Концепция сопоставления точек и точек соединения является ключом к АОП, что отличает АОП от других старых технологий, которые обеспечивали только функции перехвата. Pointcuts позволяют рекомендации по позиционированию быть независимыми от уровня OO. Например, рекомендации по обходу, обеспечивающие декларативное управление транзакциями, могут применяться к набору методов для нескольких объектов (например, ко всем бизнес-операциям на уровне службы).
У меня есть общедоступная учетная запись WeChat, и я часто делюсь галантереей, связанной с технологией Java. Если вам нравится мой обмен, вы можете использовать WeChat для поиска «Java Head» или «javatuanzhang», чтобы подписаться.