模拟@SpringBootApplication注解实现插件化开发
在我们使用SpringBoot以及SpringCloud的一系列组件(比如说Eureka)的时候,我们都是只需要添加注解@Enablexxx就可以引入对应的模块(对于EurekaServer仅需使用@EnableEurekaServer注解),非常方便快捷。这其实对于我们抽取一些通用的功能非常有利,避免了每次都要写或者复制同样的代码,提高开发效率。
在探究原理之后,我做了一个自己的实现。我们来看一下使用效果:
文章图片
使用效果图.png
文章图片
运行效果图.gif 我们来探究一下原理实现:
首先介绍一下Spring的JavaBean注解:
@Component
@Controller
@Service
@Configuration
@Import
@ImportResource
@Bean
此次略过介绍,有空再补
1. 创建一个Admin模块项目(SpringBoot项目),pom.xml如下
4.0.0 com.sanisy
admin-demo
0.0.1-SNAPSHOT jaradmin-demo
Demo project for Spring Boot org.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
项目目录结构如下
文章图片
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.0 com.dodo
enable-demo
0.0.1-SNAPSHOT jarenable-demo
Demo project for Spring Boot org.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
工程目录结构如下
文章图片
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);
}
}
推荐阅读
- SpringBoot调用公共模块的自定义注解失效的解决
- 生活与游戏日记(第182篇)(〔成长瞬间〕关注解决问题2019.10)
- Spring|Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
- 三门问题(蒙提霍尔悖论)分析与Golang模拟
- 投石机可连续抛射石头【Algodoo|投石机可连续抛射石头【Algodoo | 物理模拟】
- Spring注解驱动第十讲--@Autowired使用
- =======j2ee|spring用注解实现注入的@resource,@autowired,@inject区别
- Java代码辅助效率工具Lombok(注解|Java代码辅助效率工具Lombok(注解,自动生成代码)
- Spring注解05|Spring注解05 @Import 给容器快速导入一个组件
- Spring|Spring Aop常见注解与执行顺序详解