SpringBoot启动类注解解析
SpringBoot启动注解讲解
什么是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
声明这是一个配置类 === 配置文件
-
配置类里面使用@Bean标注在方法上,给容器注册组件,默认单实例
-
配置类本身也是组件
-
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
更多推荐
所有评论(0)