zoukankan      html  css  js  c++  java
  • Spring纯注解配置

    待改造的问题

    我们发现,之所以我们现在离不开 xml 配置文件,是因为我们有一句很关键的配置:
    <!-- 告知spring框架在,读取配置文件,创建容器时,扫描注解,依据注解创建对象,并存入容器中 -->
    <context:component-scan base-package="com.itheima"></context:component-scan>
    如果他要也能用注解配置,那么我们就离脱离 xml 文件又进了一步。
    另外,数据源和 JdbcTemplate 的配置也需要靠注解来实现。
    <!-- 配置 dbAssit -->
    <bean id="dbAssit" class="com.itheima.dbassit.DBAssit">
    <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 配置数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    <property name="jdbcUrl" value="jdbc:mysql:///spring_day02"></property>
    <property name="user" value="root"></property>
    <property name="password" value="1234"></property>
    </bean>
    

    新注解说明

    @Configuration

    作用:
    用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要使用
    AnnotationApplicationContext(有@Configuration 注解的类.class)。
    属性:
    value:用于指定配置类的字节码
    

    实例:

    示例代码:
    /**
    * spring 的配置类,相当于 bean.xml 文件
    * @author 
    * @Company 
    * @Version 1.0
    */
    @Configuration
    public class SpringConfiguration {
    }
    注意:
    我们已经把配置文件用类来代替了,但是如何配置创建容器时要扫描的包呢?
    请看下一个注解。
    

    @ComponentScan

    作用:
    用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:
    <context:component-scan base-package="com.itheima"/>是一样的。
    属性:
    basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样。
    示例代码:
    /**
    * spring 的配置类,相当于 bean.xml 文件
    * @author 
    * @Company 
    * @Version 1.0
    */
    @Configuration
    @ComponentScan("com.itheima")
    public class SpringConfiguration {
    }
    注意:
    我们已经配置好了要扫描的包,但是数据源和 JdbcTemplate 对象如何从配置文件中移除呢?
    请看下一个注解。
    

    @Bean

    作用:
    该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。
    属性:
    name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id)。
    
    /**
    * 连接数据库的配置类
    * @author 
    * @Company 
    * @Version 1.0
    */
    public class JdbcConfig {
    /**
    * 创建一个数据源,并存入 spring 容器中
    * @return
    */
    @Bean(name="dataSource")
    public DataSource createDataSource() {
    try {
    ComboPooledDataSource ds = new ComboPooledDataSource();
    ds.setUser("root");
    ds.setPassword("1234");
    ds.setDriverClass("com.mysql.jdbc.Driver");
    ds.setJdbcUrl("jdbc:mysql:///spring_day02");
    return ds;
    } catch (Exception e) {
    throw new RuntimeException(e);
    }
    }
    /**
    * 创建一个 DBAssit,并且也存入 spring 容器中
    * @param dataSource
    * @return
    */
    @Bean(name="runner")
    @Scope("prototype")  //配置QueryRunner为多列对象 防止多个dao调用使线程混乱
    public QueryRunner createDBAssit(DataSource dataSource) {
    return new DBAssit(dataSource);
    }
    }
    注意:
    我们已经把数据源和 DBAssit 从配置文件中移除了,此时可以删除 bean.xml 了。
    但是由于没有了配置文件,创建数据源的配置又都写死在类中了。如何把它们配置出来呢?
    请看下一个注解。
    

    @PropertySource

    用于加载.properties 文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到
    properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。
    属性:
    value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath:
    
    配置:
    /**
    * 连接数据库的配置类
    * @author 黑马程序员
    * @Company http://www.ithiema.com
    * @Version 1.0
    */
    public class JdbcConfig {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    /**
    * 创建一个数据源,并存入 spring 容器中
    * @return
    */
    @Bean(name="dataSource")
    public DataSource createDataSource() {
    try {
       ComboPooledDataSource ds = new ComboPooledDataSource();
       ds.setDriverClass(driver);
       ds.setJdbcUrl(url);
       ds.setUser(username);
       ds.setPassword(password);
       return ds;
        } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }
    }
    
    
    jdbc.properties 文件:
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/day44_ee247_spring
    jdbc.username=root
    jdbc.password=1234
    注意:
    此时我们已经有了两个配置类,但是他们还没有关系。如何建立他们的关系呢?
    请看下一个注解。
    

    @Import

    作用:
    用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解。当然,写上也没问
    题。
    属性:
    value[]:用于指定其他配置类的字节码。
    示例代码:
    @Configuration
    @ComponentScan(basePackages = "com.itheima.spring")
    @Import({ JdbcConfig.class})
    public class SpringConfiguration {
    }
    @Configuration
    @PropertySource("classpath:jdbc.properties")
    public class JdbcConfig{
    }
    注意:
    我们已经把要配置的都配置好了,但是新的问题产生了,由于没有配置文件了,如何获取容器呢?
    请看下一小节。
    

    通过注解获取容器:

    ApplicationContext ac =new AnnotationConfigApplicationContext(SpringConfiguration.class);
    
  • 相关阅读:
    SpringCloud Config 配置中心
    MySQL 8.0版本安装后,安装目录下找不到my.ini文件
    MySQL 跨库JOIN
    SpringCloud Ribbon 自定义负载均衡算法
    idea部署tomcat,日志打印显示乱码问题解决
    centos7配置回环网卡地址
    INV*物料接收子库存更新
    AP*供应商更新
    AR*Hz_Parties 客户表更新
    MyBatis-Plus自动生成代码
  • 原文地址:https://www.cnblogs.com/zgrey/p/13358752.html
Copyright © 2011-2022 走看看