【金蝶天燕鲲鹏云最佳实践 三】springboot源码浅析(一)spring的手动装配
大纲
本次分享主要分为两个部分对springboot进行讲解:
1、讲解springboot的装配模式,为让大家更好的了解springboot源码打下基础。
2、对springboot源码进行解读,一步步的了解构造阶段和运行阶段springboot都做了哪些事儿。
springboot的装配
想要更好的读懂springboot源码,首先需要了解springboot的装配,springboot的装配分为手动装配和自动装配两种方式,首先我们先从手动装配开始了解。
springboot的手动装配
springboot的模式注解概念
定义:模式注解是一种用于声明在应用中扮演组件角色的注解
了解spring的同学应该知道模式注解,在spring框架中就有广泛的应用
@Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
@Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
@Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
@Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
@Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
用这些注解对应用进行分层之后,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。
注解 | 含义 |
@Component | 最普通的组件,可以被注入到spring容器进行管理 |
@Repository | 作用于持久层 |
@Service | 作用于业务逻辑层 |
@Controller | 作用于表现层(spring-mvc的注解) |
Controller注解源码
//表示他可以标注在什么地方,TYPE表示能注册到类上
@Target({ElementType.TYPE})
//保留的时机,即可以通过反射来加载相应的内容
@Retention(RetentionPolicy.RUNTIME)
//JavaDOC
@Documented
@Component
public @interface Controller {XX}
ElementType源码
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Formal parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
}
Service注解源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {XX}
Repository注解源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {XX}
从源码上看, @Service, @Controller, @Repositor都被@Component修饰,说明 @Service, @Controller, @Repositor都具备@Component的功能,类似于派生关系。
@Component
* @Controller :WEB层
* @Service :业务
* @Repository :持久层
2.自定义注解
我们下面通过建立一个自己命名的注解@ApusicController,深入了解下springboot的模式注解。
@Component
* @Controller :WEB层
@ApusicController:自定义@Controller注解
ApusicController.java源码
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Controller;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
public @interface ApusicController {
String value() default "";
}
DeomController.java源码
import com.sikiedu.springboot.annotation.ApusicController;
@ApusicController(value = "DeomController")
public class DeomController {
public void test() {
System.out.println("@ApusicController is ok!!!");
}
}
单元测试类源码
package com.example.demo;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import com.apusic.controller.DeomController;
//扫描包下的所有类,含有@component注解的类或者是其他就会变成bean
@ComponentScan(basePackages = "com.apusic.controller")
public class test {
public static void main(String[] args) {
//取得spring上下文对象
ConfigurableApplicationContext context = new SpringApplicationBuilder(DeomController.class).web(WebApplicationType.NONE).run(args);
//通过spring上下文对象获取bean的方法
DeomController bean = context.getBean("DeomController",DeomController.class);
bean.test();
context.close();
}
}
日志输出:
说明新建ApusicController注解成功。
下节课给大家继续讲解springboot的模块装配。
谢谢大家!
- 点赞
- 收藏
- 关注作者
评论(0)