什么是WEB项目

web项目是指服务端部署在服务器上,客户端使用浏览器通过网络传输进行访问获取数据的项目。通常我们看见的应用页面网站等等都可以称之为web项目。
在web项目的开发中可分为web前端开发和web后端开发
web前端:即是客户端能看得见碰得着得东西。包括Web页面结构、页面样式外观以及Web层面得交互展现。
前端特点:页面视觉效果良好(客户第一)、Web页面交互流畅(客户第一)、适应浏览器(客户第一)

web后端:与数据库进行交互获取数据及相关数据处理的业务逻辑(用参数控制数据库的逻辑)。
后端特点:功能实现及优化、数据存取效率、平台的稳定性与性能

了解自动配置
  • 自动配置好Tomcat
    引入依赖

  • 自动配置SpringMVC

    ​ 引入SpringMVC全套组件
    ​ 自动配好SpringMVC常用组件

  • 自动配置Web常见功能

    ​ SpringBoot帮我们配置好了所有web开发的常见场景

  • 默认包结构
    主程序所在包机器下面的所有自爆里面的组件都会被默认扫描进来
    无需以前的包扫描配置
    想要改变扫描路径,

  • @SpringBootApplication(scanBasePackages = "com.maggie")
    或者
    @ComponentScan("com.maggie")
    
  • 各种配置拥有的默认值
    默认配置最终都是映射到MultipartProperties
    配置文件的值最终会绑定在每个类上,这个类会在容器中创建对象

  • 按需加载所有自动配置项
    非常多的starter
    引入了那些场景这个场景的自动配置才会开启
    SprignBoot所有的自动配置功能都在spring-boot-autoconfigure包里面

@SpringBootConfiguration //
@EnableAutoConfiguration
@ComponentScan
//============以上三个注解等于
@SpringBootApplication
启动类注解 - @SpringBootApplication
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
@Target

元注解,此说明注解的作用目标,默认值为任何元素。

被此注解修饰的注解将只能作用在成员字段上,不能用于修饰方法或者类。

  • ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上
  • ElementType.FIELD:允许作用在属性字段上
  • ElementType.METHOD:允许作用在方法上
  • ElementType.PARAMETER:允许作用在方法参数上
  • ElementType.CONSTRUCTOR:允许作用在构造器上
  • ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上
  • ElementType.ANNOTATION_TYPE:允许作用在注解上
  • ElementType.PACKAGE:允许作用在包上
@Retention

元注解,用来表示注解的[生命周期].

描述作用范围
RetentionPolicy.SOURCE只保留在源文件,当编译成class文件,就会消失源文件
RetentionPolicy.CLASS保留到class文件,但是jvm加载class文件时被遗弃,默认生命周期class文件
RetentionPolicy.RUNTIME保存到class文件,jvm加载class文件后,仍然存在运行时也存在

上面三种类型生命周期:SOURCE<CLASS<RUNTIME

@Documented

元注解,可以修饰其他注解。

@Inherited

被 @Inherited 注解修饰的注解,如果作用于某个类上,其子类是可以继承的该注解的。反之,如果一个注解没有被 @Inherited注解所修饰,那么他的作用范围只能是当前类,其子类是不能被继承的。

@SpringBootConfiguration

支持JavaConfig的方式来进行配置(使用Configuration配置类等同于XML文件)

@ComponentScan

默认是扫描当前类下的package

@EnableAutoConfiguration

开启自动配置功能,帮助我们自动载入应用程序所需要的所有默认配置

常用注解
@Configuration

声明这是一个配置类 === 配置文件

  1. 配置类里面使用@Bean标注在方法上,给容器注册组件,默认单实例

  2. 配置类本身也是组件

  3. proxyBeanMethods属性:代理bean的方法,
    没有组件依赖的一般情况 proxyBeanMethods = true (full模式)

    如果

    存在组件依赖时可设置为 false。使其产生的组件对象为非单实例。(lite模式)

    full模式()proxyBeanMethods = true代理对象调用方法,SpringBoot总会检查这个组件是否在容器保持组件单实例
    lite模式(轻量级模式)proxyBeanMethods = false关闭代理模式,创建对象的方式,
@Bean

给容器添加组件(如果是一个jar包第三方库要加入IOC容器的话),以方法名为组件id,返回类型是组件类型,返回的值是组件在容器中的实例。默认情况为单实例。

value :用来修改被标注bean在IOC容器中的id属性。

name : 用来修改被标注bean在IOC容器中的name属性。

initMethod :指定初始化方法 相当于xml文件中 init-method 。(定义在实体类中的方法)

destroyMethod:指定销毁的方法 :相当于xml文件中destroy-method属性。(定义在实体类中的方法)

package com.maggie.demo.entity;
import lombok.Data;

/**
 * 用户实体类
 */
@Data
public class User {

    private String userName;
    private String pwd;

    public  void init(){
        System.out.println("hello>>>>>>>>>>>>>>");
    }

    private void destroy() {      System.out.println("destroy>>>>>>>>>>>>>>>>>>>");
    }
}

//

package com.maggie.demo.config;

import com.maggie.demo.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration //配置类注解 ==配置文件
public class BeansConfiguration {
    
    @Bean(value = "user0001",initMethod = "init",destroyMethod = "destroy")
    public User  usersss (){
        return new User();
    }   
}

与@Bean搭配使用的注解

@Profile @Scope @Lazy

@DependsOn @Primary

@Profile

