1、SpringBoot的入门

1、下载并配置STS(spring.io/tools)
2、SpringBoot的简介:
Spring boot是一个脚手架(而非框架),构建于Spring框架(Framework)基础之上,基于快速构建理念,提供了自动配置功能,可实现其开箱即用特性(创建完一个基本的项目以后,可零配置或者少量配置即可运行我们的项目),其核心主要有如下几个方面:
起步依赖(Starter Dependency)。
自动配置(Auto Configuration)。
健康检查(Actator)-监控。
其中,Spring Boot官方地址为https://spring.io/projects/spring-boot。
3、SpringBoot:简单项目的创建
1) 打开STS 集成开发工具,创建spring boot项目,配置好相关的配置后,工具会自动创建一个maven项目,自动导入依赖,以及项目启动类(有且只有一个,路径在src/test/java/com/*/XxxApplicationTests.java),
@SpringBootApplication 注解描述的类为springboot项目的启动类(入口)。

/**
 * 由 @SpringBootApplication 注解描述的类为springboot项目的启动类(入口)。
 * 1)这样的启动类一个项目只能有一个.
 * 2)此类运行时会启动项目的自动配置并扫描此类所在包以及子包中的资源然后进行加载(将类读到内存)。
 * FAQ?
 * 1)如何把一个类交给spring去管理?
 * a)将类放在启动类所在包以及子包中。
 * b)将此类使用spring指定注解进行描述.(例如@Component,@Service,...)
 * 2)如何跟踪这个类是否被加载了? (通过JVM参数设置进行跟踪:-XX:+TraceClassLoading)
 * 案例:
 * 第一步:在com.cy.pj.common.cache包中定义DefaultCache类
 * 第二步:使用@Component注解对DefaultCache类进行描述
 * 第三步:使用JVM参数-XX:+TraceClassLoading检测DefaultCache类是否被加载了
 */
@SpringBootApplication
public class XxxApplication {

	public static void main(String[] args) {
		SpringApplication.run(XxxApplication.class, args);
	}
}

2) 如果要把一个类交给spring去管理:
a)将类放在启动类所在包以及子包中。例如:启动类的包是com.xx,则要求这个类要在启动类的同包下或者子包:com.xx.* …
b)将此类使用spring指定注解进行描述.(例如 @Component,@Service,…)

@Component
@Scope("prototype")//默认是单例"singleton",多例"prototype"作用域,spring容器不负责存储,只负责创建与初始化
//@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
@Lazy//通常与Singgleton一起用,与prototype则会不起作用
public class DefaultCache  {//DefaultCache.class

	int i=1;
	public DefaultCache() {
		System.out.println("DefaultCache()");
	}
	
	//对象的生命周期:创建,初始化,服务,销毁
	//设置对象生命周期初始化方法(会在对象构造方法执行之后执行)
	//方法名可以自定义,也可以有返回值
	@PostConstruct
	public void init() {
		System.out.println("==init()==");
		
	}
	
	//设置生命周期销毁方法(会在spring容器销毁对象之前执行)
	//方法名可以自定义,也可以有返回值
	@PreDestroy
	public void destroy() {
		System.out.println("==destroy()==");
	}
}

@Scope—作用域:不写时默认是单例@Scope(“singleton”),多例@Scope(“prototype”)
单例,多例的应用:
@Scope(“Singgleton”)单例:使用频次多,会有线程安全问题;直接存在内存里面的,放在Bean池的,在bean池销毁时才会销毁,所以使用频次少的就要使用多例
@Lazy//默认值为(true)通常与Singgleton一起用,与prototype则会不起作用
@Scope(“prototype”)多例:使用频次少的,是线程安全的,独立的;多例"prototype"作用域,spring容器负责存储,只负责创建与初始化,销毁时GC负责;

GC机制:
当对象不可以达,会被标记,然后进行垃圾回收,最后整理内存(因为碎片多),垃圾回收不是立马回收的,不定时,或者内存不足时,就算是由引用,但是后面都没有再调用的情况,也会被回收(JVM会预测后面是否会有调用,有调用就不会回收,否则会)

