Во-первых, введение SRING
Spring — универсальный магазин многоуровневых приложений Java SE/EE.轻量级开源框架
. Весеннее ядроIOC
иAOP
.
К основным преимуществам Spring можно отнести:
- Это удобно для разделения и упрощения разработки.Через контейнер IoC, предоставляемый Spring, мы можем передавать зависимости между объектами в Spring для управления, избегая высокой степени связанности программ, вызванной жестким кодированием.
- Поддержка программирования АОП с помощью функции АОП, предоставляемой Spring, удобна для аспектно-ориентированного программирования.
- Благодаря поддержке декларативных транзакций в Spring мы можем избавиться от монотонного и скучного кода управления транзакциями и гибко управлять транзакциями декларативным способом, чтобы повысить эффективность и качество разработки.
- Это удобно для тестирования программ, и почти все работы по тестированию могут выполняться не зависящим от контейнера способом программирования.
- Удобно интегрировать различные отличные фреймворки, а Spring обеспечивает прямую поддержку различных отличных фреймворков.
Во-вторых, архитектура Spring
Как показано на рисунке ниже, всю структуру Spring можно разделить на пять основных модулей в соответствии с их функциями.Эти пять модулей предоставляют почти все необходимое для корпоративных приложений и имеют соответствующую поддержку от уровня сохранения, бизнес-уровня до уровня представления. , Вот почему Spring называют универсальным фреймворком.
Основной модуль (основной контейнер)
Основной модуль Spring реализует функцию IoC, которая отделяет зависимости между классами от кода и описывает зависимости способом конфигурации. Контейнер IoC отвечает за создание классов, управление, приобретение и т. д. Интерфейс BeanFactory является основным интерфейсом среды Spring и реализует многие основные функции контейнера.
Модуль Context построен на основном модуле и расширяет функции BeanFactory, включая интернационализацию, загрузку ресурсов, почтовую службу, планирование задач и другие функции. ApplicationContext — это основной интерфейс модуля Context.
Язык выражений (Expression Language) — это расширение Unified Expression Language (EL), которое поддерживает установку и получение свойств объекта, вызов методов объекта, манипулирование массивами, коллекциями и т. д. Используйте его, чтобы легко взаимодействовать с контейнером Spring IoC через выражения.
модуль АОП
Модуль Spring AOP предоставляет реализацию, которая соответствует спецификации AOP Alliance и интегрирует AspectJ, структуру уровня языка AOP. Сцепление может быть уменьшено с помощью АОП.
Модуль интеграции доступа к данным (доступ к данным/интеграция)
Этот модуль включает в себя JDBC, ORM, OXM, JMS и управление транзакциями:
- Модуль транзакций: этот модуль используется для транзакций, управляемых Spring.Поскольку объекты, управляемые Spring, могут получать преимущества транзакций, управляемых Spring, нет необходимости в управлении транзакциями в коде, и он поддерживает программирование и декларативное управление транзакциями.
- Модуль JDBC: Предоставляет пример шаблона JBDC. Использование этих шаблонов может устранить традиционное многословное кодирование JDBC и необходимый контроль транзакций, а также воспользоваться преимуществами транзакций, управляемых Spring.
- Модуль ORM: обеспечивает бесшовную интеграцию с популярными объектно-реляционными платформами сопоставления, включая hibernate, JPA, MyBatis и другие. И вы можете использовать управление транзакциями Spring без дополнительного контроля над транзакцией.
- Модуль OXM: Обеспечивает реализацию сопоставления Object/XML, сопоставления объектов Java с данными XML или сопоставления данных XML с объектами Java Реализации сопоставления Object/XML включают JAXB, Castor, XMLBeans и XStream.
- Модуль JMS: используется для JMS (служба обмена сообщениями Java), предоставляя набор шаблонов «создатели сообщений, потребители сообщений» для более простого использования JMS, JMS для отправки между двумя приложениями или в распределенном системном сообщении для асинхронной связи.
Веб-модуль
Модуль построен на модуле ApplicationContext, обеспечивает функциональность веб-приложения, такую как загрузка файлов, FreeMarker и т.д. Spring может интегрировать Struts2 и другие среды MVC. Кроме того, Spring предоставляет среду MVC Spring MVC.
тестовый модуль
Spring может выполнять почти всю работу по тестированию, не зависящую от контейнера, и поддерживает такие среды тестирования, как JUnit и TestNG.
3. Первое знакомство с Ioc и DI
Давайте сначала объясним концепцию IoC. IoC (инверсия управления: инверсия управления) является ядром контейнера Spring, но концепция IoC относительно неясна, поэтому людям трудно воспринимать ее буквально.
1. Инверсия управления IoC и внедрение зависимостей DI
В традиционном программировании нам нужно использовать метод объекта, и нам нужно сначала создать объект через new.Мы активны в это время, а IoC означает, что мы передаем управление созданным объектом контейнеру IoC, который контролируется контейнером. Помогите создать и внедрить зависимые объекты, наш程序被动的接受IoC容器创建的对象
Инверсия контроля, поэтому она называется инверсией управления.
Поскольку IoC на самом деле недостаточно прямолинеен, предлагается концепция DI (Dependency Injection: Dependency Injection), то есть предоставление третьей стороне реализации внедрения для удаления зависимостей между нашими классами и классами, которые необходимо использовать. В общем, IoC — это цель, DI — это средство, а процесс создания объекта часто означает внедрение зависимостей. Чтобы реализовать IoC, метод создания объектов отличается от традиционного метода (новый), а контейнер IoC помогает нам внедрять (DI), когда нам нужно создавать связанные объекты.
Проще говоря, нам нужен еще один класс в нашем классе, просто пусть Spring поможет нам его создать, который называется控制反转
; Затем Spring помогает нам установить необходимые объекты в наш класс, который называется依赖注入
.
2. Несколько распространенных методов инъекции
- Внедрить с помощью параметризованного конструктора
public class User{
private String name;
public User(String name){
this.name=name;
}
}
User user=new User("tom");
- Использовать внедрение свойств
public class User{
private String name;
public void setName(String name){
this.name=name;
}
}
User user=new User();
user.setName("jack");
- Использование внедрения интерфейса
// 将调用类所有依赖注入的方法抽取到接口中,调用类通过实现该接口提供相应的注入方法。
public interface Dao{
public void delete(String name);
}
public class DapIml implements Dao{
private String name;
public void delete(String name){
this.name=name;
}
}
Внедрение зависимостей выполняется через контейнер
Все вышеперечисленные методы инъекции требуют от нас ручной инъекции, если есть第三方容器能帮助我们完成类的实例化
, и сборка зависимостей, то нам нужно сосредоточиться только на разработке бизнес-логики. Spring является таким контейнером, который описывает зависимости между классами и классами через файлы конфигурации или аннотации и автоматически завершает инициализацию класса и внедрение зависимостей.
3. Пример Spring IoC
(1) Создайте проект и импортируйте пакет jar
Здесь мы выполняем только операцию IoC, поэтому нам нужно только импортировать пакет jar в основной модуль, bean-компоненты, ядро, контекст, выражение и т. д. Поскольку весной нет пакета jar, связанного с журналом, нам также необходимо импортировать log4j и commons-logging.
(2) Создать класс
public class User {
public void add(){
System.out.println("add.....");
}
}
(3) Создайте файл конфигурации xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
//配置要创建的类
<bean id="user" class="com.cad.domain.User"/>
</beans>
(4) Тест
//这只是用来测试的代码,后期不会这么写
public class Test {
@org.junit.Test
public void test(){
//加载配置文件
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
//获取对象
User user=(User) context.getBean("user");
System.out.println(user);
//调用方法
user.add();
}
}
Когда контейнер запущен, Spring автоматически создаст экземпляр Bean и завершит сборку зависимостей в соответствии с информацией описания файла конфигурации.Экземпляр Bean можно получить из контейнера и использовать напрямую. Почему Spring может волшебным образом создавать и настраивать bean-компоненты, используемые программой, с помощью всего лишь простого файла конфигурации? Ответ черезJava的反射技术
.
4. Пример DI Spring
Наш сервисный уровень всегда использует дао-уровень. Раньше мы всегда создавали новые дао-объекты на сервисном уровне. Теперь мы используем внедрение зависимостей для внедрения дао-слоя в сервисный уровень.
// UserDao
public class UserDao {
public void add(){
System.out.println("dao.....");
}
}
// UserService
public class UserService {
UserDao userdao;
public void setUserdao(UserDao userdao){
this.userdao=userdao;
}
public void add(){
System.out.println("service.......");
userdao.add();
}
}
-------------------------------分割线--------------------------
// 配置文件
<bean id="userdao" class="com.cad.domain.UserDao"></bean>
//这样在实例化service的时候,同时装配了dao对象,实现了依赖注入
<bean id="userservice" class="com.cad.domain.UserService">
//ref为dao的id值
<property name="userdao" ref="userdao"></property>
</bean>
В-четвертых, артефакт доступа к ресурсам Spring — интерфейс ресурсов
Классы для доступа к ресурсам (например, java.NET.URL, File), предоставляемые JDK, не могут очень хорошо и удобно удовлетворять требованиям доступа к различным базовым ресурсам. Spring разработал интерфейс ресурсов, чтобы предоставить приложениям более широкие возможности доступа к базовым ресурсам.Этот интерфейс имеет классы реализации, соответствующие различным типам ресурсов.
1. Основные методы интерфейса Resource
- boolean exists(): существует ли ресурс
- boolean isOpen(): открыт ли ресурс
- URL getURL(): возвращает URL-адрес соответствующего ресурса.
- File getFile(): возвращает соответствующий файловый объект
- InputStream getInputStream(): возвращает входной поток соответствующего ресурса.
Ресурс играет незаменимую роль в среде Spring.Среда Spring использует ресурсы для загрузки различных ресурсов, включая ресурсы файла конфигурации, ресурсы атрибутов интернационализации и т. д.
2. Конкретный класс реализации интерфейса Resource
- ByteArrayResource: Ресурс, представленный двоичным массивом
- ClassPathResource: Ресурсы в пути к классам, ресурсы представлены относительно пути к классам.
- FileSystemResource: ресурсы файловой системы, ресурсы представлены путями файловой системы, например d:/a/b.txt.
- InputStreamResource: ресурс, соответствующий InputStream
- ServletContextResource: класс, предназначенный для доступа к ресурсам в контексте контейнера. Отвечает за загрузку ресурсов с путем относительно корня веб-приложения.
- UrlResource: инкапсулирует java.net.URL. Пользователи могут получить доступ к любым ресурсам, которые могут быть представлены URL-адресом, таким как ресурсы Http, ресурсы Ftp и т. д.
3. Механизм загрузки ресурсов Spring
Чтобы получить доступ к различным типам ресурсов, необходимо использовать соответствующие классы реализации ресурсов, что является проблематичным. Spring предоставляет мощный механизм загрузки ресурсов, и соответствующие ресурсы могут быть загружены только посредством специальной идентификации адреса ресурса. Во-первых, давайте посмотрим на весну支持哪些资源类型的地址前缀
:
- classpath: например, класс: COM / CAD / домен / bean.xml. Загружать ресурсы из класса
- fileНапример, файл: com / cad / domain / bean.xml. Используйте URLResource для загрузки ресурсов из каталога файловой системы.
- http:// НапримерWoohoo. Baidu.com/resource/ не голоден…Загружать ресурсы с веб-сервера с помощью UrlResource
- ftp://например, frp://10.22.10.11/bean.xml используйте UrlResource для загрузки ресурсов с ftp-сервера
Spring определяет набор интерфейсов для загрузки ресурсов. Интерфейс ResourceLoader имеет только один метод getResource(String location), который может загружать файловые ресурсы в соответствии с адресом ресурса. Адреса ресурсов поддерживают только адреса с префиксами типа ресурса, а не выражения пути к ресурсу в стиле Ant. ResourcePatternResolver расширяет интерфейс ResourceLoader и определяет новый метод интерфейса getResources(String locationPattern), который поддерживает выражения с префиксами типов ресурсов и путями к ресурсам в стиле Ant. PathMatchingResourcePatternResolver — это стандартный класс реализации, предоставляемый Spring.
4. Примеры
public class Test {
public static void main(String[] args) throws IOException {
ResourceLoader resloLoader = new DefaultResourceLoader();
Resource res = resloLoader.getResource("https://www.baidu.com/");
System.out.println(res instanceof UrlResource); // true
BufferedReader bf = new BufferedReader(new InputStreamReader(res.getInputStream()));
StringBuilder sb = new StringBuilder();
String temp = null;
while ((temp = bf.readLine())!= null) {
sb.append(temp);
}
System.out.println(sb.toString());
System.out.println("\n-----------------------------\n");
res = resloLoader.getResource("classpath:test.txt");
bf = new BufferedReader(new InputStreamReader(res.getInputStream()));
sb = new StringBuilder();
temp = null;
while ((temp = bf.readLine())!= null) {
sb.append(temp);
}
System.out.println(sb.toString());
System.out.println("\n-----------------------------\n");
res = resloLoader.getResource("file:C:\\Users\\ricco\\Desktop\\test\\test.txt");
bf = new BufferedReader(new InputStreamReader(res.getInputStream()));
sb = new StringBuilder();
temp = null;
while ((temp = bf.readLine())!= null) {
sb.append(temp);
}
System.out.println(sb.toString());
}
}
5. Подробное объяснение контейнера Spring Ioc
1. Бобовая фабрика
BeanFactory — это фабрика классов. В отличие от традиционных фабрик классов, традиционные фабрики классов отвечают только за создание экземпляров одного класса или нескольких классов, в то время как BeanFactory может создавать и управлять объектами различных классов. Spring называет их созданными и управляемыми объектами Java. .
BeanFactory — это интерфейс, Spring предоставляет множество реализаций для BeanFactory, наиболее часто используемой является XmlBeanFactory. Среди них основным методом интерфейса BeanFactory является getBean(String beanName), который возвращает бин с указанным именем из контейнера. Кроме того, функциональность интерфейса BeanFactory может быть расширена путем реализации его интерфейса (например, ApplicationContext). См. пример ниже:
//我们使用Spring配置文件为User类提供配置信息,然后通过BeanFactory装载配置文件,启动Spring IoC容器。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.cad.domain.User"></bean>
</beans>
// 我们通过XmlBeanFactory实现类启动Spring IoC容器
public class Test {
@org.junit.Test
public void test(){
//获取配置文件
ResourcePatternResolver resolver=new PathMatchingResourcePatternResolver();
Resource rs=resolver.getResource("classpath:bean.xml");
//加载配置文件并启动IoC容器
BeanFactory bf=new XmlBeanFactory(rs);
//从容器中获取Bean对象
User user=(User) bf.getBean("user");
user.speak();
}
}
XmlBeanFactory загружает файл конфигурации Spring и запускает контейнер IoC.Когда контейнер IoC запускается через BeanFactory, bean-компоненты, определенные в файле конфигурации, не будут инициализированы, а начальное действие создания выполняется при первом вызове. При инициализации BeanFactory должна быть предоставлена структура ведения журнала, и мы используем Log4J.
2. Контекст приложения
Унаследованный от ApplicationContext BeanFactory предоставляет больше возможностей для практического применения. В BeanFactory для достижения многих функций требуется программирование, в то время как ApplicationContext может быть достигнут путем настройки. Основной класс реализации — ApplicationContext.ClassPathXmlApplicationContext
иFileSystemXmlApplicationContext
, первый по умолчанию загружает файл конфигурации из пути к классам, а второй по умолчанию загружает файл конфигурации из файловой системы следующим образом:
// 和BeanFactory初始化相似,ApplicationContext初始化也很简单
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
Существует большое различие между инициализацией ApplicationContext и инициализацией BeanFactory.BeanFactory初始化容器时并未初始化Bean,只有第一次访问Bean时才创建;而ApplicationContext则在初始化时就实例化所有的单实例的Bean
. Поэтому время инициализации ApplicationContext будет несколько больше.
3. Контекст веб-приложения
WebApplicationContext специально подготовлен для веб-приложений, он позволяет загружать файлы конфигурации по пути относительно корневого веб-каталога для завершения работы по инициализации. Ссылку на ServletContext можно получить из WebApplicationContext, а весь объект WebApplicationContext помещается в ServletContext в качестве атрибута, так что контекст приложения Spring может быть доступен в среде веб-приложения.ConfigurableWebApplicationContext
Расширяет webapplationcationContext, обеспечивает создание webapplationContext по конфигурации и определяет два важных метода.
- setServletContext(ServletContext servletcontext): Установить ServletContext для Spring
- setConfigLocation(String[] configLocations): Установите адрес файла конфигурации Spring.
WebApplicationContext初始化的时机和方式
Да: используйте прослушиватель ContextLoaderListener, предоставленный Spring, для отслеживания создания объекта ServletContext.Когда объект ServletContext создан, создайте и инициализируйте объект WebApplicationContext. Поэтому нам нужно только настроить прослушиватель в web.xml.
<!-- 利用Spring提供的ContextLoaderListener监听器去监听ServletContext对象的创建,并初始化WebApplicationContext对象 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Context Configuration locations for Spring XML files(默认查找/WEB-INF/applicationContext.xml) -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
4. Связь и различие между BeanFactory, ApplicationContext и WebApplicationContext
Spring описывает зависимости между bean-компонентами через файл конфигурации и может создавать экземпляры bean-компонентов и устанавливать зависимости между bean-компонентами с помощью технологии отражения языка Java. Контейнер Spring IoC также предоставляет расширенные услуги, такие как кэширование экземпляров компонентов, управление жизненным циклом, публикация событий и загрузка ресурсов на основе выполнения этих базовых задач.
Beanfactory - это основной интерфейс пружины, который обеспечивает расширенный механизм конфигурации IOC. ApplicationContext построен на основе Finfacfortory, который представляет собой суб-интерфейс компонентов компонентов и обеспечивает более ориентированные на применение функций. Как правило, мы называем фанафство, какIoC容器
, Контекст приложения应用上下文
, также известен какSpring容器
. WebApplicationContext предназначен дляWeb应用准备
Да, он позволяет загружать файлы конфигурации по пути относительно корневого веб-каталога для завершения работы по инициализации и является подинтерфейсом интерфейса ApplicationContext.
BeanFactory является основой фреймворка Spring и ориентирован на сам Spring, ApplicationContext ориентирован на разработчиков, использующих фреймворк Spring. Мы используем ApplicationContext напрямую вместо базового BeanFactory почти для всех приложений, WebApplicationContext специально используется для веб-приложений.
5. Родительско-дочерний контейнер
Благодаря интерфейсу иерархично-активна, контейнер IOC Spring может создать систему родительской системы:子容器可以访问父容器的Bean,父容器不能访问子容器的Bean。
Контейнер Spring Sons, реализованные с использованием многих функций, таких как весенний контроллер MVC Controller, расположенный субконтенер, сервис и настойчивые слои, расположенные в родительском контейнере. Но даже так, контроллер также может означать настойчивость бобовых фасолей и бизнес-слой, а сервисный слой и настойчивый слой не увидят контроллер.
更多精彩文章,关注公众号【ToBeTopJavaer】,更有数万元精品vip资源免费等你来拿!!!