目录
@Configuration
作用:指定当前类是一个配置类。可用于实现与xml配置相同的功能。
获取容器:
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
@ComponentScan
作用:用于通过注解指定Spring在创建容器时要扫描的包
属性:
- basePackages(同value):指定创建容器时要扫描的包
示例:
@Configuration
@ComponentScan(basePackages = "com.lj")
public class SpringConfiguration{
}
使用此注解等同于在xml文件中的配置:
<context:component-scan base-package="com.lj"></context:component-scan>
@Bean
作用:用于把当前方法的返回值作为bean对象存入Spring的Ioc容器。
属性:
- name:指定bean的id。不写时的默认值是当前方法的名称。
示例:
@Configuration
@ComponentScan(basePackages = "com.lj")
public class SpringConfiguration{
@Bean(name = "runner")
@Scope("prototype")
public QueryRunner createQueryRunner(DataSource dataSource){
return new QueryRunner(dataSource);
}
@Bean(name = "dataSource")
public DataSource createDataSource(){
try{
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/db");
ds.setUser("root");
ds.setPassword("123456");
return ds;
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
当使用@Bean注解配置方法时,如果方法有参数(例如上述示例中createQueryRunner方法的参数:DataSource dataSource),Spring框架会去容器中查找有没有可用的bean对象,查找规则同@Autowired注解。上述示例中使用id为dataSource的bean对象注入createQueryRunner方法的形参。
@Import
作用:用于导入其他的配置类
属性:
- value:指定其他配置类的字节码。当使用@Import注解之后,有@Import注解的类是父配置类,导入的都是子配置类。
示例:
当将上述配置类SpringConfiguration.java分解为多个配置类时,例如分解为一个主配置类SpringConfiguration.java和一个数据源配置类JdbcConfig.java,都放在包config下。
第一种写法:
/**
* 当配置类作为AnnotationConfigApplicationContext对象创建时的参数时,
* @Configuration注解可以不写。
*/
//@Configuration
@ComponentScan(basePackages = {"com.lj", "config"})
public class SpringConfiguration{
}
@Configuration
public class JdbcConfig{
@Bean(name = "runner")
@Scope("prototype")
public QueryRunner createQueryRunner(DataSource dataSource){
return new QueryRunner(dataSource);
}
@Bean(name = "dataSource")
public DataSource createDataSource(){
try{
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/db");
ds.setUser("root");
ds.setPassword("123456");
return ds;
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
//获取容器
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
该种写法必须在SpringConfiguration.java的@ComponentScan的扫描包中加上config包,并且在JdbcConfig.java中使用@Configuration注解。
第二种写法:
/**
* 当配置类作为AnnotationConfigApplicationContext对象创建时的参数时,
* @Configuration注解可以不写。
*/
//@Configuration
@ComponentScan(basePackages = "com.lj")
public class SpringConfiguration{
}
//@Configuration
public class JdbcConfig{
@Bean(name = "runner")
@Scope("prototype")
public QueryRunner createQueryRunner(DataSource dataSource){
return new QueryRunner(dataSource);
}
@Bean(name = "dataSource")
public DataSource createDataSource(){
try{
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/db");
ds.setUser("root");
ds.setPassword("123456");
return ds;
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
//获取容器
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class, JdbcConfig.class);
这种写法直接在创建ApplicationContext对象时传入两个配置类的字节码,但是无法体现两个配置类的主次关系。
第三种写法:使用@Import注解
/**
* 当配置类作为AnnotationConfigApplicationContext对象创建时的参数时,
* @Configuration注解可以不写。
*/
//@Configuration
@ComponentScan(basePackages = "com.lj")
@Import("JcbcConfig.class")
public class SpringConfiguration{
}
public class JdbcConfig{
@Bean(name = "runner")
@Scope("prototype")
public QueryRunner createQueryRunner(DataSource dataSource){
return new QueryRunner(dataSource);
}
@Bean(name = "dataSource")
public DataSource createDataSource(){
try{
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/db");
ds.setUser("root");
ds.setPassword("123456");
return ds;
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
//获取容器
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
@PropertySource
作用:用于指定properties文件的位置
属性:
- value:指定文件的名称和路径。关键字classpath用于表示文件是在类路径下。
示例:
改造上述数据源的配置。新建文件jdbcCconfig.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db
jdbc.username=root
jdbc.password=123456
//@Configuration
@ComponentScan(basePackages = "com.lj")
@Import("JcbcConfig.class")
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfiguration{
}
public class JdbcConfig{
@Value("${jdbc.driver}")
private String dirver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean(name = "runner")
@Scope("prototype")
public QueryRunner createQueryRunner(DataSource dataSource){
return new QueryRunner(dataSource);
}
@Bean(name = "dataSource")
public DataSource createDataSource(){
try{
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(driver);
ds.setJdbcUrl(url);
ds.setUser(username);
ds.setPassword(password);
return ds;
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
@Qualifier注入方法参数
示例:存在多个数据源时,创建QueryRunner对象时使用@Qualifier注解指定数据源注入形参。
public class JdbcConfig{
@Value("${jdbc.driver}")
private String dirver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean(name = "runner")
@Scope("prototype")
public QueryRunner createQueryRunner(@Qualifier("ds1") DataSource dataSource){
return new QueryRunner(dataSource);
}
@Bean(name = "ds")
public DataSource createDataSource(){
try{
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(driver);
ds.setJdbcUrl(url);
ds.setUser(username);
ds.setPassword(password);
return ds;
}catch(Exception e){
throw new RuntimeException(e);
}
}
@Bean(name = "ds1")
public DataSource createDataSource1(){
try{
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(driver);
ds.setJdbcUrl("jdbc:mysql://localhost:3306/db1");
ds.setUser(username);
ds.setPassword(password);
return ds;
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
上述代码使用id为ds1的bean对象给createQueryRunner方法的形参注入依赖。