【金蝶天燕鲲鹏云最佳实践 三】springboot源码浅析(一)spring的手动装配

举报
davidaer 发表于 2020/02/08 14:32:09 2020/02/08
【摘要】 Spring Boot 简介 使用 Spring Boot 可以很容易地创建出能直接运行的独立的、生产级别的基于 Spring 的应用。我们对 Spring 平台和第三方类库有自己的考虑,因此您可以从最基本的开始。大多数 Spring Boot 应用只需要很少的 Spring 配置。 您可以使用 Spring Boot 来创建一个可以使用 java -jar 命令来运行或者基于传统的 war 包部

大纲

本次分享主要分为两个部分对springboot进行讲解:

1、讲解springboot的装配模式,为让大家更好的了解springboot源码打下基础。

2、对springboot源码进行解读,一步步的了解构造阶段和运行阶段springboot都做了哪些事儿。

spacer.gifblob.png


springboot的装配

想要更好的读懂springboot源码,首先需要了解springboot的装配,springboot的装配分为手动装配和自动装配两种方式,首先我们先从手动装配开始了解。

springboot的手动装配

  1. 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();

             

       }

       

}



日志输出:

blob.png

spacer.gif

说明新建ApusicController注解成功。

下节课给大家继续讲解springboot的模块装配。

谢谢大家!


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。