Spring中用配置类代替配置xml文件

Posted 红颜莫知己

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring中用配置类代替配置xml文件相关的知识,希望对你有一定的参考价值。

1.Configuration注解

这个注解的意义就是:

只要包含这个configuration注解的类就是配置类

2.ComponentScan注解

@ComponetScan代替xml配置中的

<context:component-scan base-package="edu.xalead"/>

@ComponetScan默认扫描该注解所在的包及子包,如果要扫的类,并不在该注解所在的包及子包下,和指定basePackages属性的值用于指定要扫描的包,这个属性的值是一个字符串数组,可以配置多个独立的包

@Configuration
@ComponentScan
public class MyConfig {
}

在这里插入图片描述
basePackages可以包含多个包名

@Configuration
@ComponentScan(basePackages = {"包名","包名","包名"})

3.注解配置工厂的获取

  • xml配置工厂的获取是这样的:
BeanFactory beanFactory = new ClassPathXmlApplicationContext("beanFactory.xml");
  • 注解配置工厂的获取:
BeanFactory beanFactory = new AnnotationConfigApplicationContext(MyConfig.class);

4.Bean注解

  • Bean注解额作用就是将方法里返回的对象放入spring工厂

我们在xml文件中配置阿里数据源(Druid)是这样配置的:

具体操作请访问博客Spring连接阿里数据源(Druid)

<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/cms"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
    </bean>

我们现在用配置类来配置

@Configuration
@ComponentScan
public class MyConfig {

    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/cms");
        ds.setUsername("root");
        ds.setPassword("");
        return ds;
    }
}

Bean()注释默认名字为方法名,我们也可以取别名

测试:

public void test5(){
        BeanFactory beanFactory = new AnnotationConfigApplicationContext(MyConfig.class);
        //两种从工厂中获取方法,通过名字和类名
        //DataSource dataSource = (DataSource)beanFactory.getBean("dataSource");
        DataSource dataSource = beanFactory.getBean(DataSource.class);
        Connection connection = null;

        try {
            connection =  dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述

5.Import注解

  • 我们一开始说道,只要有@Configuration注解的都是配置类,如果其它的配置类也想省略@Configuration注解,则必须在工厂默认使用的配置类中使用@Import注解把配置类引用进来

就比如我们写一个DataSourceConfig类,然后将其变为配置类,加上@Configuration注解

@Configuration
public class DataSourceConfig {
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/cms");
        ds.setUsername("root");
        ds.setPassword("");
        return ds;
    }
}

如果你想省去@Configuration注解的话就可以这样写:

@Configuration
@ComponentScan
@Import(DataSourceConfig.class)
public class MyConfig {
}

但其实在真正开发中我们两个注解都写,以防出错

6.Spring属性配置文件及PropertySource注解

我们在开发中连接数据库是不会像上面那样连接的,那样连接局限性太大了,如果你要改换数据库将会非常麻烦,所以我们在属性配置文件里面写数据库的连接数据

jdbc.peoperties

jdbc.driverclass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/cms
jdbc.username=root
jdbc.password=

beanFactory.xml

 <context:property-placeholder location="jdbc.properties"/>
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="driverClassName" value="${jdbc.driverclass}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

DataSourceConfig实体类

@Configuration
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfig {
    @Value("${jdbc.driverclass}")
    private String driverClass;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driverClass);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }
}

测试:

public void test5(){
        BeanFactory beanFactory = new AnnotationConfigApplicationContext(MyConfig.class);
//        DataSource dataSource = beanFactory.getBean(DataSource.class);
        DataSource dataSource = (DataSource)beanFactory.getBean("dataSource");
        Connection connection = null;

        try {
            connection =  dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述

7.Spring和junit的集成

添加spring test库的坐标

<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.1.9.RELEASE</version>
    <scope>test</scope>
</dependency>
  • 导入spring整合junit的jar(坐标)
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
</dependency>
  • 使用Junit提供的一个注解把原有的main方法替换了,替换成spring提供的 @Runwith

  • 告知spring的运行器,spring和ioc创建是基于xml还是注解的,并且说明位置

@ContextConfiguration
locations:指定xml文件的位置,加上classpath关键字,表示在类路径下
classes:指定注解类所在地位置

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyConfig.class)
public class TestSpringintergration {};

特别注意:当我们使用spring 5.x版本的时候,要求junit的jar必须是4.12及以上

测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyConfig.class)
public class TestSpringintergration {
    @Autowired
    private User user;

    @Test
    public void test1(){
        System.out.println(user);
    }
}

若有误,请指教!

以上是关于Spring中用配置类代替配置xml文件的主要内容,如果未能解决你的问题,请参考以下文章

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea(

SM框架新特性关于用Java配置类完全代替XML

Spring源码解析之基础应用

Spring xml配置文件相对路径问题

spring框架学习笔记3:使用注解代替配置文件

spring中用xml配置构造注入的心得