SpringBoot中的Bean


SpringBoot中的Bean

1. spring的核心容器

Spring全家桶大家都很熟悉了,從原來的SpringMVC到現在的SpringBoot。核心容器包括了Beans、Core、Context、SpEL。

  • core和beans模塊提供了整個框架最基礎的部分,包括了IOC和DI。
  • Context建立在Core和Beans模塊提供的基礎之上:他提供了框架式訪問對象的方式
  • core、beans、context構成了Spring的骨架
  • SpEL:提供了一種強大的用於在運行時操作對象的表達式語言

2.Spring與bean的關系

Spring容器是Spring的核心,一切SpringBean都存儲在Spring容器內。可以說bean是spring核心中的核心。Bean配置信息定義了Bean的實現及依賴關系,Spring容器根據各種形式的Bean配置信息來創建Bean實例,並調用Bean實例的方法來完成“依賴注入”,可以把Spring容器理解成一個大型工廠,Bean就是該工廠的產品,工廠(Spirng容器)里能生產出來什么樣的產品(Bean),完全取決於配置文件中的配置。而這個配置是由開發人員創建和維護的,而在SpringBoot里面已經通過注解來實現,常用的bean注解有@Controller,@Service,@Component,還有@Configuration(bean的配置類)

3.使用@Componet配置bean

 @Component
 public class JdbcDemo {
    private String name = "abc";

    public String getName(){
        return name;
    }
 }

這里很容易犯的一個錯誤就是包的路徑問題,之前在junit的時候使用@Autowired無法掃描到bean,就是因為我的bean所在的路徑不是在SpringBoot入口類Application同一個包或者是在它的子路徑。一般運行會出現該異常提示

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException:

4.使用@Bean和@Configuration

@Configuration
public class JdbcConfiguration {

    @Bean(name = "jdbcDemo2")
    public JdbcDemo2 jdbcDemo2Bean(){
        return new JdbcDemo2();
    }
}
public class JdbcDemo2 {
    private String name;
    
}

使用這種方法配置Bean的好處就是可以不限定bean的路徑,但是已經用@Bean配置過得類不能再用其他bean的注解不然會造成沖突,但是使用lombok注解就沒問題

使用場景:

在配置一些第三方的數據連接池對象時只能使用這種法術,例如阿里的druid項目。

@Configuration  
public class DruidDBConfig {  
    private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class);  
      
    @Value("${spring.datasource.url}")  
    private String dbUrl;  
      
    @Value("${spring.datasource.username}")  
    private String username;  
      
    @Value("${spring.datasource.password}")  
    private String password;  
      
    @Value("${spring.datasource.driverClassName}")  
    private String driverClassName;  
      
    @Value("${spring.datasource.initialSize}")  
    private int initialSize;  
      
    @Value("${spring.datasource.minIdle}")  
    private int minIdle;  
      
    @Value("${spring.datasource.maxActive}")  
    private int maxActive;  
      
    @Value("${spring.datasource.maxWait}")  
    private int maxWait;  
      
    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")  
    private int timeBetweenEvictionRunsMillis;  
      
    @Value("${spring.datasource.minEvictableIdleTimeMillis}")  
    private int minEvictableIdleTimeMillis;  
      
    @Value("${spring.datasource.validationQuery}")  
    private String validationQuery;  
      
    @Value("${spring.datasource.testWhileIdle}")  
    private boolean testWhileIdle;  
      
    @Value("${spring.datasource.testOnBorrow}")  
    private boolean testOnBorrow;  
      
    @Value("${spring.datasource.testOnReturn}")  
    private boolean testOnReturn;  
      
    @Value("${spring.datasource.poolPreparedStatements}")  
    private boolean poolPreparedStatements;  
      
    @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")  
    private int maxPoolPreparedStatementPerConnectionSize;  
      
    @Value("${spring.datasource.filters}")  
    private String filters;  
      
    @Value("{spring.datasource.connectionProperties}")  
    private String connectionProperties;  
      
    @Bean     //聲明其為Bean實例  
    @Primary  //在同樣的DataSource中,首先使用被標注的DataSource  
    public DataSource dataSource(){  
        DruidDataSource datasource = new DruidDataSource();  
          
        datasource.setUrl(this.dbUrl);  
        datasource.setUsername(username);  
        datasource.setPassword(password);  
        datasource.setDriverClassName(driverClassName);  
          
        //configuration  
        datasource.setInitialSize(initialSize);  
        datasource.setMinIdle(minIdle);  
        datasource.setMaxActive(maxActive);  
        datasource.setMaxWait(maxWait);  
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);  
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);  
        datasource.setValidationQuery(validationQuery);  
        datasource.setTestWhileIdle(testWhileIdle);  
        datasource.setTestOnBorrow(testOnBorrow);  
        datasource.setTestOnReturn(testOnReturn);  
        datasource.setPoolPreparedStatements(poolPreparedStatements);  
        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);  
        try {  
            datasource.setFilters(filters);  
        } catch (SQLException e) {  
            logger.error("druid configuration initialization filter", e);  
        }  
        datasource.setConnectionProperties(connectionProperties);  
          
        return datasource;  
    }  
}  

其中@Value的注解是引用配置文件properties里面的參數,@Primary表示在同一的Datasource中,優先被使用

5.@Autowired注解的使用

@RunWith(SpringRunner.class)
@SpringBootTest
public class CommonTest {

    @Autowired
    DataSource dataSource;
    @Autowired
    JdbcDemo jdbcDemo;
    @Autowired
    JdbcDemo2 jdbcDemo2;
}

最后就是使用Autowired注解就可以直接獲得Bean的對象,這就是Spring框架IOC的作用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM