zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    模拟登陆+数据爬取 (python+selenuim)
    matplotlib基本使用(矩形图、饼图、热力图、3D图)
    tensorflow进阶篇-4(损失函数1)
    CS231n学习笔记-图像分类笔记(下篇)
    CS231n学习笔记-图像分类笔记(上篇)
    numpy 基本使用1
    tensorflow基础篇-2
    tensorflow进阶篇-3
    tensorflow基础篇-1
    自定义滚动条第一版
  • 原文地址:https://www.cnblogs.com/chengxuxiaoyuan/p/12159096.html
Copyright © 2011-2022 走看看