如何使用 Spring *** oot 自定义 starter?

enzoys 14 0

make up for *** r水粉霜怎么用效果好?

水粉霜?我直接拿手上妆,或者用刷子上妆也可以。用海绵蛋上妆就都被海绵蛋吃走了。

Make X Starter传感器 1 Me Color Sensor

颜色传感器使用说明书

1.概述

Me Color Sensor 是一款可识别多种颜色的颜色传感器。可识别黑、黄、红、蓝、

绿、白六种颜色。本模块接口是蓝白色标,说明是 I2C 通信模式,需要连接到主

板上带有蓝白色标识接口。

2.产品特点

 模块的白 *** 域是与金属梁接触的参考区域;

 具有反接保护,电源反接不会损坏 IC;

 支持 Arduino IDE 编程, 并且提供运行库来简化编程;

 支持 m *** lock 图形化编程,适合全年龄用户;

 使用 RJ25 接口连线方便;

 模块化安装,兼容乐高系列

3.工作原理

生活中的可见光由红、绿、蓝三种基色光组成, *** 照射物体上因为表面性质

的差异产生对三种基色光不同程度的吸收, *** 反射 *** 。颜色传感器可检测

红蓝绿三基色的反射光强度来检测物体的颜色。

颜色传感器在检测不同颜色间的转换时间 160ms,也就是说传感器从检测一种

颜色切换到另外一种颜色,需要 0.16s 的反应时间。

4.常用连接方式

5.颜色传感器编程介绍

5.1 下载安装颜色传感器插件拓展

• 下载或者更新 m *** lock 版本到 v3.4.11(已安装可忽略)

m *** lock 3最新软件下载_m *** lock 3正式版下载_积木式编程软件下载-Make *** lock

安装拓展:

注意: 要安装 Make *** lock *** 的颜色传感器插件,如果有安装 Make *** lock HK

的插件,请删除 Make *** lock HK 插件。这两个插件不兼容。

下载颜色传感器插件

5.2 编程相关

下面是使用板载 LED 来显示颜色传感器所采集到的颜色:

• 注意事项

1、 各支队伍要根据场地情况将颜色传感器安装到适合的高度(建议高度范围:

1.5~3cm) 。

2、 由于受到外部环境 *** 的影响,各参赛队队员应培养利用编程来提高传感器

识别度的能力。

3、 一块主板仅支持一个颜色传感器运行。

4、 参考资料

深圳市创客工场科技有限公司.颜色传感器.

Open-so *** ce Arduino Ro *** ot *** uilding Platform|Make *** lock Learning Reso *** ce

玫珂菲(MAKE UP FOR EVER)妆前 *** 好用嘛?教你正确使用!

不得不说,就像挖到宝了的感觉。 *** 的绝了,好像又魔力~~纹消失术?

*** 的可以试一下,就挤一点出来在虎口上,虎口那个位置不是有纹路嘛,你就揉揉揉~~ *** 你会发现虎口上的纹不见了,超明显,超厉害!效果超好,怎么用呢?就是在你上妆之前,你把它揉在你毛孔粗大、鼻翼等地方, *** 再上粉底液。结果就是没有那种蜂窝感了,

这一支 *** 的专业彩妆师品牌做出来专业的东西。Makeup for *** r,这支yy ds!假如你是油皮,想要控油的话选择浅灰,它的控油和哑光效果非常明显,而且你的妆感会非常的清透。把它挤出来看它的质地是 *** ,像 *** 液一样的,感觉你轻轻一抹就可以了,就是像给你的肌肤做了精华的叠涂一样的感觉。

哪怕你涂完之后不压散粉,它都是可以帮你做到很好的控油,是不是很厉害?我爱了!很适合大油皮在夏天的时候使用,这就是灰色。深灰是隐匿毛孔,浅灰是完全控油,就是你是个油到不行的女孩儿,就全脸涂这个。

如果是局部有一些瑕疵, *** 如说泛红就选用绿色的。它是娇嫩肌肤,可以帮助大家去修饰掉你局部泛红的位置, *** 如说鼻头,包括女生脸颊都很容易泛红,你都可以用。这样用绿色的妆前 *** 先做好替代。 *** 再上粉底,它才会效果更明显。而且它质地很清润,很好推开。会让你的底妆更容易服帖。