//GC系统一旦启动,他会做如下几件事:
//1)扫描内存中的不可达对象。
//2)对不可达对象进行标记。(这些对象是垃圾)
//3)对垃圾对象进行回收。(清除对象释放内存)
//4)内存整理。(碎片比较的多,将小内存块进行合并)

4、测试类:必须要在src/test/java/com/xx 的目录下,就是对应的启动类的test的目录下(包)或者子包下:
1) 当类的对象只有一个,也就是一个子类时:如下代码

/**
 * SpringBoot 脚手架工程单元测试类需要使用@SpringBootTest注解进行描述。
 * 1)第一它是测试类
 * 2)此类会交给spring管理(例如创建对象,为对象属性赋值)
 * @author pc
 */
@SpringBootTest
public class DefaultCacheTests {
	
	/**
     * @Autowired 描述属性时,spring框架会按照一定的规则为属性赋值。
     * 1)首先进行查找(从spring 容器中查找匹配对象-依赖查找),当找不到时
     *   会出现NoSuchBeanDefinition
     * 2)通过反射为属性赋值(依赖注入)
     */
	 //has a
	@Autowired
	private DefaultCache defautcache1;
	@Autowired
	private DefaultCache defautcache2;
	
	@Test
	public void testCache() {
		System.out.println("测试defaultcache: " + defautcache1);
		System.out.println(defautcache1.i);
		System.out.println(defautcache1==defautcache2);
	}
	
	
	/** 这是利用spring自己获取Bean
	 * 此对象为spring框架中的一个场景对象,此对象支持
	 * 1)bean 对象作用域的设置(不同作用域的对象会对应不同的池)
	 * 2)国际化操作
	 * 3).....
	 */
//	@Autowired
//	private ApplicationContext applicationContext;
//	@Test
//	void testContainBean() {
//		DefaultCache d = applicationContext.getBean("defaultCache",DefaultCache.class);//"defaultCache"为类DefaultCache的首字母小写
//		System.out.println(d);
//	}
}

2) 当类的对象(多态创建),也就是子类不为一个时:如下代码,可以指定让Spring创建的是哪个子类的对象

@SpringBootTest
public class CacheTests {
	
	/**
     * Spring 容器为此属性按照怎样的规则进行依赖注入(赋值)
     * 1)首先按类型从spring容器进行查找,假如找到一个则直接注入,
     * 没找到则抛出NoSuchBeanDefinition异常。
     * 2)其次假如此类型的对象有多个,此时还会基于属性名进行匹配,
     * 名字匹配的对象可直接注入,名字不匹配则直接抛出NoUniqueBeanDefinitionException异常。
     * 3)再次,我们也可以显式为属性要注入的对象指定其名字, @Autowired
     * 												private Cache cac;
     * 												与@Component("cac")中的名字对应就可以找到对应的
     * 可以通过@Qualifier注解进行指定(此注解配合@Autowired注解使用)。
     */
	@Autowired
	@Qualifier("softCache")
	private Cache cache;
	
	@Test
	public void testCache() {
		System.out.println(cache);
	}
}

@SpringBootTest
SpringBoot 脚手架工程单元测试类需要使用@SpringBootTest注解进行描述。

  1. 第一它是测试类
  2. 此类会交给spring管理(例如创建对象,为对象属性赋值)
    @Autowired注解应用规则?
    @Qualifier注解的作用是什么?

    @Autowired由spring框架定义,用于描述类中属性或相关方法。Spring框架在项目运行时假如发现由他管理的Bean对象中有使用@Autowired注解描述的属性或方法,可以按照指定规则为属性赋值(DI)。
    其基本规则是:首先要检测容器中是否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。
    最后,假如我们有明确要求,必须要注入类型为指定类型,名字为指定名字的对象还可以使用@Qualifier注解对其属性或参数进行描述(此注解必须配合@Autowired注解使用)。

JVM参数分析

-XX:+PrintGCDetails —分析的是GC情况
-XX:+TraceClassLoading —分析类的加载情况

快捷键
查找类:Ctrl+shift+T
查找关键词:Ctrl+F
查看继承体系:Ctrl+T