【Spring-IOC】你須要掌握的註解版開發!

你們好,我是小菜,一個渴望在互聯網行業作到蔡不菜的小菜。可柔可剛,點贊則柔,白嫖則剛!java

死鬼~看完記得給我來個三連哦!web

本文主要介紹 Spring 中IOC的註解開發
若有須要,能夠參考
若有幫助,不忘 點贊spring

創做不易,白嫖無義!數組

前戲概要:

XML 配置注入類:

  • 建立一個須要注入的類
  • 建立一個Spring 配置文件
  • 而後經過 的方式註冊

基於註解注入:

  • 編寫一個Person類:
public class Person {
    private String name;
    private Integer age;
    //省略 get / set 方法
}
複製代碼
  • 編寫一個配置類:
//配置類==配置文件
@Configuration  //告訴Spring這是一個配置類
public class MainConfig {
    //給容器中註冊一個Bean;類型爲返回值的類型,id默認是用方法名做爲id
    //也能夠經過@Bean(value)的方式指定ID
    @Bean("person")
    public Person person01(){
        return new Person("Cbuc"22);
    }
}
複製代碼
  • 編寫一個測試類:
public void test01(){
    //能夠注意到以前基於xml的時候是 new ClassPathXmlApplicationContext() ,如今基於註解是 new AnnotationConfigApplicationContext()
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
    Person person = (Person) applicationContext.getBean("person");
    System.out.println(person);
}
複製代碼

成功獲取到注入的類:session

步驟詳解

1)包掃描

XML掃描方式:能夠配置配置一些過濾條件app

<context:component-scan base-package="cbuc.lie" use-default-filters="false"></context:component-scan>
複製代碼

註解掃描方式:(@ComponentScan
post

FilterType.CUSTOM的使用學習

1)定義一個TypeFilter的實現類MyTypeFilter測試

2)經過@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class}在classes中引入便可ui

2)做用域

經過@Scope:調整做用域(默認是單實例的)

  • singleton:單實例的(默認值),IOC容器啓動會調用方法建立對象放到 IOC 容器中。 之後每次獲取就是直接從容器 map.get()中拿,
  • request:同一次請求建立一個實例
  • session:同一個session建立一個實例

3)懶加載

單實例bean:默認在容器啓動的時候建立對象;

懶加載:容器啓動不建立對象。第一次使用(獲取)Bean建立對象,並初始化;

4) 按條件注入(@Conditional({Condition})

  1. 編寫 Condition 的實現類 WindowsCondition
  1. 根據條件注入Bean
  1. 咱們除了能夠把 @Conditional 註解放在方法上 , 還能夠放在類上(優先級比方法上高)

5) 給容器中導入一個組件(@Import

給容器中註冊組件:

  1. 包掃描+組件標註註解(@Controller/@Service/@Repository/@Component)

  2. 在配置類在經過@Bean 註冊

  3. @Import (快速給容器中導入一個組件)

  • 1)@Import(要導入到容器中的組件);容器中就會自動註冊這個組件,id默認是全類名

  • 2)ImportSelector:返回須要導入的組件的全類名數組

    編寫ImportSelector的實現類

    在@Import中聲明

  • 3)ImportBeanDefinitionRegistrar:手動註冊bean到容器中

    編寫ImportBeanDefinitionRegistrar的實現類


    在@Import中聲明

6)FactoryBean(工廠Bean)

1)默認獲取到的是工廠bean調用getObject建立的對象

2)要獲取工廠Bean自己,咱們須要給id前面加一個&colorFactoryBean

  1. 編寫FactoryBean的實現類:

  2. 在配置類中註冊:

    @Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }
複製代碼
  1. 注意點:

此時雖然注入的是colorFactoryBean,可是獲取到的是Color


若是想要獲取colorFactoryBean,就在id前面加一個&

7)生命週期

bean的生命週期:

bean建立---初始化----銷燬的過程

容器管理bean的生命週期;咱們能夠自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來調用咱們自定義的初始化和銷燬方法

1)指定初始化和銷燬方法;

  • 經過@Bean指定init-methoddestroy-method

咱們建立一個Car類,裏面自定義初始化和銷燬方法:

public class Car {
    public Car(){
        System.out.println("car constructor...");
    }
    public void init(){
        System.out.println("car ... init...");
    }
    public void detory(){
        System.out.println("car ... detory...");
    }
}
複製代碼

註冊到 IOC容器中:

//在 Bean 註解裏面指定初始化和銷燬方法
@Bean(initMethod="init",destroyMethod="detory")
public Car car(){
    return new Car();
}
複製代碼

2)經過讓Bean實現

  • InitializingBean(定義初始化邏輯)
  • DisposableBean(定義銷燬邏輯)

咱們建立一個Cat類,實現InitializingBean 和 DisposableBean 兩個接口:

