模拟@SpringBootApplication注解实现插件化开发

在我们使用SpringBoot以及SpringCloud的一系列组件(比如说Eureka)的时候,我们都是只需要添加注解@Enablexxx就可以引入对应的模块(对于EurekaServer仅需使用@EnableEurekaServer注解),非常方便快捷。这其实对于我们抽取一些通用的功能非常有利,避免了每次都要写或者复制同样的代码,提高开发效率。
在探究原理之后,我做了一个自己的实现。我们来看一下使用效果:

模拟@SpringBootApplication注解实现插件化开发
文章图片
使用效果图.png
模拟@SpringBootApplication注解实现插件化开发
文章图片
运行效果图.gif 我们来探究一下原理实现:
首先介绍一下Spring的JavaBean注解:
@Component
@Controller
@Service
@Configuration
@Import
@ImportResource
@Bean
此次略过介绍,有空再补
1. 创建一个Admin模块项目(SpringBoot项目),pom.xml如下

4.0.0com.sanisy admin-demo 0.0.1-SNAPSHOTjaradmin-demo Demo project for Spring Bootorg.springframework.boot spring-boot-starter-parent 2.0.1.RELEASE UTF-8UTF-8 1.8 org.springframework.boot spring-boot-starter-freemarker org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.apache.maven.plugins maven-source-plugin 2.2.1

项目目录结构如下

模拟@SpringBootApplication注解实现插件化开发
文章图片
Admin模块整体结构.png
LoginController代码
package com.sanisy.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; /** * Created by Sanisy on 2018/4/30. */ @Slf4j @Controller @RequestMapping(value = "https://www.it610.com/admin/login") public class LoginController {/** * 登录页 */ @Value("${login.page}") private String loginPage; /** * 登录页 * @return */ @RequestMapping(value = "https://www.it610.com/page") public String loginPage() { log.info("This is login page:{}", loginPage); return loginPage; }/** * 用户登录 * @param userName * @param password * @return */ @RequestMapping(value = "https://www.it610.com/login", method = RequestMethod.POST) @ResponseBody public String login(String userName, String password) { if (!"admin".equals(userName) || !"123456".equals(password)) { log.info("login fail,userName={},password={}", userName, password); return "login fail:userName or password error!!!"; }return "login success, welcome to come here!"; } }

AdminAutoConfiguration代码
package com.sanisy.annotations; import org.springframework.context.annotation.ComponentScan; /** * Created by Sanisy on 2018/5/1. */ @ComponentScan(basePackages = { "com.sanisy", "com.sanisy.controller", }) public class AdminAutoConfiguration { }

EnableAdminDemo代码
package com.sanisy.annotations; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by Sanisy on 2018/4/30. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Configuration @Import(AdminAutoConfiguration.class) public @interface EnableAdminDemo {}

【模拟@SpringBootApplication注解实现插件化开发】以上代码完成后执行maven命令:
1.将项目打包成jar包:mvn clean install 2.将jar包部署到本地maven仓库:mvn install:install-file -Dfile=E:\Study\Workspaces\Idea\admin-demo\target\admin-demo-0.0.1-SNAPSHOT.jar -DgroupId=com.sanisy -DartifactId=admin-demo -Dversion=2.0.2 -Dpackaging =jar

2. 使用Admin模块
创建一个新的SpringBoot项目(这里是enable-demo),pom.xml文件如下
4.0.0com.dodo enable-demo 0.0.1-SNAPSHOTjarenable-demo Demo project for Spring Bootorg.springframework.boot spring-boot-starter-parent 2.0.1.RELEASE UTF-8UTF-8 1.8 org.springframework.boot spring-boot-starter-freemarker org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools runtime org.springframework.boot spring-boot-starter-test test org.projectlombok lombok true com.sanisy admin-demo 2.0.2 org.springframework.boot spring-boot-maven-plugin

工程目录结构如下

模拟@SpringBootApplication注解实现插件化开发
文章图片
enable-demo目录结构.png
通过 @EnableAdminDemo注解使用Admin模块
package com.dodo; import com.sanisy.annotations.EnableAdminDemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableAdminDemo public class EnableDemoApplication {public static void main(String[] args) { SpringApplication.run(EnableDemoApplication.class, args); } }

    推荐阅读