您的位置:首页 > 编程语言 > Java开发

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

2017-12-20 21:37 375 查看

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是方法名
public UserDao createUserDao(){
return new JdbcUserDao();
}

@Bean(name="bookDao")
public BookDao createBookDao(){
return new JdbcBookDao();
}

}


创建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
public void regist() {
System.out.println("用户注册处理");
}

}


创建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标记,适用于组件扫描加载。

@EnableAutoConfiguratio
4000
n

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值

private String password;//注入password值

//省略set和get方法

}


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

注意:@ConfigurationProperties需要@EnabledAutoConfiguration或@SpringBootApplication开启自动配置才能用。
@ComponentScan
@Configuration
@EnableAutoConfiguration
public class MyBootApplication {

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



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

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

SpringBoot连接池应用

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

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

SpringBoot默认连接池

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

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

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

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

(需要引入hikaricp.jar支持)

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

(需要引入dbcp.jar支持)

没有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")
@ConfigurationProperties(prefix="db.datasource2")
public DataSource createDbcp2(){
//      BasicDataSource ds = new BasicDataSource();
//      return ds;
DataSource ds = DataSourceBuilder.create()
.type(BasicDataSource.class).build();
return ds;
}

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

}


数据源连接参数定义:
#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//注入
private JdbcTemplate template;

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: