springBoot学习(三)springBoot事件监听和部分注解的运用
@ConfigurationProperties注解的使用
用处
- 根据类型校验和管理application中的bean
举例使用
application.properties的内容
test.name=default
test.age=19
test.friends[0]=Ben
test.friends[1]=Alice
test.utils[0]=DateUtils
test.utils[1]=TimeUtils
新建TestProperties用来接收配置的内容
package com.yxj.spring.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
/**
* @ProjectName: springBootDemo
* @Package: com.yxj.spring.properties
* @Description: @ConfigurationProperties(prefix="test"),该注解会自动,将配置文件前缀是test的各项,加载至该bean中
* @Author: 阿杰
* @CreateDate: 2019/1/23 20:00
* @UpdateUser: 暂无
* @UpdateDate: 2019/1/23 20:00
* @UpdateRemark: The modified content
* @Version: 1.0
*/
@ConfigurationProperties(prefix="test")
public class TestProperties {
private String age;
private String name;
private String[] friends;
private List<String> utils;
public String[] getFriends() {
return friends;
}
public TestProperties setFriends(String[] friends) {
this.friends = friends;
return this;
}
public String getAge() {
return age;
}
public TestProperties setAge(String age) {
this.age = age;
return this;
}
public String getName() {
return name;
}
public TestProperties setName(String name) {
this.name = name;
return this;
}
public List<String> getUtils() {
return utils;
}
public TestProperties setUtils(List<String> utils) {
this.utils = utils;
return this;
}
@Override
public String toString() {
return "TestProperties{" +
"age='" + age + ''' +
", name='" + name + ''' +
", friends=" + Arrays.toString(friends) +
", utils=" + utils +
'}';
}
}
springboot启动类
package com.yxj.spring;
import com.yxj.spring.properties.TestProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;
import java.util.List;
/**
* @ProjectName: springBootDemo
* @Package: com.yxj.spring
* @Description:
* @Author: 阿杰
* @CreateDate: 2019/1/18 20:18
* @UpdateUser: 暂无
* @UpdateDate: 2019/1/18 20:18
* @UpdateRemark: The modified content
* @Version: 1.0
*/
@Import(TestProperties.class)
@SpringBootApplication
public class SpringBootTestRun {
/**
* getBeansOfType(MakeApp.class)会装配bean类型是MakeApp的所有实例
* @param args
*/
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringBootTestRun.class, args);
System.out.println("------------------分割线------------------");
System.out.println(run.getBean(TestProperties.class));
}
}
测试结果
------------------分割线------------------
TestProperties{age='19', name='default', friends=[Ben, Alice], utils=[DateUtils, TimeUtils]}
注意:
- @ConfigurationProperties(prefix="test"),该注解会自动,将配置文件前缀是test的各项,加载至该bean中
- 需要给定各个属性值的get,set方法
- 名字需要与配置项的key值对应
- 可以加载数组,集合
- 需要@Component注解或者其他方式将该类交由spring管理
@EnableAutoConfiguration注解的使用
解析
1.springBoot启动类会使用@SpringBootApplication 2.点进入源代码发现改注解是一个复合注解,由好几个注解共同组合而成
- @SpringBootConfiguration标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
- @EnableAutoConfiguration,自动配置注解,自动载入应用程序所需的所有Bean
- @ComponentScan:默认扫描@SpringBootApplication所在类的同级目录以及它的子目录。这也就是springBoot启动类建立在项目根目录的原因
尝试
package com.yxj.spring;
import com.yxj.spring.properties.TestProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;
import java.util.List;
/**
* @ProjectName: springBootDemo
* @Package: com.yxj.spring
* @Description:
* @Author: 阿杰
* @CreateDate: 2019/1/18 20:18
* @UpdateUser: 暂无
* @UpdateDate: 2019/1/18 20:18
* @UpdateRemark: The modified content
* @Version: 1.0
*/
@Import(TestProperties.class)
@SpringBootApplication
public class SpringBootTestRun {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(SpringBootTestRun.class, args);
System.out.println("------------------分割线------------------");
System.out.println(run.getBean(TestProperties.class));
}
}
输出结果
------------------分割线------------------
TestProperties{age='19', name='default', friends=[Ben, Alice], utils=[DateUtils, TimeUtils]}
总结
将@SpringBootApplication替换为@EnableAutoConfiguration,还是能正常输出spring管理的bean对象 @EnableAutoConfiguration注解导入了AutoConfigurationImportSelector类,最终的接口类是ImportSelector 源代码注释解释了,ImportSelector 该接口的方法的返回值都会被纳入到spring容器管理中 ImportSelector的具体使用与自定义,可以查看大佬博客https://blog.csdn.net/weixin_34452850/article/details/82883033
springBoot事件监听
步骤
- 自定义事件,一般是继承ApplicationEvent抽象类
- Spring的事件监听器接口,所有的监听器都实现了ApplicationListener接口
- 发布事件
代码实现
定义自定义事件
package com.yxj.spring.monitor;
import org.springframework.context.ApplicationEvent;
/**
* @ProjectName: springBootDemo
* @Package: com.yxj.spring.monitor
* @Description: 定义事件
* @Author: 阿杰
* @CreateDate: 2019/1/23 22:16
* @UpdateUser: 暂无
* @UpdateDate: 2019/1/23 22:16
* @UpdateRemark: The modified content
* @Version: 1.0
*/
public class MyEvent extends ApplicationEvent {
/**
* Create a new ApplicationEvent.
*
* @param source the object on which the event initially occurred (never {@code null})
*/
public MyEvent(String source) {
super(source);
}
}
定义事件监听器
package com.yxj.spring.monitor;
import org.springframework.context.ApplicationListener;
/**
* @ProjectName: springBootDemo
* @Package: com.yxj.spring.monitor
* @Description: 定义事件监听器
* @Author: 阿杰
* @CreateDate: 2019/1/23 22:18
* @UpdateUser: 暂无
* @UpdateDate: 2019/1/23 22:18
* @UpdateRemark: The modified content
* @Version: 1.0
*/
public class MyApplicationListener implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent event) {
System.out.println("接收到事件:"+event.getClass());
}
}
springBoot启动类
package com.yxj.spring;
import com.yxj.spring.monitor.MyApplicationListener;
import com.yxj.spring.monitor.MyEvent;
import com.yxj.spring.properties.TestProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;
import java.util.List;
/**
* @ProjectName: springBootDemo
* @Package: com.yxj.spring
* @Description:
* @Author: 阿杰
* @CreateDate: 2019/1/18 20:18
* @UpdateUser: 暂无
* @UpdateDate: 2019/1/18 20:18
* @UpdateRemark: The modified content
* @Version: 1.0
*/
@Import(TestProperties.class)
@SpringBootApplication
public class SpringBootTestRun {
public static void main(String[] args) {
ApplicationListener myApplicationListener = new MyApplicationListener();
MyEvent myEvent = new MyEvent("");
SpringApplication springBootTestRun = new SpringApplication(SpringBootTestRun.class);
springBootTestRun.addListeners(myApplicationListener);
ConfigurableApplicationContext run = springBootTestRun.run(args);
run.publishEvent(myEvent);
run.close();
}
}
测试结果
接收到事件:class com.yxj.spring.monitor.MyEvent
重点
将监听器添加至spring容器管理几种方式 1.springBootTestRun.addListeners(myApplicationListener); 2.在类上面加入@Component注解,@Service等注解 3.在application.properties添加参数context.listener.classes=监听器类的项目全路径 4.通过@Eventlistener注解,方法参数为监听的类ApplicationEvent或者其子类,一些自定义的监听器,或者springBoot系统启动时加载初始化信息等都可以通过ApplicationEvent+改变参数来实现监听
- flex布局——回顾
- WordPress 网站开发“微信小程序”实战(五)
- Windows Runtime(WinRT) 揭秘
- WeApp-Workflow: 基于Gulp 的微信小程序前端开发工作流
- 如何安装Windows Phone SDK 7.1 Release Candidate (RC)
- 微信与支付宝回应央行新规:认同央行规范!
- Gulp 工作流中Sass 增量编译功能的探索
- Sass与Compass——回顾
- 苹果就“降速门”致歉;央行批扫码支付不正当竞争;王健林旗下公司遭集体裁员
- 姚期智教授:量子计算是千亿万亿级别的产业,或成为科技创新的引擎
- Powershell中禁止执行脚本解决办法
- 使用AsyncTask异步更新UI界面及原理分析
- 商家为何要做小程序?
- Android中关于dip和px以及转换的总结
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 浙大版《C语言程序设计(第3版)》题目集 习题5-6 使用函数输出水仙花数
- 浙大版《C语言程序设计(第3版)》题目集 习题5-7 使用函数求余弦函数的近似值
- 浙大版《C语言程序设计(第3版)》题目集 习题6-1 分类统计字符个数
- 微信群总是有人发广告?看我用Python写一个自动化机器人消灭他!
- 浙大版《C语言程序设计(第3版)》题目集 习题6-2 使用函数求特殊a串数列和
- 浙大版《C语言程序设计(第3版)》题目集 习题6-4 使用函数输出指定范围内的Fibonacci数
- 浙大版《C语言程序设计(第3版)》题目集 习题6-5 使用函数验证哥德巴赫猜想
- Linux Used内存到底哪里去了?
- 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数
- 浙大版《C语言程序设计(第3版)》题目集 练习8-2 计算两数的和与差
- SQL查找是否"存在",别再count了!
- 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母
- 超赞!墙裂推荐这款开源、轻量无 Agent 自动化运维平台
- 详解Docker中Image、Container与 Volume 的迁移
- 浙大版《C语言程序设计(第3版)》题目集 习题8-1 拆分实数的整数与小数部分