在我們使用SpringBoot以及SpringCloud的一系列組件(比如說Eureka)的時(shí)候,我們都是只需要添加注解@Enablexxx就可以引入對應(yīng)的模塊(對于EurekaServer僅需使用@EnableEurekaServer注解),非常方便快捷拆座。這其實(shí)對于我們抽取一些通用的功能非常有利霜运,避免了每次都要寫或者復(fù)制同樣的代碼代乃,提高開發(fā)效率办龄。
在探究原理之后,我做了一個(gè)自己的實(shí)現(xiàn)敌卓。我們來看一下使用效果:
使用效果圖.png
運(yùn)行效果圖.gif
我們來探究一下原理實(shí)現(xiàn):
首先介紹一下Spring的JavaBean注解:
@Component
@Controller
@Service
@Configuration
@Import
@ImportResource
@Bean
此次略過介紹,有空再補(bǔ)
1. 創(chuàng)建一個(gè)Admin模塊項(xiàng)目(SpringBoot項(xiàng)目)荸哟,pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sanisy</groupId>
<artifactId>admin-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>admin-demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
</plugin>
</plugins>
</build>
</project>
項(xiàng)目目錄結(jié)構(gòu)如下
Admin模塊整體結(jié)構(gòu).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 = "/admin/login")
public class LoginController {
/**
* 登錄頁
*/
@Value("${login.page}")
private String loginPage;
/**
* 登錄頁
* @return
*/
@RequestMapping(value = "/page")
public String loginPage() {
log.info("This is login page:{}", loginPage);
return loginPage;
}
/**
* 用戶登錄
* @param userName
* @param password
* @return
*/
@RequestMapping(value = "/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 {
}
以上代碼完成后執(zhí)行maven命令:
1.將項(xiàng)目打包成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模塊
創(chuàng)建一個(gè)新的SpringBoot項(xiàng)目(這里是enable-demo)假哎,pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dodo</groupId>
<artifactId>enable-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>enable-demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--引入Admin模塊依賴-->
<dependency>
<groupId>com.sanisy</groupId>
<artifactId>admin-demo</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
工程目錄結(jié)構(gòu)如下
enable-demo目錄結(jié)構(gòu).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);
}
}