- Для связи или большего количества контента, пожалуйста, обратите внимание на мой общедоступный номер:nezha_blog
- Мой технический блог:nezha.github.io
1. Заметки об исследовании Spring Boot — метод полной аннотации
Учебное пособие по Spring Boot и учебное пособие по Spring Cloud
2. Spring boot китайская справочная документация
Справочное руководство по Spring Boot Перевод на китайский язык — «Справочное руководство по Spring Boot»- Описание: Версия перевода этого документа: 1.4.1.RELEASE.
3. Общие примечания
-
@RestController
Возвращайте результат в виде json, что удобно для разделения фронта и бекенда. Это комбинация @ResponseBody и @Controller -
@RequestMapping
Настроить сопоставление URL @EnableAutoConfiguration
@Configuration
@ComponentScan
@SpringBootApplication
Многие разработчики Spring Boot всегда используют@Configuration
,@EnableAutoConfiguration
а также@ComponentScan
Аннотируйте их основной класс. Поскольку эти аннотации так часто используются вместе (особенно если вы следуете приведенным выше рекомендациям), Spring Boot предоставляет удобный@SpringBootApplication
выберите.
Должен@SpringBootApplication
Аннотация эквивалентна использованию со свойством по умолчанию.@Configuration
,@EnableAutoConfiguration
а также@ComponentScan
.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@ConfigurationProperties
Внедрение свойства, префикс относится к введенной конфигурации из объекта соединения.
@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {
private String username;
private InetAddress remoteAddress;
// ... getters and setters
}
connection:
name: 赵武
age: 18
job: Java研发工程师
чтобы использовать@ConfigurationProperties
бобы, вы можете вводить их так же, как и любые другие бобы
@Service
public class MyService {
@Autowired
private ConnectionSettings connection;
//...
@PostConstruct
public void openConnection() {
Server server = new Server();
this.connection.configure(server);
}
}
@EnableConfigurationProperties
-
@Component
а также@Bean
@Bean
В основном используется в методах для явного объявления создаваемого класса. @Profiles
Профили Spring предоставляют способ изолировать конфигурацию приложения и заставить эти конфигурации действовать только при определенных обстоятельствах.
spring:
profiles:
active: dev
@Value
Используется для получения элементов конфигурации в файле конфигурации
people:
name: 赵武
age: 18
job: Java研发工程师
@Value("${people.name}")
private String name;
@Controller
@PathVariable
,@RequestParam
@GetMapping
,@PostMapping
:Получить или отправить запрос, комбинированный режим
@PathVariable
использовать для получения параметров запроса
@RequestMapping(value="/hello/{id}",method = RequestMethod.GET)
public String sayhello(@PathVariable("id")Integer myid){
return "id:"+myid;
}
@RequestParam
использовать для получения параметров традиционным способом
@RequestMapping(value="/hi",method = RequestMethod.GET)
public String sayhi(@RequestParam(value = "id",required = false,defaultValue = "100")Integer myid){
return "id:"+myid;
}
4. spring data JPA — единый источник данных
Конкретная демонстрация кода реализации:Демонстрационная программа Spring-Boot-Restful-JPA
Определяет стандарт сохраняемости объектов, в основном интеграцию Hibernate.
На данном этапе обнаружено, что это очень согласуется с интуитивно понятной работой mybatis. Можно централизованно управлять подключением к базе данных и выпуском. По сравнению с mybatis, JPA может автоматически создавать таблицы. Я не знаю, является ли это преимуществом. , но это не на мой взгляд. В конце концов, структура таблицы — это, по сути, то, что сделали инженеры баз данных.
1. Добавьте зависимости
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2. Настройте базу данных и JPA
ddl-auto: способ создания
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/coder
username: root
password: root
jpa:
hibernate:
ddl-auto: create
show-sql: true
3. Создайте объект Mapper
@Entity: постоянный экземпляр
@Table: имя пользовательской таблицы
@Entity
//@Table(name = "programmer")
public class Coder {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
private Integer age;
public Coder(){
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
4. Интегрируйте JpaRepository
В основном на основе Hibernate
public interface CoderRepository extends JpaRepository<Coder,Integer> {
//这个是扩展开来的查询方式
public List<Coder> findByAge(Integer age);
}
5. Реализуйте CoderController для добавления, удаления, изменения и проверки.
@RestController
public class CoderController {
@Autowired
private CoderRepository coderRepository;
//1.Get方式请求,查询所有程序员信息
@GetMapping(value = "/coders")
public List<Coder> coderList(){
return coderRepository.findAll();
}
//2.Post方式,增加程序员
@PostMapping(value = "/coders")
public Coder CoderAdd(@RequestParam("name")String name,@RequestParam("age")Integer age){
Coder coder = new Coder();
coder.setAge(age);
coder.setName(name);
return coderRepository.save(coder);
}
//3.通过id查询一个人
@GetMapping(value = "/coders/{id}")
public Coder CoderFindOne(@PathVariable("id")Integer id){
return coderRepository.findOne(id);
}
//4.通过id删除一个人
@DeleteMapping(value = "/coders/{id}")
public void CoderDelete(@PathVariable("id")Integer id){
coderRepository.delete(id);
}
//5.更新一个人,用Postman模拟的时候注意:用x-www-form-urlencoded
@PutMapping(value = "/coders/{id}")
public Coder CoderUpdateOne(@PathVariable("id")Integer id, @RequestParam("name") String name, @RequestParam("age")Integer age){
Coder coder = new Coder();
coder.setId(id);
coder.setName(name);
coder.setAge(age);
return coderRepository.save(coder);
}
//6.扩展Jpa接口,按照年龄查找
@GetMapping(value = "/coder/age/{age}")
public List<Coder> CoderFindAll(@PathVariable("age")Integer age){
return coderRepository.findByAge(age);
}
}
6. Реализуйте транзакции MySQL
- Сначала создайте новый класс службы: CoderService.
@Service
public class CoderService {
@Autowired
CoderRepository coderRepository;
@Transactional
public void insertTwo(){
Coder coderA = new Coder();
coderA.setAge(101);
coderA.setName("1");
coderRepository.save(coderA);
Coder coderB = new Coder();
coderB.setAge(102);
coderB.setName("102");
coderRepository.save(coderB);
}
}
- Автоматически загружать coderService в CoderController
@Autowired
private CoderService coderService;
- Вызов службы на CoderController.
//7.使用事务,同时插入两个人的数据
@PostMapping(value = "coder/two")
public void coderTwo(){
coderService.insertTwo();
}
7. Используйте@Query
Реализовать собственный sql-запрос
- существует
CoderRepository
Реализуйте следующий код
@Query("select p from Coder p where p.id = (select max(p2.id) from Coder p2)")
Coder getMaxIdCoder();
- существует
CoderController
используется вgetMaxIdCoder
метод
//8.自定义sql语句查询
@GetMapping(value = "/coder/find")
public Coder CoderFindByTask(){
return coderRepository.getMaxIdCoder();
}
5. Spring Boot MyBatis — единый источник данных
Mybatis на основе аннотаций на самом деле очень похож на JPA, но mybatis не обеспечивает операции автоматического создания таблиц. Jpa в этом плане лучше.
Моя демонстрационная программа на моем github:spring-boot-mybatis-mysql
Цитирую блог:
Spring Boot + MyBatis + интеграция с MySQL– Цзяньшу FlySheep_lyПрограммист ДД:Spring Boot интегрирует MyBatis
[Spring Boot中使用MyBatis注解配置详解](http://blog.didispace.com/mybatisinfo/)
1. Введите зависимости
<!-- 添加 MyBatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- 添加 MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
2. Настройте конфигурацию подключения mysql в application.properties.
spring.datasource.url=jdbc:mysql://localhost:3306/test01
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
3. Создайте объект сопоставления Пользователь
Что касается реализации сериализации, лучше всего ее реализовать.
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = -5554561712056198940L;
private Long id;
private String name;
private Integer age;
public User(){
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
4. Операция UserMapper для создания сопоставления пользователей.
Дополнительные сведения об операциях с Mapper см. на официальном сайте mybatis.
/**
* Created by nezha on 2017/4/26.
*/
@Mapper
public interface UserMapper {
/**
* 添加操作,返回新增元素的 ID
* @param User
*/
@Insert("insert into person(name,age) values(#{name},#{age})")
@Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id")
void insert(User user);
/**
* 查询所有
* @return
*/
@Select("select id,name,age from person")
List<User> selectAll();
@Select("SELECT * FROM USER WHERE NAME = #{name}")
User findByName(@Param("name") String name);
}
5. Вызовите тест
Это хорошая практика, чтобы найти стиль Restful, очень полезный и практичный.
@EnableTransactionManagement
@RestController
public class TestController {
@Autowired
private UserMapper userMapper;
@GetMapping(value = "/test/{name}")
public User findOne(@PathVariable("name")String name){
return userMapper.findByName(name);
}
}
Проблемы, которые могут возникнуть:
mybatis+spring boot, маппер подсказывает, что не удалось выполнить автоподключение. Постоянно сообщает, что не может быть загружен
- решение
Измените конфигурацию идеи и установите значение серьезности весны на «предупреждение» следующим образом:
Если вы хотите еще больше сузить область модификации:
Alt + Enter quick fix or change settings
Settings - Editor - Inspections - Spring - Spring Core - Code - Autowiring for Bean Class - warning
Вопросы о конфигурации с несколькими источниками:
1.Spring Boot интегрирует Mybatis для реализации нескольких источников данных Druid.
2.Самое простое решение для нескольких источников данных springboot + mybatis-springboot+mybatis%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%BA%90%E6%9C%80%E7%AE%80%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.html)
6. Spring Boot RabbitMQ
Моя демонстрационная программа:spring-boot-RabbitMQ
Начало работы с Spring Boot RabbitMQ— Эта статья хорошо написана, очень хорошо про три метода обмена RabbitMQ. Но код не очень лаконичен.
Подробное объяснение RabbitMQ-Подробное объяснение RabbitMQ.html)–Код статьи Pure smile очень лаконичен
установка и настройка
Три метода обмена RabbitMQ
1.Direct Exchange
Если ключ маршрутизации совпадает, то Сообщение будет доставлено в соответствующую очередь. На самом деле, когда очередь создается, она автоматически связывает обмен с именем очереди в качестве ключа маршрутизации.
2.Fanout Exchange
Просто привяжите очередь к обмену. Сообщение, отправленное на биржу, перенаправляется во все очереди, связанные с биржой. Как и при широковещании подсети, узлы в каждой подсети получают копию сообщения. Коммутаторы Fanout быстрее всего пересылают сообщения.
3.Topic Exchange
Сопоставьте ключ маршрутизации с шаблоном. На этом этапе очередь должна быть привязана к схеме. Символ "#" соответствует одному или нескольким словам, символ "" соответствует не более чем одному слову. Таким образом, "audit.#" соответствует "audit.irs.corporate", но "audit."
Пример объяснения
Есть три основных файла тремя способами:
1. конфигурация отправителя
2. Конфигурация приемника
3. Конфигурация rabbitConfig
Ниже у нас есть интуитивное ощущение и понимание RabbitMQ за счет интеграции RabbitMQ в приложение Spring Boot и реализации простого примера отправки и получения сообщений.
Интегрировать RabbitMQ в Spring Boot очень просто, потому что мы представили Starter POM ранее, и модуль AMQP может очень хорошо поддерживать RabbitMQ Давайте подробно поговорим о процессе интеграции:
1.pom введение зависимости
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2. Конфигурация подключения
spring.application.name=rabbitmq-hello
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
3. Создайте отправителя сообщения
Создайте отправителя отправителя сообщения. Сообщение отправляется путем внедрения экземпляра интерфейса AmqpTemplate. Интерфейс AmqpTemplate определяет набор основных операций для протокола AMQP. В Spring Boot его конкретная реализация внедряется в соответствии с конфигурацией. В этом производителе мы создадим строку и отправим ее в очередь с именем hello.
@Component
public class Sender {
@Autowired
AmqpTemplate amqpTemplate;
public void send() {
String context = "hello " + new Date();
System.out.println("Sender : " + context);
this.amqpTemplate.convertAndSend("hello", context);
}
}
4. Создайте получателя сообщений
Создайте получателя сообщения. Определите мониторинг очереди приветствия классом с помощью аннотации @RabbitListener и укажите метод обработки сообщения с помощью аннотации @RabbitHandler. Следовательно, потребитель реализует потребление очереди приветствий, а операция потребления представляет собой строковое содержимое выходного сообщения.
@Component
@RabbitListener(queues = "hello")
public class Receiver {
@RabbitHandler
public void process(String hello) {
System.out.println("Receiver1 : " + hello);
}
}
5. Создайте класс конфигурации RabbitMQ RabbitConfig
Создайте класс конфигурации RabbitMQ RabbitConfig для настройки расширенной информации, такой как очереди, коммутаторы и маршруты. Здесь мы сосредоточимся на начале работы и сначала определим его с минимальной конфигурацией, чтобы завершить базовый процесс производства и потребления.
@Configuration
public class RabbitConfig {
//1.配置一个名为hello的一对一的消息队列
@Bean
public Queue helloQueue() {
return new Queue("hello");
}
}
5. Модульное тестирование:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = HelloApplication.class)
public class HelloApplicationTests {
@Autowired
private Sender sender;
@Test
public void hello() throws Exception {
sender.send();
}
}
7. Spring Boot mongodb
Демонстрационная программа весенней загрузки mongodb:spring-boot-mongodb
установка и настройка
- Установка и настройка mongodb:Установите записи MongoDB через yum под CentOS 6.5
- Справочник по управлению пользователями:Конфигурация управления правами пользователей mongodb 3.2
- установка и настройка mongodb под Mac:Установите MongoDB на Mac
1. Войдите в оболочку mongodb: mongo
2. Переключение базы данных: используйте администратора
3. Добавляем пользователя, указываем роль пользователя и базу данных:
db.createUser(
{ user: "admin",
customData:{description:"superuser"},
pwd: "admin",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
user字段,为新用户的名字;
pwd字段,用户的密码;
cusomData字段,为任意内容,例如可以为用户全名介绍;
roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色。在roles字段,可以指定内置角色和用户定义的角色。
4. Просмотр созданных пользователей: показать пользователей или db.system.users.find()
5. Включите права пользователя:
Измените файл конфигурации и добавьте конфигурацию:
$ vim /etc/mongod.conf
security:
authorization: enabled
6. Перезапустите монгодб
sudo service mongod restart
7. Используйте учетную запись управления пользователями для входа и аутентификации.
use admin
db.auth('admin', 'admin')
8. Удаленный вход
mongo 123.xxx.xxx.xxx:27017/amdin -uadmin -padmin
Первый админ: обращается к базе данных
Второй админ: относится к имени пользователя
Третий админ: относится к паролю
интеграция весенней загрузки mongodb
1. Введите зависимости
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2. Создайте сохраненную сущность
Создайте сущность пользователя для хранения, включая атрибуты: идентификатор, имя пользователя, возраст
public class User {
@Id
private String id;
private String username;
private Integer age;
public User(String username, Integer age) {
// this.id = id;
this.username = username;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "username:"+username+"--age:"+age;
}
}
3. Реализовать объект доступа к данным пользователя
Реализовать объект доступа к данным пользователя: UserRepository
public interface UserRepository extends MongoRepository<User, String> {
User findByUsername(String username);
}
4. Настройте подключение к mongodb
#mongodb3.X的配置
spring.data.mongodb.uri=mongodb://admin:admin@123.206.xxx.xxx:27017/test
#mongodb2.x的配置
spring.data.mongodb.host=localhost spring.data.mongodb.port=27017
5. Вызовите модульные тесты
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test05ApplicationTests{
@Autowired
private UserRepository userRepository;
@Test
public void test() {
userRepository.deleteAll();
// 创建三个User,并验证User总数
userRepository.save(new User("didi", 30));
userRepository.save(new User("mama", 40));
userRepository.save(new User("kaka", 50));
Assert.assertEquals(3, userRepository.findAll().size());
// 删除一个User,再验证User总数
User u = userRepository.findByUsername("didi");
System.out.println(u.toString());
userRepository.delete(u);
Assert.assertEquals(2, userRepository.findAll().size());
}
}
проблемы
1. Выяснилось, что операция прошла успешно, но данные найти не удалось
В основном из-за моего собственного непонимания в базе данных mongodb есть коллекции (эквивалентные таблицам), тогда в каждой базе данных может быть несколько коллекций.
8. Spring Boot redis
Демонстрационная программа Redis:nezha/spring-boot-redis
- Конфигурация редиса:Установка и настройка Redis под CentOS6.5
- Redis открывает удаленное соединениеRedis открывает удаленный доступ
- удаленное подключение Redis
redis-cli -h 123.206.xxx.xxx -p 6379
1. Введите зависимости
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
2. Конфигурация параметров
# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=123.206.xxx.xxx
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=-1
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=16
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0
3. Тестовый доступ
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test04ApplicationTests {
@Autowired
StringRedisTemplate stringRedisTemplate;
@Test
public void test() throws Exception {
// 保存字符串
stringRedisTemplate.opsForValue().set("aaa", "111");
Assert.assertEquals("111", stringRedisTemplate.opsForValue().get("aaa"));
}
}
9. Задачи синхронизации Spring Boot
Демонстрационная программа запланированного задания:spring-boot-schedule
1. конфигурация пакета пом
Эта часть основных элементов запуска Spring Boot в порядке, нет специального пакета зависимостей
2. Стартовый класс позволяет рассчитывать время
@EnableScheduling
@SpringBootApplication
public class ScheduleApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduleApplication.class, args);
}
}
3. Создайте класс реализации задач на время
время задача один
/**
* Created by nezha on 2017/4/28.
*/
@Component
public class SchedulerTask {
private int count = 0;
@Scheduled(cron="*/6 * * * * ?")
private void process(){
System.out.println("this is scheduler task runing "+(count++));
}
}
задание на время два
/**
* Created by nezha on 2017/4/28.
*/
@Component
public class SchedulerTask2 {
private static SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 6000)
public void reportCurrentTime() {
System.out.println("现在时间:" + dateFormat.format(new Date()));
}
}
4. Описание параметра
@Scheduled
Параметр может принимать две настройки синхронизации, одна из которых обычно используетсяcron="*/6 * * * * ?"
, одинfixedRate = 6000
, оба из которых указывают, что содержимое печатается каждые шесть секунд.
фиксированная скорость Описание
-
@Scheduled(fixedRate = 6000)
: выполнить снова через 6 секунд после последней точки времени выполнения -
@Scheduled(fixedDelay = 6000)
: выполнить снова через 6 секунд после последней точки времени выполнения -
@Scheduled(initialDelay=1000, fixedRate=6000)
: Выполнять после первой задержки в 1 секунду, а затем выполнять каждые 6 секунд по правилам fixedRate
10. Технологии, связанные с Spring Boot
пользовательский значок
Пользовательский баннер Spring Boot- пользовательские иконки
Разверните весенний проект
1. Запускайте прямо в IntelliJ Idea
2.mvn spring-boot:run
3.mvn install >>> создаст файл jar и выполнит файл jar.
Как провести модульное тестирование при тестировании весенней загрузки
1. Используйте@SpringBootTest
Файлы в основном находятся в тестовом каталоге
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test05ApplicationTests{
@Autowired
private UserRepository userRepository;
@Test
public void test() {
userRepository.deleteAll();
// 创建三个User,并验证User总数
userRepository.save(new User("didi", 30));
userRepository.save(new User("mama", 40));
userRepository.save(new User("kaka", 50));
}
}
2. Используйте@SpringBootApplication
В основном каталоге com.nezha/
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private CustomerRepository repository;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) throws Exception {
repository.deleteAll();
// save a couple of customers
repository.save(new Customer("Alice", "Smith"));
repository.save(new Customer("Bob", "Smith"));
}
}
3. ИспользуйтеRestController
Этот метод очень удобен и прост в использовании, и я им иногда пользуюсь.