SpringBoot 中的根本注解
@SpringBootApplication 注解
任何一个我的项目都有一个入口,在SpringBoot启动类须要有@SpringBootApplication 注解进行蔑视,并且在类中定义一个main办法,main办法在运行时会读取配置文件,并加载指定资源,而后进行初始化操作.
所以:SpringBoot 我的项目在启动是时,首选基于启动入口类上的注解形容,进行主动配置并扫描指定包以及子包中的类进行加载.
@SpringBootTest 注解
顾名思义 SpringBoot工程中的单元测试须要应用@SpringBootTest 注解进行形容,用于通知spring框架,次此测试类交由spring治理
@Autowired 注解
简略来说,@Autowired 注解就是通知spring框架运行时为此属性注入一个值
例如: @SpringBootTestpublic class DefauleCacheTests {
@Autiwired
private DefaultCache defaultCache;
@Test
void test DefaultCache(){ System.out.println("defaultCache:"+ defaultCache); }输入后果为: defaultCache:com.cy.pj.common.cache.DefaultCache@6e33c391
@Component 注解
@Component 注解时Spring中用于形容Bean类的一个注解,用于通知Spring这个类的实例由Spring创立,当此对象有Spring治理和创立是,会默认将对象存储到池中(Bean池)中.
@Scope 注解
@Scpoe注解 是Spring中用于定义Bean对象作用域的一个注解 罕用的值有@Scope(singleton) @scpoe(prototype)
@Scope(singleton):@Scope的默认值,单例作用域.既整个内存只有一份Bean实例,此实例创立与类提早加载个性配置无关(@Lazy),此实例创立后生命周期会由spring框架治理. @Scope(prototype): 多例作用域,每次获取都会创立新的实例,此实例会在须要的时创立,与Lazy个性无关,这个实例创立当前,并不会交给spring治理,spring能够对其初始化,但不负责销毁.
@Lazy 注解
@Lazy 注解用于形容类,其目标是通知Spring框架,此类反对提早加载通常配合单例作用域(@singleton)应用
简略来说,就是它形容的类的实例,如果临时用不到,就不要先创立实例(@Lazy(true) 默认值,实用于大对象,稀少用)
@PostConstruct 注解
@PostConstruct 注解形容的办法会在对象构建当前执行,用于执行一些初始化操作
@PreDestroy 注解
@PreDestroy 注解形容的办法会在单例对象销毁之前执行,spring容器在销毁之前,会先将容器(Bean)中的对象移除,在移除对象时,如果对象中定义了生命周期销毁办法,此时还会调用对象的生命周期销毁办法(在这样的办法中能够做一些资源开释操作)
总结
@SpringBootApplication @SpringBootTest @Component
@Lazy @scope 次要用于类上
@PostConstruct @PreDestroy 次要用于办法上- @Lazy和@PreDestroy 能够与实用于单例作用域应用 @Scope(singleton),但不适用于多例作用域@Scope(prototype).
Spring中的注解详说:
Spring经验了如下几个阶段:
第一阶段:xml配置
在Spring 1.x时代,应用Spring开发满眼都是xml配置的Bean,随着我的项目的扩充,咱们须要把xml配置文件放到不同的配置文件里,那时须要频繁的在开发的类和配置文件之间进行切换
第二阶段:注解配置
在Spring 2.x 时代,随着JDK1.5带来的注解反对,Spring提供了申明Bean的注解(例如@Component、@Service),大大减少了配置量。次要应用的形式是利用的根本配置(如数据库配置)用xml,业务配置用注解
第三阶段:java配置
Spring 3.0 引入了基于 Java 的配置能力,这是一种类型平安的可重构配置形式,能够代替 XML。咱们目前刚好处于这个时代,Spring4.x和Spring Boot都举荐应用Java配置。
所有这些xml配置都代表了开发时的损耗。 因为在思考 Spring 个性配置和解决业务问题之间须要进行思维切换,所以写配置挤占了写利用程序逻辑的工夫。Spring Boot 让这所有成为了过来。Spring Boot 简化了基于Spring的利用开发,只须要“run”就能创立一个独立的、生产级别的Spring利用。Spring Boot为Spring平台及第三方库提供开箱即用的设置(提供默认设置),这样咱们就能够简略的开始。少数Spring Boot利用只须要很少的Spring配置。咱们能够应用SpringBoot创立java利用,并应用java –jar 启动它,或者采纳传统的war部署形式。这也是SpringBoot让越来越多的开发人员应用的次要起因之一。上面咱们就来具体解说SpringBoot几个很重要的注解:@Configuration , @Bean,@SpringBootApplication,@ComponentScan
@ Configuration和@Bean注解
Spring的Java配置形式是通过 @Configuration和 @Bean 这两个注解实现的,这两个注解是从Spring3.0之后就开始有了:
1、@Configuration 作用于类上,相当于一个xml配置文件;
2、@Bean 作用于办法上,相当于xml配置中的<bean>;
案例
@Configuration
public class DemoConfigure {
@Beanpublic User userBean(){ User user=new User(); user.setAge(100); user.setName("jack"); user.setPwd("123"); return user;}
}
测试如下:
package com.example.springboot01;
import com.example.springboot01.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot01ApplicationTests {
@Autowired
private User user;
@Test
public void contextLoads() {
System.out.println(user);
}
}
打印:
User{name='jack', pwd='123', age=100}
@SpringBootApplication
@SpringBootApplication注解源码如下:
package org.springframework.boot.autoconfigure;@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) })public @interface SpringBootApplication {}
@SpringBootApplication是一个复合注解,包含@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。
- @SpringBootConfiguration继承自@Configuration,二者性能也统一,标注以后类是配置类,并会将以后类内申明的一个或多个以@Bean注解标记的办法的实例纳入到srping容器中,并且实例名就是办法名。
- @EnableAutoConfiguration的作用启动主动的配置,@EnableAutoConfiguration注解的意思就是Springboot依据你增加的jar包来配置你我的项目的默认配置,比方依据spring-boot-starter-web ,来判断你的我的项目是否须要增加了webmvc和tomcat,就会主动的帮你配置web我的项目中所须要的默认配置。
- @ComponentScan,扫描以后包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行治理。是以前的<context:component-scan>(以前应用在xml中应用的标签,用来扫描包)。
@SpringBootApplication指定扫描某些包
@SpringBootApplication注解默认扫描的是以后类所在的包和子包。本人能够通过属性来设置扫描其余的包,设置了之后默认值就不在有用。
@SpringBootApplication(scanBasePackageClasses = {TestConfig.class,TestController.class})
通过设置scanBasePackageClasses属性来制订,只扫描哪些配置类(@Configuration注解的类)。
或者如下设置:
@SpringBootApplication(scanBasePackageClasses = {Springboot01Application.class,TestConfig.class})
指定扫描这些类所在的包和子包。
设置不主动拆卸
springboot 的主动配置能够帮咱们节俭很多工夫,然而有时候如果咱们不想在引入依赖包的状况主动配置,则能够通过相干设置勾销
在@SpringBootApplication(exclude = {JpaRepositoriesAutoConfiguration.class, RedisAutoConfiguration.class})注解外部将不须要主动配置的依赖通过exclude参数指定即可,能够指定多个类
所有主动配置的类全都在:org.springframework.boot.autoconfigure包下。只能排出主动配置的类。
@ComponentScan
@ComponentScan注解在Spring的注解中也起到到相当重要的作用,它能够自定义Spring扫描的包,也就是它默认会扫描标注了@Controller、@Service、@Component以及@Repository注解的类,并实例化这些组件到SpringIOC容器中,它有个配置属性:basePackages,也就是指定扫描的包,如果不晓得,它会默认扫描配置了该注解的类的包所在的门路(包含子包)。咱们看@SpringBootConfiguration注解的源码中有段代码:
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
scanBasePackages属性,指定到了@ComponentScan注解的basePackages属性,所有在SpringBoot中,咱们同样能够通过scanBasePackages属性指定包扫描的门路(如不指定,会默认扫描主程序类所在的包门路以及子包下的类):
@SpringBootApplication(scanBasePackages = "com.seagetech.springbootdemo")