1. 程式人生 > >SpringBoot 學習筆記(一)——Spring回顧與SpringMVC基礎

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(“
      http://www.baidu,com
      “)

注意:檔案操作需要新增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提供的介面,原則是用到那個介面就實現哪個介面。

alt

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 接受上傳的檔案
  • 將檔案寫入到磁碟中