@[toc]
1. Обзор весны
При изучении фреймворка SSM я предлагаю новичкам сначала изучить фреймворк Spring, затем mybatis, а затем springMVC.Конечно, также можно сначала изучить mybatis.Сегодня мы ворвемся в мир Spring с абсолютной элегантностью, крепим пристегните ремни и приготовьтесь. Вы готовы к работе! ! ! Кхм.... Контейнер IOC, который чаще всего используется для разработки, оценивается как контейнер IOC, который может загружать bean-компоненты (так называемый bean-класс в нашей java, конечно, включая сервисдао).С этим механизмом , нам не нужно использовать его каждый раз. При использовании этого класса он инициализируется, а ключевое слово new встречается редко. Кроме того, нами часто используются аоп Spring, управление транзакциями и т. д. Видно, что особенно важная роль Spring — это ядро инверсии управления Spring (IoC) и аспектно-ориентированного (AOP).
1.1 Что такое весна
Должен быть медвежонок, который спросит, что универсальная структура, разработанная SE/EE, подразумевает под так называемой универсальной остановкой (Ха, человек, я догадался, что вы спросите) Так называемая универсальная структура относится к каждому уровню решений, разработанных EE.
ВЕБ-слой: SpringMVC
Сервисный уровень: управление компонентами Spring, декларативная транзакция Spring
Слой DAO: шаблон Spring Jdbc, модуль Spring ORM
1.2 Зачем изучать Spring
Как говорится, жестоких слов много не бывает (брат, посмотри на картинку)
1.3 Весенняя версия
Spring3.x, Spring4.x и Spring5.x
1.4 Архитектура весны
Как говорится, жестоких слов много не бывает (брат, посмотри на картинку)
2. Введение в Spring (IOC)
2.1 Что МОК
Когда я говорю о IOC, я думаю о нескольких примерах понимания IOC братом Ву.Это легко понять и очень подходит для братьев, которые только начали Spring! Если вам интересно, вы можете узнать о Wu Ge, блоге Wu Ge:blog.csdn.net/eson_15
IOC (инверсия управления): инверсия управления, также известная как инверсия зависимостей. Инверсия управления: инвертирует (передает) создание объекта Spring.
Так называемая зависимость, с точки зрения программы, это, например, если A хочет вызвать метод B, то A зависит от B. В любом случае, если A нужно использовать B, то A зависит от B .
зависит от Б. Так называемая инверсия, вы должны понимать, что произойдет, если она не инвертирована, потому что A должен иметь B, прежде чем он сможет вызвать B, если он не инвертирован.
Set, что означает, что A активно получает экземпляр B: B b = new B(), что является самым простым способом получить экземпляр B (конечно, существуют различные
Шаблоны проектирования могут помочь вам получить экземпляры B, такие как фабрики, локатор и т. д.), а затем вы можете вызвать объект b. Место
Следовательно, отсутствие инверсии означает, что A должен активно приобретать B, прежде чем использовать B; на этом этапе вы должны понимать значение инверсии. инверсия
Если А хочет позвонить Б, А не нужно проявлять инициативу, чтобы получить Б, но другие люди автоматически посылают Б к двери.
2.2 Популярное понимание IOC
Пример изображения: Обычно, если однажды вы испытываете жажду дома и хотите пить воду, вы можете пойти в столовую в вашем районе, сказать им, что вам нужна бутылка воды, и столовая даст вам бутылку воды! Это не большая проблема, суть в том, что если лавка находится далеко, то вы должны знать: как пройти в лавку из дома; есть ли в лавке нужная вам вода; надо подумать, стоит ли туда ехать бла-бла-бла, может быть, есть слишком много вопросов, чтобы рассмотреть. То есть для бутылки с водой вам также может понадобиться использовать транспортные средства, такие как автомобили или другие инструменты.Усложнилась ли проблема? Итак, как решить эту проблему? Решение этой проблемы очень простое: магазин предоставляет услуги «от двери до двери». дверь! Таким образом, вам нужно сделать всего две вещи, вам будет легче жить: Первое: зарегистрируйтесь в качестве члена в магазине. Второе: скажите комиссару, что вам нужно.
Это очень похоже на то, что делает Spring! Весна — это столовая, вы — объект А, а вода — объект Б. Во-первых: объявить класс в Spring: A Второе: скажите Spring, что A нуждается в B
Предположим, что A — класс UserAction, а B — класс UserService.
<bean id="userService" class="org.leadfar.service.UserService"/>
<bean id="documentService" class="org.leadfar.service.DocumentService"/>
<bean id="orgService" class="org.leadfar.service.OrgService"/>
<bean id="userAction" class="org.leadfar.web.UserAction">
<property name="userService" ref="userService"/>
</bean>
В магазине Spring (фабрике) есть много объектов/сервисов: userService, documentService, orgService и множество участников: userAction и т. д. Достаточно объявить, что userAction нуждается в userService, и Spring будет активно отправлять userService в дверь через канал, который вы ему предоставляете, поэтому пример кода для UserAction выглядит следующим образом:
package org.leadfar.web;
public class UserAction{
private UserService userService;
public String login(){
userService.valifyUser(xxx);
}
public void setUserService(UserService userService){
this.userService = userService;
}
}
В этом коде вам не нужно создавать объект UserService самостоятельно (Spring, как невидимая рука, стоящая за ним, активно отправляет вам объект UserService через определяемый вами метод setUserService(), который называется внедрением зависимостей!), Конечно, мы также можем вводить с помощью аннотаций. Технология внедрения Spring-зависимости: динамический прокси
2.3 Загрузите пакет разработки Spring и инструкции по распаковке
Скачать с официального сайта:spring.io/Какие? не скачивается? какие? ? ? Итак, QAQ упакован:Disk.Baidu.com/Yes/18 пользователей сети E-5SR…Какие? Нет сетевого диска? какие? ? ? Пожалуйста, зажгите благовония, если у вас есть что-нибудь, спасибо...
Описание файла после распаковки: документы: Спецификация разработки Spring и API libs : jar для разработки Spring и исходный код схема: ограничения файла конфигурации Spring
2.4 Создайте веб-проект и введите пакет jar
2.5 Создание общих интерфейсов и классов реализации
Создайте нормальный интерфейс и определите метод eat
package com.gx.sping;
public interface IUserDao {
public void eat();
}
Создайте общий класс реализации
package com.gx.sping;
public class UserDaoimpl implements IUserDao {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println(用户eat了");
}
}
2.6 Основной принцип реализации IOC в Spring
Проблемы с созданием общих интерфейсов и классов: Если базовая реализация переключается и исходный код необходимо изменить, можно ли расширить программу без изменения исходного кода программы? Дело в том, что IOC Spring можно реализовать без изменения исходного кода! Как показано ниже:Базовая реализация IOC в Spring
2.7 Передать класс реализации руководству Spring
1. Вclasspathвниз (то естьsrc)СоздаватьXMLдокумент
2. Имя файла лучше называть единообразноapplicationContext.xml
3. Заголовок содержимого его XML-файлаограничения схемы
4. Расположение файла ограничений: lspring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.htm по пути распаковки spring
5. Не обязательно, чтобы заголовок содержимого файла xml можно было прочитать, но вам нужно понять, что вам нужно знать, откуда он взялся.
6. После добавления заголовка содержимого xml-файла класс реализации передается в управление Spring.
Файл конфигурации applicationContext.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">
<!-- 实现类UserDaoimpl交给Spring管理 -->
<bean id="IuserDao" class="com.gx.Ioc.UserDaoimpl" ></bean>
</beans>
2.8 Написание тестовых классов
package com.gx.Ioc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpingDemo1 {
@Test
public void demo11() {
// 面向接口传统方式
UserDaoimpl userdao = new UserDaoimpl();
userdao.eat();
}
//Spring的bean管理方式
@Test
public void demo22() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
IUserDao userdao = (IUserDao) applicationContext.getBean("IuserDao");
userdao.eat();
}
}
Брат, если тест не пройден, лучше посмотреть, соответствуют ли они друг другу! ! !
Брат Дей, здесь, Весенняя запись (МОК) имеет право, это чувствовать себя очень выполненным?Потяните его вниз, я слишком смущен, чтобы сказать это.
Но я все еще не могу остановить твое гордое сердце.
Тогда превзойдите меня, дайте мне почувствовать вашу гордость!
2.9 IOC и DI
IOC — это не технология, а проектная идея, IOC может помочь нам разработать слабосвязанные и более качественные программы. В традиционных приложениях мы активно создаем зависимые объекты внутри класса, что приводит к высокой связанности между классами и сложности с тестированием.В контейнере IoC управление созданием и поиском зависимых объектов передается контейнеру Spring.Контейнер внедряет и объединяет объекты, поэтому объекты слабо связаны, что способствует функциональному повторному использованию и, что более важно, делает всю архитектуру программы очень гибкой. IOC: инверсия управления, которая инвертирует создание объекта в Spring. DI: Внедрение зависимостей, предпосылка должна иметь среду IOC.Когда Spring управляет этим классом, он внедряет (устанавливает) зависимые свойства класса. Например, упомянутое ниже внедрение свойств Spring на самом деле является типичным DI.
Так называемое наследование:
Class A{
}
Class B extends A{
}
Так называемая зависимость:
Class A{
}
Class B{
public void xxx(A a){
}
}
Так называемая агрегация: имеет
3. Фабричный класс Spring
3.1 Структура класса Spring Factory
3.2 Старая версия фабричного класса: BeanFactory
BeanFactory: экземпляр класса создается при вызове getBean.
3.3 Новая версия фабричного класса: ApplicationContext
ApplicationContext: при загрузке файла конфигурации создаются экземпляры всех классов, управляемых Spring. ApplicationContext имеет два класса реализации 1. ClassPathXmlApplicationContext: загрузите файл конфигурации в пути к классам. 2. FileSystemXmlApplicationContext: загрузите файл конфигурации в файловой системе.
4. Конфигурация пружины
4.1 Конфигурация приглашения XML (конфигурация схемы)
В файле XML нужно использовать различные теги для настройки весны. Как я могу запомнить все теги в весне? Я блоггер. Я не боюсь. Я настрою подсказку XML и настрою QAQ. Даже если вы Джордж голова, не беспокойтесь об одном движении
4.2 Конфигурация, связанная с компонентом (конфигурация идентификатора и имени тега )
id : используется уникальное ограничение в ограничениях. В нем не может быть никаких специальных символов. Выше упоминалось, что он соответствует значению параметра getbean
name : Уникальное ограничение в ограничениях не используется (теоретически могут быть дубликаты, но фактическая разработка не может происходить). В нем могут появляться специальные символы.
4.3 Конфигурация жизненного цикла компонента (понимание)
init-method : метод, который будет выполняться при инициализации Bean-компонента. destroy-method : Метод, выполняемый при уничтожении Бин (Бин создается как синглтон, а фабрика закрывается)
4.4 Конфигурация области действия Бина (выделено)
свойство области видимости:Сфера применения бина
значение атрибута области видимостиВот как (в основном используются первые два) singleton:Значение атрибута области действия по умолчанию, Весна будет использоватьсинглтонСхема создает этот объект. prototype:Несколько случаевмодель. (Определенно будет использоваться интеграция Struts2 и Spring) request: применяется в веб-проектах, после того как Spring создает этот класс, он сохраняет этот класс в области запроса. session: применяется в веб-проектах, после того как Spring создает этот класс, он сохраняет этот класс в области сеанса. globalsession: применяется в веб-проектах, должен использоваться в среде портлетов. Но если такой среды нет, относительно сессии.
5. Внедрение свойства Spring
Во-первых, создайте несколько общих классов
com.gx.spring.demo.Car
public class Car {
private String name;
private Double price;
public Car(String name, Double price) {
super();
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + "]";
}
}
com.gx.spring.demo.Car2
/**
* 用作set方法的属性注入类
*/
public class Car2 {
private String name;
private Double price;
public void setName(String name) {
this.name = name;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Car2 [name=" + name + ", price=" + price + "]";
}
}
com.gx.spring.demo.Person
/**
* 用作set方法的对象属性注入类
*/
public class Person {
private String name;
private Car2 car2;
public void setName(String name) {
this.name = name;
}
public void setCar2(Car2 car2) {
this.car2 = car2;
}
@Override
public String toString() {
return "Employee [name=" + name + ", car2=" + car2 + "]";
}
}
5.1 Внедрение свойства через конструктор
Внедрение свойств для конструкторов Тег конструктора-аргумента используется для настройки внедрения свойств для конструкторов. name : имя параметра значение: установить нормальные данные ref: справочные данные, обычно другое значение идентификатора компонента
Конечно, внедрение свойств метода конструктора также поддерживает внедрение свойств объекта, и соответствующее свойство в теге также является ref. Если есть только один конструктор с параметрами и тип параметра соответствует типу внедряемого bean-компонента, он будет внедрен в этот конструктор.
Конфигурация в applicationContext.xml:
<!-- 构造方法的方式 -->
<bean id="car" class="com.gx.spring.demo.Car">
<constructor-arg name="name" value="玛莎拉蒂"/>
<constructor-arg name="price" value="800000"/>
</bean>
Методы испытаний:
/**
* 构造方法方式的普通属性注入方法
*/
public void demo1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car) applicationContext.getBean("car");
System.out.println(car);
}
5.2 Внедрение свойств методом Set [обычно используется в разработке]
Внедрение обычных свойств для методов SetpropertyТеги используются для настройки внедрения свойств для методов Set. name : имя параметра значение: установить нормальные данныеref: справочные данные, обычно другое значение идентификатора компонента
Конфигурация в applicationContext.xml:
<!-- set方法的方式 -->
<bean id="car2" class="com.gx.spring.demo.Car2">
<property name="name" value="法拉利黄金跑车"/>
<property name="price" value="10000000"/>
</bean>
Методы испытаний:
@Test
/**
* set方法方式的属性注入
*/
public void demo2(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Car2 car2 = (Car2) applicationContext.getBean("car2");
System.out.println(car2);
}
Метод Set устанавливает свойства типа объекта Конфигурация в applicationContext.xml:
<!-- set方法注入对象类型的属性 -->
<bean id="Person" class="com.gx.spring.demo.Person">
<!-- value:设置普通类型的值,ref:设置其他的类的id或name-->
<property name="name" value="涛哥"/>
<property name="car2" ref="car2"/>
</bean>
Методы испытаний:
@Test
/**
* set方法注入对象类型
*/
public void demo3(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person= (Person) applicationContext.getBean("Person");
System.out.println(person);
}
5.3 Внедрение атрибутов посредством аннотации [обычно используется в разработке]
@Component (общий для классов: компоненты)
@Component("userService") эквивалентен
производная:@Controllerвеб-уровень@ServiceБизнес-уровень@Repositoryслой сохраняемости Эти три аннотации должны прояснить цель самого класса аннотаций.
Аннотация для внедрения свойства (может не иметь установленного метода) Свойство нормального типа: @Value
Свойства типа объекта:@Resource(соответствует идентификатору в bean-компонентезнак равно@Autowired(тип)+ @Квалификатор(имя)
5.3.1 Понимание аннотаций
Что ж, для начинающих слово аннотация может быть слишком незнакомым для большинства медведей.Аннотация на самом деле представляет собой класс, метод, атрибут, использующий имя аннотации @, например, самый знакомый метод реализации интерфейса во рту. Будет @ Переопределить по умолчанию (медвежонок, это приемлемо?)
5.3.2 Импорт пакета jar с аннотациями
Spring3.xБаночка с аннотациямиВ версии Spring 3.x, используя разработку аннотаций, нужно толькоБазовые четыре пакета Spring Core + пакет log4j + 1 пакет зависимостейПросто
Spring4.xБаночка с аннотациямиОднако после версии Spring 4.x вам нужно добавить еще одну, чтобы представитьjar пакет весны-аоп, потому что методы зависимостей некоторых аннотаций в версии spring4.x инкапсулированы в jar-пакете spring-aop5.3.3 Введение контекстных ограничений аннотаций
Так называемое ограничение — это ограничение (пот), из которых ограничение бина является самым основным ограничением! (Это также видно на картинке ниже)
Введите ограничения: (введите ограничения контекста):<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
5.3.4 Написание связанных классов
public interface UserDao {
public void sayHello();
}
public class UserDaoImpl implements UserDao {
@Override
public void sayHello() {
System.out.println("Hello Spring...");
} }
5.3.5 Настройка сканирования аннотаций
Разработка аннотаций Spring: сканирование компонентов (сканирование компонентов не требуется, если аннотации к классам не используются) Для использования метода аннотации необходимо включить сканирование компонентовcontext:component-scan base-package= Прямое имя пакета или имя пакета.Имя класса />, конечно, в разработке, это вообщеbase-package=имя пакета, ведь этим можно просканировать весь пакет, что удобно для разработки Разработка аннотаций Spring: сканирование компонентов (аннотации к классам: аннотации, в которые можно напрямую вводить свойства)
<!-- Spring 的注解开发:组件扫描(类上注解: 可以直接使用属性注入的注解) -->
<context:component-scan base-package="com.gx.spring.demo1"/>
5.3.6 Добавление аннотаций к связанным классам
1. Используйте метод аннотации @Component (value="userDao") для класса, который эквивалентен
@Component(value="userDao") //相当于配置了<bean id="userDao" class="com.gx.UserDaoImpl "></bean>
public class UserDaoImpl implements UserDao {
@Override
public void sayHello() {
System.out.println("Hello Spring Annotation...");
} }
5.3.7 Написание тестовых классов
@Test
public void demo3() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.sayHello();
}
Внедрение атрибутов пространства имен 5.4P (после Spring 2.5)
Внедрение атрибутов выполняется путем введения пространства имен p: Письмо: Обычное свойство p:property name="value" Свойство объекта p:property name-ref="value"
Ограничение введения пространства имен P
использовать пространство имен p5.5 Внедрение атрибутов SpEL (после Spring 3.0)
SpEL: Spring Expression Language, язык выражений Spring. Синтаксис: #{SpEL}
5.6 Внедрение свойства типа коллекции (понимание)
Конфигурация свойств типа коллекции:Инъекция коллекции заключается в добавлении вложенных тегов в тег
<!-- Spring的集合属性的注入============================ -->
<!-- 注入数组类型 -->
<bean id="collectionBean" class="com.gx.spring.demo.CollectionBean">
<!-- 数组类型 -->
<property name="arrs">
<list>
<value>天才</value>
<value>王二</value>
<value>冠希</value>
</list>
</property>
<!-- 注入list集合 -->
<property name="list">
<list>
<value>李兵</value>
<value>赵如何</value>
<value>邓凤</value>
</list>
</property>
<!-- 注入set集合 -->
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<!-- 注入Map集合 -->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
</bean>
6. Конфигурация разработки подмодуля Spring
Конфигурация подмодуля: При загрузке конфигурационного файла загружать не один, да, это легендарная операция Sao, которую можно назвать операцией на открытом уровне (конечно, это возможно, не открыто)
Внедрение нескольких файлов конфигурации в один файл конфигурации просто превосходно! ! !Здесь, поздравляю, все, Xiong dei, ворвались в мир Spring с элегантным чувством церемонии и имеют определенное представление о IOC и DI Spring. контроль (IOC) и аспектно-ориентированный (AOP).[Обучение Spring Framework 2] Популярное понимание Spring AOP и разработка входа в AOP(Эй, не бей... не бей... не бей в лицо....)
Если эта статья хоть немного поможет вам, пожалуйста, поставьте ей большой палец вверх и оставьте в своих руках ненавязчивый аромат, спасибо!
Наконец, приглашаю всех обратить внимание на мою официальную учетную запись, обсудить технологии вместе, тосковать по технологиям, заниматься технологиями...