@Component        //在配置類中開啓包掃描,自動註冊到 IOC 容器中
public class Cat implements InitializingBean,DisposableBean {
    public Cat(){
        System.out.println("cat constructor...");
    }
    public void afterPropertiesSet() throws Exception {
        //初始化方法
        System.out.println("cat...afterPropertiesSet...");
    }
    public void destroy() throws Exception {
        //銷燬方法
        System.out.println("cat...destroy...");
    }
}
複製代碼

3)使用JSR250

  • @PostConstruct:在bean建立完成而且屬性賦值完成,來執行初始化方法
  • @PreDestroy:在容器銷燬bean以前通知咱們進行清理工做

首先建立一個Dog類:

@Component        //在配置類中開啓包掃描,自動註冊到 IOC 容器中
public class Dog {
    public Dog(){
        System.out.println("dog constructor...");
    }
    //對象建立並賦值以後調用
    @PostConstruct
    public void init(){
        System.out.println("Dog....@PostConstruct...");
    }
    //容器移除對象以前
    @PreDestroy
    public void detory(){
        System.out.println("Dog....@PreDestroy...");
    }
}
複製代碼

4)BeanPostProcessor【interface】:bean的後置處理器

  • 在bean初始化先後進行一些處理工做;
  • postProcessBeforeInitialization:在初始化以前工做
  • postProcessAfterInitialization:在初始化以後工做

咱們建立一個 MyBeanPostProcessor 類實現 BeanPostProcessor 接口:

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    //初始化前進行的操做
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean);
        return bean;
    }
    //初始化後進行的操做
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);
        return bean;
    }
}
複製代碼

8)參數賦值

使用@Value賦值:

  1. 基本數值
  2. 能夠寫SpEL:#{}
  3. 能夠寫${} :取出配置文件【properties】中的值(在運行環境變量裏面的值)


9)自動裝配

Spring利用依賴注入(DI),完成對IOC容器中中各個組件的依賴關係賦值

1、@Autowired:自動注入

  1. 默認優先按照類型去容器中找對應的組件:

applicationContext.getBean(BookDao.class) 找到就賦值

  1. 若是找到多個相同類型的組件,再將屬性的名稱做爲組件的id去容器中查找:

    applicationContext.getBean("bookDao")

  2. 使用 @Qualifier 指定須要裝配的組件的id,而不是使用屬性名

  1. 自動裝配默認必定要將屬性賦值好,沒有就會報錯

    可使用@Autowired(required=false)容許空裝配

  1. 使用 @Primary:讓Spring進行自動裝配的時候,默認使用首選

​ 也能夠繼續使用 @Qualifier 指定須要裝配的bean的名字,優先級比較高

**2、Spring還支持使用 @Resource(JSR250) 和 @Inject(JSR330) **

  1. @Resource
  • 能夠和 @Autowired 同樣實現自動裝配功能;默認是按照組件名稱進行裝配的;
  • 不能支持 @Primary 功能且不能支持 @Autowired(reqiured=false)
  1. @Inject:
  • 須要導入 javax.inject 的包,和 **Autowired **的功能同樣。沒有 required=false 的功能;

3、@Autowired 標記位置 : 構造器,參數,方法,屬性

構造器:若是組件只有一個有參構造器,這個有參構造器的 @Autowired 能夠省略,參數位置的組件仍是能夠自動從容器中獲取

參數(@Autowired 能夠省略)

方法 :@Bean+方法參數;參數從容器中獲取;默認不寫@Autowired效果是同樣的;都能自動裝配

1)

2)

屬性:

10)@Profile 指定環境

Spring爲咱們提供的能夠根據當前環境,動態的激活和切換一系列組件的功能(開發環境、測試環境、生產環境…)

  • @Profile:指定組件在哪一個環境的狀況下才能被註冊到容器中,不指定,任何環境下都能註冊這個組件
  1. 加了環境標識的bean,只有這個環境被激活的時候才能註冊到容器中。默認是default環境
  2. 寫在配置類上,只有是指定的環境的時候,整個配置類裏面的全部配置才能開始生效
  3. 沒有標註環境標識的bean,在任何環境下都是加載的
  • 切換環境

    1)使用命令行動態參數: 在虛擬機參數位置加載 -Dspring.profiles.active=test

    2)代碼的方式激活某種環境

//一、建立一個applicationContext
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//二、設置須要激活的環境
applicationContext.getEnvironment().setActiveProfiles("dev");
//三、註冊主配置類
applicationContext.register(MainConfigOfProfile.class);
//四、啓動刷新容器
applicationContext.refresh();
複製代碼
看完不讚,都是壞蛋
看完不讚,都是壞蛋

今天的你多努力一點,明天的你就能少說一句求人的話!

我是小菜,一個和你一塊兒學習的男人。 💋

相關文章
相關標籤/搜索