1. 程式人生 > >Springboot Enable開頭註解解釋說明

Springboot Enable開頭註解解釋說明

[email protected] 和 @Async一起使用做非同步

首先建立一個類我叫他Jeep

package com.gcx.spring.z_springboot_Enablexxx;

import java.util.concurrent.TimeUnit;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class Jeep implements Runnable{

	public void run() {
		for(int i=0;i<10;i++) {
			try {
				System.out.println("=================:"+i);
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

然後我們在Maven預設的App.class中呼叫

package com.gcx.spring.z_springboot_Enablexxx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.EnableAsync;

/**
 * Hello world!
 *EnableAsync 和@Async一起使用
 *@Import 匯入一個活著的多個配置類 會被spring容器所託管 ,如果匯入配置類,配置類所有bean都會被spring容器託管
 */
@SpringBootApplication
public class App {
    public static void main( String[] args ){
    	ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
    	context.getBean(Runnable.class).run();
    	System.out.println("===end=====");
    	context.close();
    
    }
}

現在的情況是沒有非同步的情況,只能等待run方法執行之後再列印 end

接下來我們使用非同步情況

在App.class加上 @EnableAsync註解。在Jeep.class上的run方法,加上@Async註解,列印結果如下

發現結果的確是非同步執行的

2.我們來看看Enable註解內部的原理,發現裡面都有@Import註解,它其實就是匯入一個類,舉例說明

建立一個User.class,Role.class

package com.gcx.spring.z_springboot_Enablexxx;

public class Role {

}

package com.gcx.spring.z_springboot_Enablexxx;

public class User {

}
這兩個類現在沒有加上@Componment註解

我們在App.class呼叫的話 會顯示異常,告訴你Spring容器中並沒有這個bean

System.out.println(context.getBean(User.class));
System.out.println(context.getBean(Role.class));

這時候我們在App.class上加入@Import註解

@Import({User.class,Role.class})
執行App.class會發現列印輸出bean已經被spring容器裝載

@Import既可以裝載一個或者多個類交給spriing容器處理,也可以裝載配置類MyConfig

package com.gcx.spring.z_springboot_Enablexxx;

import org.springframework.context.annotation.Bean;

public class MyConfig {

	@Bean
	public Runnable createRunnble1() {
		return () -> {};	
	}
	
	@Bean
	public Runnable createRunnble2() {
		return () -> {};	
	}
	
	
}

它還提供ImportSelector類靜態注入Spring容器,我們建立一個MyImportSelector類來實現這個介面

package com.gcx.spring.z_springboot_Enablexxx;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * 返回值是一個class 該class必須是全稱 這樣會被spring容器託管
 * @author Administrator
 *
 */
public class MyImportSelector implements ImportSelector{

	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		//可以獲取到註解資訊,然後根據註解資訊動態的返回被spring容器託管的bean
		System.out.println(importingClassMetadata.getAnnotationAttributes(EnableLog.class.getName()));
		return new String[]{User.class.getName(),Role.class.getName(),MyConfig.class.getName()};
	}

}
我們建立一個註解類
package com.gcx.spring.z_springboot_Enablexxx;

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.context.annotation.Import;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MyImportSelector.class)
public @interface EnableLog {

	String name();
}
接著我們在 App.class上新增@EnableLog(name=“today is a good day")

結果發現bean被全部注入到Spring容器,還可以列印註解資訊

有靜態的就有動態的注入

我們建立一個新類MyImportBeanDefinitionRegistrar實現ImportBeanDefinitionRegistrar

package com.gcx.spring.z_springboot_Enablexxx;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		BeanDefinitionBuilder  beanDefinitionBuilder=BeanDefinitionBuilder.rootBeanDefinition(User.class);
		BeanDefinition beanDefinition=beanDefinitionBuilder.getBeanDefinition();
		registry.registerBeanDefinition("User", beanDefinition);
	}

}
修改@EnableLog註解上@Import匯入的類換成新建立的MyImportBeanDefinitionRegistrar

結果控制檯同樣輸出bean被裝載

靜態的是有返回值的,動態的是沒返回值

相關推薦

Springboot Enable開頭註解解釋說明

[email protected] 和 @Async一起使用做非同步 首先建立一個類我叫他Jeep package com.gcx.spring.z_springboot_Enablexx

springBoot(2)註解解釋

pub pri 允許 rest .class oot tap json格式 col @EnableAutoConfiguration:啟用springboot的自動配置,根據所聲明的依賴對Spring進行自動配置 @ComponentScan  和  @Component在

springBoot @Enable*註解的工作原理

圖解 tor def sys autoconf 屬性註入 erb ota efi 使用註解實現異步 RunnableDemo類 package com.boot.enable.bootenable; import org.springframework.schedu

SpringBoot常用註解解釋

  @SpringBootConfiguration:這是SpringBoot專案的配置註解,在Spring Boot專案中推薦使用@SpringBootConfiguration替代@Configuration; @EnableAutoConfiguration:啟用自動配

springboot註解解釋和作用

@Configuration把一個類作為一個IoC容器,它的某個方法頭上如果註冊了@Bean,就會作為這個Spring容器中的Bean。 @Scope註解 作用域 @Lazy(true) 表示延遲初始化 @Service用於標註業務層元件、 @Controller用於標註控制

SpringBoot中@EnableAutoConfiguration註解的作用

springboot enable auto 在這個註解中,最重要的是它導入了一個類EnableAutoConfigurationImportSelector它是一個ImportSelector接口的實現類,而ImportSelector接口中的selectImports方法所返回的類將被Spri

Jersey常用註解解釋 @DET、@PUT、@POST 、@DELETE等

.com method jersey pub pos -1 images 技術分享 .cn uri : ... /resource/{id} public voide method(@PathParam("id") String userId){} uri : ..

SpringBoot中@EnableAutoConfiguration註解用法收集

enable ble using ring get http blog reference o-c 參考: http://blog.csdn.net/xiaoyu411502/article/details/52770723 https://docs.spring

SpringBoot中常見註解含義總結

而不是 com api 生效 boot width VC 而是 static @RestController @RestController被稱為一個構造型(stereotype)註解。它為閱讀代碼的開發人員提供建議。對於Spring,該類扮演了一個特殊角色。它繼承自@Co

Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等註解解釋

json 框架 代碼 mat per nbsp str 作用 tran 1、@Transient @Transient表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性;如果一個屬性並非數據庫表的字段映射,就務必將其標示為@Transient,否則ORM框架

SpringBoot中DataSourceAutoConfiguration註解

lse tab 存在 except () reading provide ade 了吧 最近在學習springBoot時,其中有很大的一個核心的只是點:自動配置。 通過 DataSourceAutoConfiguration 學習 自動配置是如何實現的。 自動配置中比較重要

springboot自定義註解校驗時出現的異常

異常資訊: javax.validation.ConstraintDefinitionException: HV000074 原因: 在約束註釋中它是關於groups()和payload()缺失的,只需新增這兩行就可以了: Class<?>[] groups() de

Springboot自定義註解封裝快取操作

通常,我們為了避免頻繁的查詢訪問資料庫或者第三方介面,會把查詢結果快取到redis或者memcached之類的nosql資料庫中,避免資料庫或者網路開銷過大導致程式效率太低或者雪崩效應,但是程式碼中頻繁的操作快取,會讓程式碼過於冗長,可以通過自定義註解的方式封裝快取的操作,使程式碼更簡潔,話

SpringBoot整合Mybatis註解版---update出現org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found. Available parameters are [arg1, arg0,

SpringBoot整合Mybatis註解版---update時出現的問題 問題描述:   1、sql建表語句 DROP TABLE IF EXISTS `department`; CREATE TABLE `department` ( `id` int(11) NOT NULL AUTO_I

SpringBoot | Hibernate @Transient 註解

在預設情況下,持久化類的所有屬性會自動對映到資料表的資料列。如果在實際應用中,不想持久儲存某些屬性,則可以考慮使用 @Transient來修飾它們。 如果一個屬性並非資料庫表的欄位對映,就務必將其標示為 @Transient,否則,ORM框架預設其註解為@Basic 被註解成 @Tra

springboot mybatis 的註解

spring boot已經自動實現了mybatis所有配置,直接寫dao介面即可。 1.基本sql操作: @Mapper:宣告一個mybatis的dao介面,會被spring boot掃描到 @Select:宣告一個查詢方法,相應的增、刪、改使用:@Insert、 @Delete、 @Upd

springboot攔截器註解方式

WebMvcConfigurerAdapter配置類其實是Spring內部的一種配置方式,採用JavaBean的形式來代替傳統的xml配置檔案形式進行鍼對框架個性化定製,下面我們來看一下該類內的常用方法。 本章目標 繼承WebMvcConfigurerAdapter採用Ja

SpringBoot三種註解啟動方式

1、SpringBoot內建了Tomcat,Jetty等容器,所以可以通過註解方式進行啟動。 2、SpringBoot註解啟動的原理:SpringBoot main方法,是程式入口,啟動SpringBoot專案,建立內建tomcat伺服器,使用tomcat載入springmvc 註解啟動。註解的

SpringBoot自定義註解

我們經常使用自定義註解和AOP實現操作日誌、許可權、統計執行時間等功能,本文記錄使用SpringBoot實現自定義註解 本文在一個ssm專案的基礎上進行的 SpringBoot搭建SSM專案:https://blog.csdn.net/qidasheng2012/article/de

spring boot中的註解解釋

@Controller:用在controller,相當於@[email protected]同時使用,用@Controller,可以任意返回html頁面和jsp頁面,也可以返回物件 @RestController在使用的時候,只能返回html的頁面,不能配置jsp的試圖解析器 @R