作用是把一些meta-data进行分类,分成Active和InActive这两种状态,然后你可以选择在active 和在Inactive这两种状态下配置bean,在Inactive状态通常的注解有一个!操作符,通常写为:@Profile(“!p”),这里的p是Profile的名字。

eg:

@Configuration
public class DataSourceConfiguration {

    @Bean
    @Profile("DEV")
    public DataSource devDataSource() {
        // ... 单机 MySQL
    }

    @Bean
    @Profile("PROD")
    public DataSource prodDataSource() {
        // ... 集群 MySQL
    }
    
}

此处与配置文件中此处一样

spring:
  profiles:
    active: dev

@Scope

bean的范围从单例更改为指定的范围

value的属性值

singleton单实例的(单例)(默认)全局有且仅有一个实例
prototype多实例的(多例)每次获取Bean的时候会有一个新的实例
reqeust同一次请求每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
session同一个会话级别每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效

**@Lazy **

表明一个bean 是否延迟加载,可以作用在方法上,表示这个方法被延迟加载;可以作用在@Component (或者由@Component 作为原注解) 注释的类上,表明这个类中所有的bean 都被延迟加载。

@Primary

指示当多个候选者有资格自动装配依赖项时,应优先考虑bean。此注解在语义上就等同于在Spring XML中定义的bean 元素的primary属性

使用方式:

  • 与@Bean 一起使用,定义在方法上,方法级别的注解
  • 与@Component 一起使用,定义在类上,类级别的注解

@DependsOn

会在创建此bean之前强制创建特定的其他bean,以及该bean通过直接引用表示的任何依赖关系,这通常对单例启动很有帮助。

创建Bean实例 @Component(组件) @Controller(控制器) @Service(业务逻辑组件) @Repository(数据库层组件)
@ComponentScan 包扫描

作用:用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类注册到IOC容器中。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    /**
     * 对应的包扫描路径 可以是单个路径,也可以是扫描的路径数组
     * @return
     */
    @AliasFor("basePackages")
    String[] value() default {};
    /**
     * 和value一样是对应的包扫描路径 可以是单个路径,也可以是扫描的路径数组
     * @return
     */
    @AliasFor("value")
    String[] basePackages() default {};
    /**
     * 指定具体的扫描的类
     * @return
     */
    Class<?>[] basePackageClasses() default {};
    /**
     * 对应的bean名称的生成器 默认的是BeanNameGenerator
     * @return
     */
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
    /**
     * 处理检测到的bean的scope范围
     */
    Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;
    /**
     * 是否为检测到的组件生成代理
     * Indicates whether proxies should be generated for detected components, which may be
     * necessary when using scopes in a proxy-style fashion.
     * <p>The default is defer to the default behavior of the component scanner used to
     * execute the actual scan.
     * <p>Note that setting this attribute overrides any value set for {@link #scopeResolver}.
     * @see ClassPathBeanDefinitionScanner#setScopedProxyMode(ScopedProxyMode)
     */
    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
    /**
     * 控制符合组件检测条件的类文件   默认是包扫描下的  **/*.class
     * @return
     */
    String resourcePattern() default ClassPathScanningCandidateComponentProvider.DEFAULT_RESOURCE_PATTERN;
    /**
     * 是否对带有@Component @Repository @Service @Controller注解的类开启检测,默认是开启的
     * @return
     */
    boolean useDefaultFilters() default true;
    /**
     * 指定某些定义Filter满足条件的组件 FilterType有5种类型如:
     *                                  ANNOTATION, 注解类型 默认
                                        ASSIGNABLE_TYPE,指定固定类
                                        ASPECTJ, ASPECTJ类型
                                        REGEX,正则表达式
                                        CUSTOM,自定义类型
     * @return
     */
    Filter[] includeFilters() default {};
    /**
     * 排除某些过来器扫描到的类
     * @return
     */
    Filter[] excludeFilters() default {};
    /**
     * 扫描到的类是都开启懒加载 ,默认是不开启的
     * @return
     */
    boolean lazyInit() default false;
}
@Import

只能作用在类上,通过快速导入的方式实现把实例加入spring的Ioc容器中

使用方法

1.直接填class数组方式

@Import({ 类名.class , 类名.class... })
public class TestDemo {

}

2-ImportSelector方式

此方法前提是创建一个类要实现ImportSelector接口,并重写selectImports()f方法

//第一步:创建Myclass类并实现ImportSelector接口,这里用于演示就添加一个全类名给其返回值

public class Myclass implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.yc.Test.TestDemo3"};
    }
}
//第二步:使用ImportSelector方式的Myclass类

@Import({Myclass.class})

分析实现接口的selectImports方法:

1-返回值:就是我们要导入到容器中的组件全类名

2-参数: AnnotationMetadata表示当前被@Import注解给标注的所有注解信息,需要注意的是selectImports方法可以返回空数组但是不能返回null,否则会报空指针异常!

@Conditional

作用是按照一定的条件进行判断,需要注入的Bean满足给定条件才可以注入到Spring IOC容器中。

@ConditionalOnClass表示当容器中存在某个组件才进行组件注入
@ConditionalOnClass表示当容器中没有某个组件才进行组件注入
@ConditionalOnClass某个class位于类路径上,才会实例化一个Bean
@ConditionalOnExpression当表达式为true时,才会实例化一个Bean
@ConditionalOnMissingClass某个class类路径上不存在时,才会实例化一个Bean

–END

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