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

示例工程地址
示例工程地址