SpringBoot 學習筆記(一)——Spring回顧與SpringMVC基礎
Spring Boot學習筆記(一)
一、Spring 回顧
1、宣告Bean 的註解
- @Component 元件,沒有明確的角色
- @Service 業務邏輯層(service層)使用
- @Repository 資料訪問層(dao層)使用
- @Controller 控制器(MVC)
2、注入Bean 的註解
- @AutoWired:Spring 提供的註解
- @Inject:JSR-330提供的註解
- @Resouce:JSR-250提供註解
3、java配置
- @conponent :聲明當前類是一個配置類,相當於一個Spring配置的xml檔案。
- @Bean:註解在方法上,聲明當前方法的返回值為一個Bean。
4、AOP
- 使用@Aspect宣告一個切面。
- 使用@After、@Before、@Around可直接將切點作為引數。
- 使用@PointCut註解宣告切點。
- 使用@EnableAspectAutoProxy註解開啟對Aspect代理的支援。
5、Spring EL和資源排程
@PropertySource 注入配置檔案,需指定地址;若使用@Value注入,需要配置一個PropertySourcePlaceholderConfigurer的Bean.
- @Value註解可以實現以下幾點
1、注入普通字串 @Value(“Spring Boot”)
2、注入作業系統屬性 @Value(“#{systemProperties[‘os,name’]}”)
3、注入表示式結果 @Value(“#{T(java.lang.random()*100.0)}”)
4、注入其他Bean屬性 @Value(testDemo.name)
5、注入檔案資源 @Value(“classpath:com./wisely/highlight_spring4/test/test.txt”)
6、注入網址資源 @Value(“
- @Value註解可以實現以下幾點
注意:檔案操作需要新增common-io的依賴
6、對Bean生命週期的支援
(1)、Java配置:使用@Bean 的initMethod和destroyMethod(相當於在xml中配置init-method和destroy-method)
(2)、註解配置:利用JSR-250的@PostConstruct和@PreDestroy。
eg.
BeanDemo.java(java配置)
public class BeanDemo {
public BeanDemo(){
System.out .println("初始化建構函式");
}
public void init (){
System.out.println("init");
}
public void destroy(){
System.out.println("destroy");
}
}
BeanDemo.java(JSR-250)
public class BeanDemo {
public BeanDemo(){
System.out.println("初始化建構函式");
}
@PostConstruct
public void init (){
System.out.println("init");
}
@PreDestroy
public void destroy(){
System.out.println("destroy");
}
}
ServiceDemo.java
@Configuration
@ComponentScan("com.test")
public class ServiceDemo {
@Bean(initMethod = "init",destroyMethod = "destroy") //java配置
BeanDemo beanDemo(){
return new BeanDemo();
}
@Bean //註解方式
BeanDemo beanDemo(){
return new BeanDemo();
}
}
Test.java
public class Test {
public static void main(String[] args){
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(Test.class);
BeanDemo beanDemo=context.getBean(BeanDemo.class);
context.close();
}
}
執行結果:
初始化建構函式
init
destroy
說明initMethod在建構函式之後執行,destroyMethod在Bean銷燬之前執行。
7、Profile
- 使用@Profile註解或者方法,可以在不同情況下例項化不同的Bean;
eg.
BeanDemo.java (Bean)
public class BeanDemo {
private String content;
public BeanDemo(String content){
this.content=content;
}
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
ProfileDemo.java
public class ProfileDemo {
@Bean
@Profile("dev")
public BeanDemo beanDemoDev(){
return new BeanDemo("dev-Bean");
}
@Bean
@Profile("prod")
public BeanDemo beanDemoProd(){
return new BeanDemo("prod-Bean");
}
}
Test.java
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();
context.getEnvironment().setActiveProfiles("dev");
context.register(ProfileDemo.class);
context.refresh();
BeanDemo beanDemo=context.getBean(BeanDemo.class);
System.out.println(beanDemo.getContent());
context.close();
}
}
執行Test.main方法後輸出結果:
dev-Bean
若設定context.getEnvironment().setActiveProfiles(“prod-Bean”)則輸出” prod-Bean”;
8、事件
Spring的事件遵循以下流程:
1、自定義事件,整合ApplicationEvent。
2 、定義事件監聽器,實現ApplicationListener。
3、使用容器釋出事件。
eg.
自定義事件 EventDemo.java
public class EventDemo extends ApplicationEvent{
private String msg;
public EventDemo(Object source,String msg) {
super(source);
this.msg = msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
事件監聽器 ListenerDemo.java
public class ListenerDemo implements ApplicationListener<EventDemo> {
@Override
public void onApplicationEvent(EventDemo eventDemo) { //對訊息進行處理
String msg=eventDemo.getMsg();
System.out.println(msg);
}
}
事件處理類 PublisherDemo.java
@Component
public class PublisherDemo {
@Autowired
private ApplicationContext applicationContext;
public void publisher(String msg){
applicationContext.publishEvent(new EventDemo(this,msg));
}
}
配置類 EventConfig.java
@Configuration
@ComponentScan("com.xfh.test")
public class EventConfig {
}
測試類 Test.java
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(EventConfig.class);
PublisherDemo publisherDemo =context.getBean(PublisherDemo.class);
publisherDemo.publisher("Hello spring event");
context.close();
}
}
執行Test.main後結果:
Hello spring event
9、Spring Aware
可以使Bean獲得Spring容器的服務。下邊是Spring Aware提供的介面,原則是用到那個介面就實現哪個介面。
10、條件註解@Condition
根據某一個特定條件建立一個特定的Bean,通過重寫Condition介面,並重寫其matches方法來構造判斷方法,一般會有多個類實現Condition介面成為判斷類,但是在某一條件下至多有一個條件類滿足,即matches方法返回true,否則如果有多個條件滿足會丟擲異常,因為Spring 不知道該執行哪個條件對應的Service。
eg.
條件A–ConditionA.java
public class ConditionA implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return false; //返回False
}
}
條件B–ConditionB.java
public class ConditionB implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return true; //返回True
}
}
Service介面–ConditionService.java
public interface ConditionService {
public String showCondition();
}
滿足條件A的Service–ConditionAServiceImpl.java
public class ConditionAServiceImpl implements ConditionService {
@Override
public String showCondition() {
return "ConditionA";
}
}
滿足條件B的Service–ConditionBServiceImpl.java
public class ConditionBServiceImpl implements ConditionService {
@Override
public String showCondition() {
return "ConditionB";
}
}
配置類–ConditionConfig.java
@Configuration
public class ConditionConfig {
@Bean
@Conditional(ConditionA.class) ///滿足條件A
public ConditionService conditionAService(){
return new ConditionAServiceImpl();
}
@Bean
@Conditional(ConditionB.class) ///滿足條件B
public ConditionService conditionBService(){
return new ConditionBServiceImpl();
}
}
測試類–Main.java
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(ConditionConfig.class);
ConditionService conditionService=context.getBean(ConditionService.class);
System.out.println(conditionService.showCondition());
}
}
輸出結果:
ConditionB
二、SpringMVC 基礎
1、常用註解
- @Controller
- @RequestMapping
- @RequestBody
- @ResponseBody
- @PathVariable
- @RestController
2、攔截器
實現對每一個請求處理前後進行相的業務邏輯操作,可以通過實現HandlerInterceptor介面或繼承 HandlerInteceptorAdapter類實現自定義攔截器。
3、@ControllerAdvice
通過@ControllerAdvice可以將對於控制器的全域性配置放在同一個位置,註解了@Controller的類的方法可以使用@ExceotionHandler、@initBinder、@ModelAttribute註解到方法上。
- @ExceptionHandler:用於全域性控制器裡的有效方法。
- @InitBinder:用來設定@WebDataBinder,@WebDataBinder用來自動繫結前臺請求引數到Model中。
@ModelAttribute:使全域性的@RequestMapping都能獲得此處設定的鍵值對。
其中@ExceptionHandler用的最多,其他兩個的使用場景不是很多。
4、SpringMVC高階配置
* 1、檔案上傳*
SpringMVC中通過配置MultipartResolver來上傳檔案。在Spring控制器中通過MultipartFile來接受檔案,通過MultipartFile[] 接受多個上傳的檔案。
步驟:
- 新增依賴:
1.commons-io
2.commons-fileupload - 上傳檔案時form表單要新增enctype=”multipart/form-data”
- 使用MultipartFile 接受上傳的檔案
- 將檔案寫入到磁碟中