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
示例工程地址
示例工程地址