@Configuration注解用于指定配置类,一般所有的配置类都需要加上这个注解。但是也有例外:如果不写@Configuration注解,那么会将Spring的IoC容器会将AnnotationConfigApplicationContext构造方法中的参数作为配置类;因此,作为参数传入的配置类的@Configuration注解可用不写。
@Import注解用于导入其他配置类。在实际开发过程中,可能不止一个配置类。例如和Spring相关的配置作为一个住配置类,和连接数据库相关的配置类作为一个子类。当使用@Import注解之后,使用@Import注解的配置类就是主配置类,导入的配置类就是子配置类。此时,子类就不需要再写@Configuration注解。
@ComponentScan/@ComponentScans注解用于指定Spring在创建容器时要扫描的包,前者用于指定一个包,后者用于指定多个包。这就相当于xml配置文件中的<context:component-scan>中的basePackages属性。
@Bean注解用于把当前方法的返回值作为Bean对象存入IoC容器。当方法上有@Bean注解时,Spring会在容器中查找有没有和参数对应的可用bean对象,查找方式和@Autowired注解的方式相同。这就相当于xml配置文件中的Bean标签。
@PropertySource注解用于指定要使用的properties文件的位置。
最终这些注解在代码中的使用如下:
@Configuration @ComponentScan("com.crud") @Import(JdbcConfig.class) /** 主配置类 */ public class SpringConfig { } /** jdbc配置类 */ @PropertySource("classpath:jdbcConfig.properties") public class JdbcConfig { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.user}") private String user; @Value("${jdbc.password}") private String password; /** 根据数据源创建QueryRunner对象,必须是多例的,否则会出现线程安全问题 */ @Bean("queryRunner") @Scope("prototype") public QueryRunner createQueryRunner(DataSource dataSource){ return new QueryRunner(dataSource); } /** 创建数据源对象 */ @Bean("dataSource") public DataSource createDataSource(){ try{ ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); comboPooledDataSource.setDriverClass(driver); comboPooledDataSource.setJdbcUrl(url); comboPooledDataSource.setUser(user); comboPooledDataSource.setPassword(password); return comboPooledDataSource; }catch (Exception e){ e.printStackTrace(); throw new RuntimeException(e); } } } 4.测试有一点需要修改,就是在获取容器时,不能再使用ClassPathXmlApplicationContext类,而应该使用AnnotationConfigApplicationContext,如下:
//参数是类字节码,可以传入多个类的字节码,作为参数的配置类可以不写@Configuration注解 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class); 5.@Bean注解的查找方式@Bean创建Bean对象的方式后的查找方法和@Autowired注解相同,如果有多个名称匹配,就需要用到@Qualifier注解来指定用哪个匹配。例如,jdbcConfig类可以修改为如下:
/** * 根据数据源创建QueryRunner对象,必须是多例的,否则会出现线程安全问题 * @Qualifier注解用于解决多个类型匹配时的问题 * @param dataSource * @return */ @Bean("queryRunner") @Scope("prototype") public QueryRunner createQueryRunner(@Qualifier("ds2") DataSource dataSource){ return new QueryRunner(dataSource); } /** * 创建数据源对象 * @return */ @Bean("ds1") public DataSource createDataSource(){ try{ ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); comboPooledDataSource.setDriverClass(driver); comboPooledDataSource.setJdbcUrl(url); comboPooledDataSource.setUser(user); comboPooledDataSource.setPassword(password); return comboPooledDataSource; }catch (Exception e){ e.printStackTrace(); throw new RuntimeException(e); } } @Bean("ds2") public DataSource createDataSource1(){ try{ ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); comboPooledDataSource.setDriverClass(driver); comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test"); comboPooledDataSource.setUser(user); comboPooledDataSource.setPassword(password); return comboPooledDataSource; }catch (Exception e){ e.printStackTrace(); throw new RuntimeException(e); } } 五、Spring整合Junit