spring学习3:spring ioc的纯注解配置
spring ioc的纯注解配置
一、分析
在上一篇博客中实现了xml+注解的ioc使用,我们发现,之所以离不开xml配置文件的原因是在该文件中有一句很关键的话,告知spring在创建容器时要扫描的包,依据扫描到的注解创建对象并放入容器中。
<!-- 开启注解扫描,告知spring在创建容器时要扫描的包 --> <context:component-scan base-package="com.lyy.service"> </context:component-scan>
并且如果要使用第三方提供的类的对象,我们也只能在配置文件中配置该bean,如数据库连接池的对象
<!-- 配置连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean>
如果可以把这两部分也通过注解来完成,就可以不使用xml配置文件。
二、新注解说明
2.1 @Configuration
作用:
用于指定当前类是一个 spring 配置类, 当创建容器时会从该类上加载注解。 获取容器时需要使用 AnnotationApplicationContext(有@Configuration 注解的类.class)。
属性:
value,用于指定配置类的字节码文件
2.2 @ComponentScan
作用:
用于指定 spring 在初始化容器时要扫描的包。和配置文件中的context:component-scan
标签作用一样
属性:
basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样
2.3 @Bean
作用:
该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器
属性:
name,给创建的对象指定一个名称(即 bean 的 id)
2.4 @PropertySource
作用:
用于加载.properties 文件中的配置
属性:
value[],用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath:
2.5 @Import
用于在一个配置类上导入另一个配置类,导入后就可以在当前配置类上使用导入此配置类中的内容
属性:value,指定其他配置类的字节码
三、通过配置类获取容器
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
四、举例:使用纯注解对实现账户的crud操作
工程的整体结构和使用注解+xml配置时一样,
两个配置类
JdbcConfiguration
/** * 数据库连接配置类 */ @Configuration @PropertySource(value = "classpath:db.properties") public class JdbcConfiguration { @Value("${jdbc.driverClassName}") private String driverClassName; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; /** * 创建dataSource的bean * * @return */ @Bean(name = "dataSource") public DataSource createDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } }
SpringConfiguration
@Configuration @ComponentScan(basePackages = "com.lyy") @Import(value = JdbcConfiguration.class) public class SpringConfiguration { /** * 创建 common-dbutils的核心对象 * @return */ @Bean(name="queryRunner") public QueryRunner createQueryRunner(@Qualifier("dataSource") DataSource dataSource){ return new QueryRunner(dataSource); } }
最后在获取spring容器时要使用AnnotationConfigApplicationContext
示例工程地址
示例工程地址