如果想要全脸提亮就用蓝色。就是显示皮肤状态好的一支。蓝色是属于冷色调,可以帮助 *** 女生可能存在的一点泛黄和暗沉,你就用蓝色做到大面积的提亮,其实也是可以自然的,综合大家暗黄的肤色。用完之后,肌肤透亮的。整个皮肤就像是刚刚做完一个30分钟的养肤面膜,很像水光打完水光针之后那种感觉。

深灰色是毛孔粗大,适合不平滑的肌肤,浅灰色是帮你控油的,可以直接涂在你的鼻子和脸颊处的地方,绿色是帮你们调整肤色,解决肤色泛红的。 *** 蓝色是帮你们提亮肤色。用完之后女生皮肤状态变得非常好,白色和紫色也特别好,需要的美眉就自选啦~

如何使用 Spring *** oot 自定义 starter?

1. Spring *** oot Starter机制1.1 什么是Starter机制

Spring *** oot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其 *** 一集成进starter,应用者只需要在m *** en中引入starter依赖,Spring *** oot就能自动扫描到要加载的 *** 并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种 *** 的困扰。Spring *** oot会自动通过classpath路径下的类发现需要的 *** ean,并注册进IOC容器Spring *** oot提供了针对 *** 常企业应用研发各种场景的spring- *** oot-starter依赖模块。所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念。 *** 如我们在spring *** oot里面要引入redis,那么我们需要在pom中引入以下内容:

*** lt;dependency *** gt; *** lt;groupId *** gt;org.springframework. *** oot *** lt;/groupId *** gt; *** lt;artifactId *** gt;spring- *** oot-starter-data-redis *** lt;/artifactId *** gt; *** lt;/dependency *** gt;

这其实就是一个starter。简而言之,starter就是一个外部的项目,我们需要使用它的时候就可以在当前spring *** oot项目中引入它。

1.2 为什么要定义Starter

在我们的 *** 常开发工作中,经常会有一些 *** 于业务之外的配置模块,我们经常将其放到一个特定的包下, *** 如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。如果我们将这些可 *** 于业务代码之外的功配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可,再由Spring *** oot为我们完成自动装配,就非常轻松了。

2. 自定义Starter2.1 自定义Starter命名规则

Spring *** oot提供的starter以 spring- *** oot-starter-xxx 的方式命名的。 *** 建议自定义的starter使用 xxx-spring- *** oot-starter 命名规则。以区分Spring *** oot生态提供的starter。

2.2 自定义Starter实现自定义Starter(1) 新建m *** en jar工程,工程名为custom-spring- *** oot-starter,导入依赖:

*** lt;dependencies *** gt; *** lt;dependency *** gt; *** lt;groupId *** gt;org.springframework. *** oot *** lt;/groupId *** gt; *** lt;artifactId *** gt;spring- *** oot-autoconfig *** e *** lt;/artifactId *** gt; *** lt;version *** gt;2.2.9.RELEASE *** lt;/version *** gt; *** lt;/dependency *** gt; *** lt;/dependencies *** gt;

(2) 编写自定义 *** ean: CustomSimple *** ean

