天天看點

SpringBoot之了解自動配置原理

該部落格簡單介紹了容器中的功能,如元件的添加,注解的使用以及聯合使用,包含配置綁定的執行個體說明等

承接上文:

import注解的使用:

作用:引用時,容器自動建立出這填寫的類型的元件,預設元件的名字就是全類名。

往容器中添加兩個元件
@Import({User.class, DBHelper.class})
           

測試:

System.out.println("=======測試import========");
String[] beanNamesForType = run.getBeanNamesForType(User.class);
System.out.println("==============");
for(String s: beanNamesForType){
    System.out.println(s);
}
DBHelper bean1 = run.getBean(DBHelper.class);
System.out.println(bean1);
           

結果:

com.xbhog.pojo.User

user

ch.qos.logback.core.db.DBHelper@68565bc7

可以看出,使用import的元件傳回名字時全類名,我們自己寫的元件,就是原來的。

條件裝配

條件裝配:滿足Conditional指定的條件,則進行元件注入.

元件注解:

執行個體采用以下兩個為例:

  1. @ConditionalOnMissingBean(name="tom11")
  2. @ConditionalOnBean(name="tom11")
  1. ConditionalOnMissingBean表示當容器中沒有這個tom11元件時,執行下面的元件
    @Import({User.class, DBHelper.class})
    @Configuration(proxyBeanMethods = false) 
    public class MyConfig {
        @ConditionalOnMissingBean(name="tom11")
        @Bean  
        public User user(){
            User user = new User("xbhog", 18);
            return user;
        }
        //@Bean("tom11") 
        public Pet tomcat(){
            return new Pet("tomcat");
        }
    }
               
    主啟動程式中的代碼片段:
    ConfigurableApplicationContext run = SpringApplication.run(Myapp.class, args);  //傳回IOC容器
    boolean tom11 = run.containsBean("tom11");
    //容器中tom11元件:false
    //容器中user元件:true
    System.out.println("容器中tom11元件:"+tom11);
    boolean user = run.containsBean("user");
    System.out.println("容器中user元件:"+user);
               
    結果:
    容器中tom11元件:false
    容器中user元件:true
               
  2. ConditionalOnBean表示當容器中存在該元件時,才執行下面的内容
    @Import({User.class, DBHelper.class})
    @Configuration(proxyBeanMethods = false) 
    public class MyConfig {
        @ConditionalOnBean(name="tom11")
        @Bean  
        public User user(){
            User user = new User("xbhog", 18);
            return user;
        }
        //@Bean("tom11") 
        public Pet tomcat(){
            return new Pet("tomcat");
        }
    }
               
    主程式啟動代碼:
    ConfigurableApplicationContext run = SpringApplication.run(Myapp.class, args);  //傳回IOC容器
    boolean tom11 = run.containsBean("tom11");
    //容器中tom11元件:false
    //容器中user元件:true
    System.out.println("容器中tom11元件:"+tom11);
    boolean user = run.containsBean("user");
    System.out.println("容器中user元件:"+user);
               
    結果:
    容器中tom11元件:false
    容器中user元件:false
               

配置綁定:

解決的問題:

将properties檔案中的内容綁定到類的屬性中,并把它們封裝到JavaBean中,以供随時使用

有兩種方法實作:

第一種:

采用component+configurationProperties來綁定properties中的資料

properties資料:(brand:别摸我)

mycar.brand = BMW
mycar.price = 200000
           

編寫Car實體類:

package com.xbhog.popj;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@AllArgsConstructor   //有參構造
@NoArgsConstructor   //無參構造
@Component   		//将該類加入到容器中,來獲得Spring Boot提供的強大的功能
@ConfigurationProperties(prefix="mycar")   //實作讀取綁定到properties中的以mycar字首的資料
public class Car {
    private String brand;
    private String price;
}

           

編寫Controller:

package com.xbhog.controller;

import com.xbhog.popj.Car;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {
    @Autowired  //自動比對到容器中的car
    Car car;

    @RequestMapping("/car")
    public Car car(){
        return car;
    }
}
           

實作效果:

{"brand":"BMM","price":"200000"}
           

第二種:

EnableConfigurationProperties+ConfigurationProperties

@EnableConfigurationProperties(類.class)

功能:

  1. 開啟類配置綁定功能
  2. 把這個類這個元件自動注冊到容器中

需要把EnableConfigurationProperties注解加到配置類中,因為配置類本身就是元件。

MyConfig:
@Configuration
@EnableConfigurationProperties(Car.class)   //開啟Car配置綁定功能n并把Car自動注冊到容器中
public class MyConfig {

}
           

@ConfigurationProperties(prefix = “mycar”)

找到配置檔案中application.properties中的前置為mycar的内容

實作效果:

{"brand":"BMM","price":"200000"}
           

原生配置檔案引入:

使用@ImportResouce注解将bean.xml中的元件加入到容器中

bean.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="haha" class="com.xbhog.pojo.User">
        <property name="name" value="zhangsan"></property>
        <property name="age" value="18"></property>
    </bean>

    <bean id="hehe" class="com.xbhog.pojo.Pet">
        <property name="name" value="tomcat"></property>
    </bean>


</beans>
           
package com.xbhog.springboot1times;

import ch.qos.logback.core.db.DBHelper;
import com.xbhog.config.MyConfig;
import com.xbhog.pojo.Pet;
import com.xbhog.pojo.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;

//@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.xbhog")
@ImportResource("classpath:bean.xml")
public class Myapp {
    public static void main(String[] args) {
        /*1. 傳回我們IOC容器*/
        ConfigurableApplicationContext run = SpringApplication.run(Myapp.class, args);
        boolean haha = run.containsBean("haha");
        boolean hehe = run.containsBean("hehe");
        System.out.println("是否存在:"+haha+"==="+hehe);
    }
}

           

結果:是否存在:true===true

參考:

尚矽谷B站視訊

結束:

如果你看到這裡或者正好對你有所幫助,希望能點個關注或者推薦,感謝;

有錯誤的地方,歡迎在評論指出,作者看到會進行修改。

繼續閱讀