【Spring】面向纯注解开发

使用Spring IOC机制管理bean的时候,有三种配置方式
(1)纯xml文件配置
(2)xml文件 + 注解联合配置
(3)纯注解配置
纯xml文件配置将所有的bean配置信息都写在xml文件里,方便统一管理和修改,但是和java代码相分离,查看不直观。
纯注解配置将所有bean配置信息都写在java代码上,易于书写,查看直观,但是打成jar包后代码就不能再次修改,复用性差。
所以xml文件 + 注解联合配置bean是较为常见。一般使用xml文件配置jar包中的类创建的bean对象,使用注解配置程序员写的类创建的bean对象。
本博客将一个xml + 注解联合配置的方案转化成纯注解配置方案从而说明纯注解配置的方法

xml + 注解联合配置方案

ApplicationContext.xml


<context:component-scan base-package="controller,service,dao,domain">context:component-scan>


<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource">property>
bean>
<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver">property>
    <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=UTF-8">property>
    <property name="username" value="root">property>
    <property name="password" value="13013005866">property>
bean>

StudentDao.java

/**
 * @Repository : 和 @Component作用相同,专对dao层的bean使用
 * @Autowired : 当bean属性值是对象时,自动注入
 */
@Repository("studentDao")
@Lazy(false)
@Scope("singleton")
public class StudentDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    // 调用jdbcTemplate查询一个学生
    public Student selectOne() {
        
    }

}

要将该方案转变成纯注解配置方案,要解决一下两个问题:
(1)将扫描注解的context标签从xml文件移除。
(2)使用注解配置jdbcTemplate和dataSource两个SpringJDBC提供的对象。
方法:
创建一个配置类BeanConfig代替ApplicationContext.xml,让Spring在运行初就访问该配置类。该类主要负责扫描注解配置自定义bean和构建方法创建源码中的bean。

注意:
配置jar包中的bean可能需要创建相关配置文件,因为很多官方的对象其中的属性值可能需要临时修改,例如dataSource。

添加配置类代替xml文件

BeanConfig.java

/**
 * 该类可创建任何官方包中的类,交给Spring托管
 * @configuration :标识该类是主配置类,Spring运行之初访问该类
 * @ComponentScan :扫描自定义bean类的注解,代替context标签
 * @PropertySource : 引入配置文件,为dataSource对象提供数据支持,和@Value, SpEL联用
 * @Bean : 标识改对象需要作为bean被Spring托管
 */
@Configuration
@ComponentScan({"controller", "service", "dao", "domain"})
@PropertySource("classpath:dbConfig.properties")
public class BeanConfig {

    @Value("${driverClassName}")
    private String driverClassName;
    @Value("${url}")
    private String url;
    @Value("${user}")
    private String user;
    @Value("${password}")
    private String password;

    @Bean("dataSource")
    public DataSource createDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean("jdbcTemplate")
    public JdbcTemplate createJdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}

为配置类提供数据支持(可自行设定)

因为配置类中需要创建dataSource对象,而dataSource对象的属性是一些数据库的相关配置,在切换数据库时,属性就要进行更改。所以一般将配置数据写在配置文件中再与配置类关联。
dbConfig.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?userSSL=false&characterEncoding=UTF-8
user=root
password=13013005866

注意:
(1)配置类中关联配置文件的数据库用户名不能写成

@Value("${username}")

因为Spring中也有一个username,如果这么写,Spring会优先去读取框架中的username而不是配置文件中的username。

(2)使用纯注解配置创建BeanFactory的方式发生改变

  • 有xml文件参与配置创建BeanFactory
BeanFactory factory = new ClassPathXmlApplicationContext("ApplicationContext.xml");
  • 纯注解配置创建BeanFactory
BeanFactory factory = new AnnotationConfigApplicationContext(BeanConfig.class);

(3)BeanConfig被注解@Configuration配置后标识为主配置类,如果需要配置的官方提供的类作为bean数目过多且需要分类,那么可以根据类别再创建子配置类。然后在主配置类添加

@import(SubBeanConfig.class)

引入子配置类即可。

你可能感兴趣的:(【Spring】面向纯注解开发)