@Ena *** leConfig *** ationProperties(CustomSimple *** ean.class) @Config *** ationProperties(prefix = *** #34;custom *** #34;) pu *** lic class CustomSimple *** ean { private int id; private String name; pu *** lic int getId() { ret *** n id; } pu *** lic void setId(int id) { this.id = id; } pu *** lic String getName() { ret *** n name; } pu *** lic void setName(String name) { this.name = name; } @Override pu *** lic String toString() { ret *** n *** #34;CustomSimple *** ean{ *** #34; + *** #34;id= *** #34; + id + *** #34;, name= *** #39; *** #34; + name + *** #39;\ *** #39; *** #39; + *** #39;} *** #39;; } }

(3) 编写配置类CustomAutoConfig *** ation

@Config *** ation pu *** lic class CustomAutoConfig *** ation { static { *** .out.println( *** #34;CustomAutoConfig *** ation init.... *** #34;); } @ *** ean pu *** lic CustomSimple *** ean customSimple *** ean(){ ret *** n new CustomSimple *** ean(); } }

(4) reso *** ces下创建/META-INF/spring.factories

上面这句话的意思就是Spring *** oot启动的时候会去加载我们的 *** *** ean到IOC容器中。这其实是一种变形的SPI机制。

2. 使用Starter(1) 导入自定义Starter的依赖

*** lt;dependency *** gt; *** lt;groupId *** gt;com.lagou *** lt;/groupId *** gt; *** lt;artifactId *** gt;custom-spring- *** oot-starter *** lt;/artifactId *** gt; *** lt;version *** gt;1.0-SNAPSHOT *** lt;/version *** gt; *** lt;/dependency *** gt;

(2) 配置属性

custom.id=1 custom.name=Custom starter

(3) 自定义 *** 类进行 ***

@RunWith(SpringRunner.class) @Spring *** oot *** pu *** lic class CustomStarter *** { @Autowired private CustomSimple *** ean customSimple *** ean; @ *** pu *** lic void customSimple *** ean *** (){ *** .out.println(customSimple *** ean); } }

运行结果:

但此处还有一个问题,如果有一天我们不想要启动工程的时候自动装配Simple *** ean呢?你可能会想,那就去pom中把依赖注释掉,的确,这是一种方案,但为免有点Low。下面说到热插拔技术。

2.3 热插拔技术

我们经常会在启动类Application上面加@Ena *** leXXX注解,其实这个@Ena *** lexxx注解就是一种热拔插技术,加了这个注解就可以启动对应的starter,当不需要对应的starter的时候只需要把这个注解注释掉就行,这就显得很优雅了。(1) 新增标记类Confi *** arker

pu *** lic class Confi *** arker { }

(2) 新增Ena *** leRegister *** 注解

@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Import({Confi *** arker.class}) pu *** lic @inte *** ce Ena *** leRegister *** { }

(3) 改造 CustomAutoConfig *** ation 新增条件注解 @ConditionalOn *** ean(Confi *** arker.class) ,@ConditionalOn *** ean 这个是条件注解,前面的意思代表只有当期上下文中含有 Confi *** arker对象,被标注的类才会被实例化。

@Config *** ation @ConditionalOn *** ean(Confi *** arker.class) pu *** lic class CustomAutoConfig *** ation { static { *** .out.println( *** #34;CustomAutoConfig *** ation init.... *** #34;); } @ *** ean pu *** lic CustomSimple *** ean customSimple *** ean(){ ret *** n new CustomSimple *** ean(); } }

(4) 在启动类上新增@Ena *** leImRegister *** 注解

@Spring *** ootApplication @Ena *** leRegister *** pu *** lic class Spring *** ootMy *** Application { pu *** lic static void main(String[] args) { SpringApplication.run(Spring *** ootMy *** Application.class, args); } }

到此热插拔就实现好了,当你加了 @Ena *** leImRegister *** 的时候启动zdy工程就会自动装配CustomSimple *** ean,反之则不装配。原理也很简单,当加了 @Ena *** leImRegister *** 注解的时候,由于这个注解使用了@Import({Confi *** arker.class}) ,所以会导致Spring去加载 Confi *** arker 到上下文中,而又因为条件注解 @ConditionalOn *** ean(Confi *** arker.class) 的存在,所以CustomAutoConfig *** ation 类就会被实例化。

附上条件注解的的讲解@ConditionalOn *** ean:仅仅在当前上下文中存在某个对象时,才会实例化一个 *** ean。@ConditionalOnClass:某个class位于类路径上,才会实例化一个 *** ean。@ConditionalOnExpression:当表达式为true的时候,才会实例化一个 *** ean。基于SpEL表达式的条件判断。@ConditionalOnMissing *** ean:仅仅在当前上下文中不存在某个对象时,才会实例化一个 *** ean。@ConditionalOnMissingClass:某个class类路径上不存在的时候,才会实例化一个 *** ean。@ConditionalOnNotWe *** Application:不是we *** 应用,才会实例化一个 *** ean。@ConditionalOnWe *** Application:当项目是一个We *** 项目时进行实例化。@ConditionalOnNotWe *** Application:当项目不是一个We *** 项目时进行实例化。@ConditionalOnProperty:当指定的属性有指定的值时进行实例化。@ConditionalOnJ *** a:当JVM版本为指定的版本范围时触发实例化。@ConditionalOnReso *** ce:当类路径下有指定的资源时触发实例化。@ConditionalOnJndi:在JNDI存在的条件下触发实例化。@ConditionalOnSingleCandidate:当指定的 *** ean在容器中只有一个,或者有多个但是指定了首选的 *** ean时触发实例化

上一篇台北选手孙家闳夺金:“我爱你,中国!”岛内感觉…

下一篇当前文章已是最新一篇了