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

2017年12月20日 21:37:01

阅读数:220

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>

SpringBoot Beans管理和自动配置的更多相关文章

  1. 面试官:给我讲讲SpringBoot的依赖管理和自动配置?

    1.前言 从Spring转到SpringBoot的xdm应该都有这个感受,以前整合Spring + MyBatis + SpringMVC我们需要写一大堆的配置文件,堪称配置文件地狱,我们还要在pom ...

  2. SpringBoot原理深入及源码剖析(一) 依赖管理及自动配置

    前言 传统的Spring框架实现一个Web服务需要导入各种依赖jar包,然后编写对应的XML配置文件等,相较而言,SpringBoot显得更加方便.快捷和高效.那么,SpringBoot究竟是如何做到 ...

  3. java框架之SpringBoot(5)-SpringMVC的自动配置

    本篇文章内容详细可参考官方文档第 29 节. SpringMVC介绍 SpringBoot 非常适合 Web 应用程序开发.可以使用嵌入式 Tomcat,Jetty,Undertow 或 Netty ...

  4. SpringBoot:配置文件及自动配置原理

    西部开源-秦疆老师:基于SpringBoot 2.1.6 的博客教程 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! SpringBoot ...

  5. Springboot学习:SpringMVC自动配置

    Spring MVC auto-configuration Spring Boot 自动配置好了SpringMVC 以下是SpringBoot对SpringMVC的默认配置:==(WebMvcAuto ...

  6. SpringBoot是如何实现自动配置的?--SpringBoot源码(四)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三 ...

  7. 这一次搞懂SpringBoot核心原理(自动配置、事件驱动、Condition)

    @ 目录 前言 正文 启动原理 事件驱动 自动配置原理 Condition注解原理 总结 前言 SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本 ...

  8. SpringBoot自定义starter及自动配置

    SpringBoot的核心就是自动配置,而支持自动配置的是一个个starter项目.除了官方已有的starter,用户自己也可以根据规则自定义自己的starter项目. 自定义starter条件 自动 ...

  9. SpringBoot自动化配置之四:SpringBoot 之Starter(自动配置)、Command-line runners

    Spring Boot Starter是在SpringBoot组件中被提出来的一种概念,stackoverflow上面已经有人概括了这个starter是什么东西,想看完整的回答戳这里 Starter ...

随机推荐

  1. Andriod 简介

    Andriod系统采用分层架构,分为4层: 应用程序层(Applications) 包含所有安装在手机上的应用程序(包括系统自带的程序) 应用程序框架层(Application Framework) ...

  2. Spring-bean(一)

    配置形式:基于xml文件的方式:基于注解的方式 Bean的配置方式:通过全类名(反射),通过工厂方法(静态工厂方法&实例工厂方法),FactoryBean 依赖注入的方式:属性注入,构造器注入 ...

  3. netcdf源码在windows上的编译

    作者:朱金灿 来源:http://blog.csdn.net/clever101 今天搞搞netcdf源码在windows上的编译,折腾了半天,算是搞成了,特地记录一下过程.我的目标是要生成netcd ...

  4. qt project settings被禁用解决方案

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7422707.html qt project settings被禁用点击不了: 解决方案:需要点击该项目(或者项 ...

  5. PowerBI 应用时间智能(生成日期表)

    简介 Power BI Desktop -是一款由微软发布的自助式商业智能工具,功能强大.易于使用.其中还可以通过微软云连多个数据源并且使用数据源来创建可视化表盘. 但是几乎所有的BI都需要展示如何随 ...

  6. leetcode_268.missing number

    给定一个数组nums,其中包含0--n中的n个数,找到数组中没有出现的那个数. 解法一:cyclic swapping algorithm class Solution { public: int m ...

  7. python 网络编程篇

    基础模拟通话网络程序: #客户端 import socket client = socket.socket() client.connect(('localhost',6969)) client.se ...

  8. vue 组件内 directives指令的调用方式 <base-table v-auto-height:tableHeight="{vm:this, diffHeight:ahTable.diffHeight}"

    vue 组件内 directives指令的调用方式 <base-table v-auto-height:tableHeight="{vm:this, diffHeight:ahTabl ...

  9. C/C++语言:科学计数法

    主要用来表示浮点数,表达方便 浮点数的科学计数,由三个部分组成: a + E + b a:由一个浮点数组成,如果写成整数,编译器会自动转化为浮点数: E:可以大写E,也可以小写e: b:使用一个十进制 ...

  10. Thread和Runable的关系

    Thread 是一个类 Runnable是一个接口 Thread是实现了Runnable接口的类,使得run支持多线程 因为类的单一继承原则,推荐多使用Runnable接口