zoukankan      html  css  js  c++  java
  • SpringBoot Beans管理和自动配置

    SpringBoot Beans管理和自动配置 火推 02

    SpringBoot Beans管理和自动配置

    @SpringBootApplication

    该标记是由若干个标记合成,包含Bean定义、组件扫描、自动配置等功能。主要包含以下标记

    • @SpringBootConfiguration-->@Configuration-->@Component
    • @ComponentScan
    • @EnableAutoConfiguration

    @Configuration+@Bean

    作用:可以将程序中的Bean对象放入Spring容器中。 一般会使用@Configuration+@Bean组合。

    注解标记使用格式:

    @Configuration//配置类
    public class DaoConfig {

    @Bean(name="userDao")//将返回的UserDao对象加入Spring容器,默认id是方法名</br>
    public UserDao createUserDao(){</br>
        return new JdbcUserDao();</br>
    }</br></br>
    
    @Bean(name="bookDao")</br>
    public BookDao createBookDao(){</br>
        return new JdbcBookDao();</br>
    }</br>
    

    }

    创建SpringBoot的Spring容器:

    public static void main(String[] args){
        ApplicationContext ac = 
            SpringApplication.run(DaoConfig.class, args);
    UserDao userDao = ac.getBean("userDao",UserDao.class);
    userDao.save();
    BookDao bookDao = ac.getBean("bookDao",BookDao.class);
    bookDao.load();
    }

    提示:@Bean默认是单例对象,可以使用@Scope("prototype")改变。@Import标记可以引入其他@Configuration配置类

    @Configuration//配置类
    @Import(DataSourceConfig.class)//导入另一个配置类
    public class DaoConfig {
        //... ...
    }
    

    @ComponentScan

    作用:开启组件扫描,等价于<context:component-scan base-package="xx"/>配置。

    在入口类中追加@ComponentScan指定

    @ComponentScan(basePackages={"cn.xdl.config.service"})
    public class ComponetScanConfig {

    }

    service组件

    package cn.xdl.config.service;

    import org.springframework.stereotype.Service;

    @Service("userService")
    public class UserServiceImpl implements UserService{

    @Override</br>
    public void regist() {</br>
        System.out.println("用户注册处理");</br>
    }</br>
    

    }

    创建SpringBoot的Spring容器:

    ApplicationContext ac = 
            SpringApplication.run(ComponetScanConfig.class, args);
    UserService service = 
        ac.getBean("userService",UserService.class);
    service.regist();
    

    提示:@ComponentScan可以指定basePackage扫描路径;不指定默认扫描当前包和子包组件。

    使用提示:jar包组件采用@Bean模式纳入Spring容器;自己编写的组件采用组件扫描纳入Spring容器。

    项目代码包结构

    建议采用下面包结构组织代码

    提示:@Configuration包含@Component标记,适用于组件扫描加载。

    @EnableAutoConfiguration

    SpringBoot核心自动配置,启动自动配置后,Spring容器会自动去spring-boot-autoconfigure.jar,在它META-INF/spring.factories文件加载一系列功能的自动配置组件。例如DataSourceAutoConfiguration、JdbcTemplateAutoConfiguration、AopAutoConfiguration、WebMvcAutoConfiguration等功能。通过自动配置加载这些组件,创建功能相关的对象。

    参数注入

    通过自动配置组件ConfigurationPropertiesAutoConfiguration支持@ConfigurationProperties标记。

    作用:将application.properties中的参数值注入到某个Bean对象中。

    使用方法:

    @Component("dbparams")//扫描
    @ConfigurationProperties//注入properties参数
    public class DB {

    private String username;//注入username值</br></br>
    
    private String password;//注入password值</br></br>
    
    //省略set和get方法   </br>
    

    }

    提示:如果使用@ConfigurationProperties(prefix="db")会注入db.username值和db.password值。

    注意:@ConfigurationProperties需要@EnabledAutoConfiguration或@SpringBootApplication开启自动配置才能用。

    @ComponentScan
    @Configuration
    @EnableAutoConfiguration
    public class MyBootApplication {
    public static void main(String[] args){</br>
        //@ComponentScan加载扫描配置</br>
        ApplicationContext ac = 
            SpringApplication.run(MyBootApplication.class, args);</br>
        //省略...</br>
    }</br>
    

    }

    @SpringBootApplication//一个标记顶前面3个
    public class MyBootApplication {

    public static void main(String[] args){</br>
        //@ComponentScan加载扫描配置</br>
        ApplicationContext ac = 
            SpringApplication.run(MyBootApplication.class, args);</br>
        //省略...</br>
    }</br>
    

    }

    SpringBoot连接池应用

    SpringBoot可以通过自动配置创建出DataSource对象;程序员也可以手动创建。

    需要引入spring-boot-starter-jdbc数据库访问部分的jar包支持。

    SpringBoot默认连接池

    SpringBoot可以默认创建连接池对象,创建出的对象id名为dataSource.创建机制如下:

    1. 优先创建tomcat-jdbc连接池对象。

      (需要引入spring-boot-starter-jdbc.jar包支持)

    2. 没有tomcat-jdbc,会创建HikariCP连接池对象

      (需要引入hikaricp.jar支持)

    3. 没有HikariCP,会创建dbcp连接池对象

      (需要引入dbcp.jar支持)

    4. 没有dbcp,会创建dbcp2连接池对象

      (需要引入dbcp2.jar支持)

    SpringBoot默认连接池参数定义如下:

    application.properties

    spring.datasource.username=xxx
    spring.datasource.password=xxx
    spring.datasource.url=xxx
    spring.datasource.driver-class-name=xxx
    

    可以通过spring.datasource.type参数指定创建连接池对象类型。

    多个数据源时,需要手动创建连接池

    手动创建连接池代码:

    @Configuration
    public class DataSourceConfig {

    @Bean(name="dbcp2")</br>
    @ConfigurationProperties(prefix="db.datasource2")</br>
    public DataSource createDbcp2(){</br>
    

    // BasicDataSource ds = new BasicDataSource();

    // return ds;

    DataSource ds = DataSourceBuilder.create()

    .type(BasicDataSource.class).build();

    return ds;

    }

    @Bean(name="dbcp1")</br>
    @Primary//默认采用该连接池</br>
    @ConfigurationProperties(prefix="db.datasource1")</br>
    public DataSource createDbcp1(){</br>
        DataSource ds = DataSourceBuilder.create()</br>
                .type(BasicDataSource.class).build();</br>
        return ds;</br>
    }</br>
    

    }

    数据源连接参数定义:

    #datasource1
    db.datasource1.username=SCOTT
    db.datasource1.password=TIGER
    db.datasource1.url=jdbc:oracle:thin:@localhost:1521:XE
    #datasource2
    db.datasource2.username=SCOTT
    db.datasource2.password=TIGER
    db.datasource2.url=jdbc:oracle:thin:@localhost:1521:XE
    db.datasource2.driverClassName=oracle.jdbc.OracleDriver
    

    注意:手动创建连接池对象后,Boot默认连接池不再创建。

    JdbcTemplate应用

    SpringBoot采用自动配置会使用默认dataSource对象创建一个JdbcTemplate对象。编写Dao组件时直接注入使用即可。例如

    @Repository("deptDao")//扫描
    public class JdbcDeptDao implements DeptDao{

    @Autowired//注入</br>
    private JdbcTemplate template;</br></br>
    
    @Override</br>
    public List&lt;Dept&gt; findAll() {</br>
        String sql = "select deptno,dname name,loc from dept";</br>
        RowMapper&lt;Dept&gt; rowMapper = </br>
            new BeanPropertyRowMapper&lt;Dept&gt;(Dept.class);//属性名和字段名一致进行封装</br>
        return template.query(sql, rowMapper);</br>
    }</br>
    

    }



        	</article>
    
    	
    				</div>
  • 相关阅读:
    VS 2008 和 .NET 3.5 Beta 2 发布了
    搭建.NET 3.0环境
    Expression Studio和Silverlight学习资源、安装问题汇总
    Discuz! NT官方社区
    VS2005中ajax安装指南[转]
    IT人 不要一辈子靠技术生存(转)
    Discuz!NT2.5发布 正式版同步开源
    VS2005下开发Silverlight 1.1翻译加补充
    自动化测试案例
    [原]JavaScript必备知识系列开篇
  • 原文地址:https://www.cnblogs.com/jpfss/p/9071949.html
Copyright © 2011-2022 走看看