zoukankan      html  css  js  c++  java
  • 【java框架】Spring(3) -- Spring配置补充(基于Maven项目)

    1.Spring配置细节

    近期休假,刚好有时间来沉淀自己!对于Spring在做一些细节上的复习和回顾,梳理下来基于Java Maven项目来写,对于以前的Spring知识进行一些技术上更新和回顾,查漏补缺,对于Spring的知识点又有了更深的理解。下面一一罗列一下自己的学习要点!

    1.1.Bean实例化xml配置

    在Spring的配置文件ApplicationContext.xml中,Bean的实例化有三种方式:

    • 无参构造方法实例化
    • 工厂静态方法实例化
    • 工厂实例方法实例化

    ①无参构造方法实例化:

    public class UserDao implements IUserDao {
        public void save() {
            System.out.println("这是save方法!");
        }
    }

    applicationContext.xml配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="userDao" class="com.fengye.dao.impl.UserDao" scope="prototype"></bean>
    </beans>

    无参构造方法实例化即基本的xml配置bean,对应的bean类中需要有无参数的构造方法,如果显式去覆盖了无参构造方法,此时会报错如下错误:

    Caused by: java.lang.NoSuchMethodException: com.fengye.dao.impl.UserDao.<init>()

    ②工厂静态方法实例化

    public class StaticBeanFactory {
        public static IUserDao getBean(){
            return new UserDaoImpl();
        }
    }

    applicationContext.xml配置:

    <!--静态工厂创建bean-->
    <bean id="staticBeanFactory" class="com.fengye.factory.StaticBeanFactory" factory-method="getBean"></bean>

    ③工厂实例方法

    public class DynamicBeanFactory {
        public IUserDao getBean1(){
            return new UserDaoImpl();
        }
    }

    applicationContext.xml配置:

    <!--工厂实例方法创建bean-->
    <bean id="dynamicBeanFactory" class="com.fengye.factory.DynamicBeanFactory"></bean>
    <bean id="dynamic" factory-bean="dynamicBeanFactory" factory-method="getBean1"></bean>

    1.2.引入其它配置文件(分模块开发)

    在实际开发中,Spring的配置内容非常多,这就会导致Spring配置繁杂且体积很大,所以可以将部分配置拆解到其它配置文件中,而在Spring主配置文件中通过import标签进行加载:

    <!--分模块开发:引入其它文件中的xml bean配置-->
    <import resource="applicationContext-xxx.xml"></import>

    1.3.注解配置细节

    ①@Value(${Properties文件中的参数key}),用于普通属性的注入:

    如jdbc.properties文件如下:

    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/spring01_0305
    jdbc.username=root
    jdbc.password=admin

    在Service层中添加@Value注解,可以注入对应key配置的value值。

    package com.fengye.service.impl;
    
    import com.fengye.service.IUserService;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserServiceImpl implements IUserService {
        @Value("${jdbc.driverClassName}")
        private String driver;
    
        public void save() {
            System.out.println(driver);    
    }
    }

    对应applicationContext.xml配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- 配置一个DBCP的Bean destroy-method="close":每次取用关闭连接池-->
        <bean id="dateSource" class="org.apache.commons.dbcp.BasicDataSource"
              destroy-method="close">
            <!-- 注意:这里我们不是使用的ref引用,而是直接写的value,因此注入的数据是一个变通的值 -->
            <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>
    
        <!--导入外部的jdbc.properties-->
        <context:property-placeholder location="classpath:jdbc.properties" />
        <!-- 进行包的扫描,去看类上面是否有相应的标签配置 -->
        <context:component-scan base-package="com.fengye" />
        <!-- 这个不是必须的(spring3.2版本前使用) 配上后兼容性好 -->
        <context:annotation-config />
    </beans>

    2.Spring新注解

    2.1.Spring全注解替换xml文件

    Spring的注解极大的简化了配置xml的繁琐,提供了一种便捷高效的开发方式,而最新Spring新加入了@Configuration、@ComponentScan、@Bean、@PropertySource、@Import等注解,完整地替代了applicationContext.xml中的繁琐配置。

    具体如下:

    注解 说明
    @Configuration 用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解
    @ComponentScan
    用于指定Spring在初始化容器时要扫描的包。作用和Spring的xml配置文件中的
    <context:component-scan base-package="com.fengye" /> 一样
     @Bean  使用在方法上,标注将该方法的返回值存储到Spring容器中
     @PropertySource  用于加载.properties文件中的配置
     @Import  用于导入其它配置类

    基于上述配置可以抽取出如下代码进行替换并删除applicationContext.xml文件:

    ①构造核心配置类SpringConfiguration:

    @Configuration  //标志注解:标志该类是Spring的核心配置类
    @ComponentScan("com.fengye")  //配置注解扫描:相当于 <context:component-scan base-package="com.fengye" />
    @Import({DataSourceConfiguration.class})  //导入数据源类分配置,多个class文件类以","隔开
    public class SpringConfiguration {
    }

    ②抽取数据源配置类DataSourceConfiguration:

    package com.fengye.config;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.PropertySource;
    import javax.sql.DataSource;
    import java.beans.PropertyVetoException;
    
    @PropertySource("classpath:jdbc.properties")  //加载properties配置文件,对应xml中<context:property-placeholder location="classpath:jdbc.properties" />
    public class DataSourceConfiguration {
        @Value("${jdbc.driverClassName}")
        private String driverClassName;
        @Value("${jdbc.url}")
        private String url;
        @Value("${jdbc.username}")
        private String username;
        @Value("${jdbc.password}")
        private String password;
    
        @Bean("dataSource")  //告知Spring将当前方法的返回值以指定名称存储到Spring容器中
        public DataSource getDataSource() throws PropertyVetoException {
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            dataSource.setDriverClass(driverClassName);
            dataSource.setJdbcUrl(url);
            dataSource.setUser(username);
            dataSource.setPassword(password);
            return dataSource;
        }
    }

    ③对应Dao、Service层简单实现如下:

    @Service
    public class UserServiceImpl implements IUserService {
        @Value("${jdbc.driverClassName}")
        private String driver;
    
        @Autowired
        private IUserDao userDao;
    
        public void save() {
            System.out.println(driver);
            userDao.save();
        }
    }
    
    @Repository
    public class UserDaoImpl implements IUserDao {
        public void save() {
            System.out.println("这是save方法!");
        }
    }

    使用Junit进行依赖注入Bean测试,测试中删除ApplicationContext.xml配置,最终打印输出语句:

    3.Spring集成Junit测试

    3.1.Spring集成Junit步骤

    使用Spring容器来进行框架的测试主要有五个步骤,下面以Maven项目为例来说明:

    ①导入spring集成junit的依赖坐标;

    ②使用@Runwith注解表示使用spring自带的测试进行运行;

    ③使用@ContextConfiguration指定配置文件或配置类;

    ④使用@Autowired注入需要测试的对象;

    ⑤创建测试方法进行测试

    3.2.具体代码实现

    maven集成配置:

    <!--此处需要注意的是,spring5 及以上版本要求 junit 的版本必须是 4.12 及以上-->
    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-test</artifactId>
       <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.12</version>
       <scope>test</scope>
    </dependency>

    编写测试类SpringJuintTest:

    package com.fengye.test;
    
    import com.fengye.config.SpringConfiguration;
    import com.fengye.service.IUserService;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    //使用@Runwith注解替换原来的运行时
    @RunWith(SpringJUnit4ClassRunner.class)
    //使用@ContextConfiguration指定配置文件或配置类
    //@ContextConfiguration(value = {"classpath:applicationContext.xml"}) //配置文件路径方式,value一般省略
    @ContextConfiguration(classes = {SpringConfiguration.class}) //全注解方式
    public class SpringJunitTest {
        @Autowired //使用@Autowired注入需要测试的对象
        private IUserService userService;
        @Test
        public void userServiceTest(){
            userService.save();
        }
    }

    最终打印输出如下语句:

    本节Spring相关示例代码已上传至GitHub地址:

    https://github.com/devyf/SpringReview/tree/master/fengye_spring_ioc

  • 相关阅读:
    CAD开发中遇到的疑难问题整理与开发技巧
    使用jquery插件jquery.qrcode生成二维码
    小程序 跳转页面
    【已解决】Intel NUC10 拔插USB口/登录QQ/蓝牙连接等导致显示器黑屏
    element-ui表格el-table回显时默认全选数据
    设计模式
    react lib-flexible postcss-px2rem集成
    odoo 接口请求原理
    odoo 更改返回的json 格式
    git 合并两个仓库
  • 原文地址:https://www.cnblogs.com/yif0118/p/14393718.html
Copyright © 2011-2022 走看看