Spring

Spring是分层的Java SE/EE应用全站轻量级开源框架,以Ioc反转控制和AOP面向切面编程为内核

提供展现层SpringMVC和持久层Spring JDBCTemplate以及业务层事务管理等众多的企业级应用技术

方便解耦,简化开发

通过Spring提供的Ioc容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码

AOP编程的支持

通过Spring的AOP功能,方便进行面向切面编程,许多不容易用传统OOP实现的功能可以通过AOP轻松实现

声明式事务的支持

可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量

方便测试

Spring开发步骤
  1. 导入Spring开发的基本包坐标
  2. 编写Dao接口和实现类
  3. 创建Spring核心配置文件
  4. 在Spring配置文件中配置UserDaoImpl
  5. 使用Spring的API获得Bean实例

Spring配置文件

Bean标签
Bean标签基本配置

用于配置对象交由spring来创建

默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功

基本属性:

  • id:Bean实例在Spring容器中的唯一标识
  • class:Bean的全限定名称
Bean标签范围配置

scope:指对象的作用范围

取值范围 说明
singleton 默认值,单例的
prototype 多例的
request web项目中,Spring创建一个Bean对象,将对象存入到request域中
session web项目中,Spring创建一个Bean对象,将对象存入到session域中
global session web项目中,应用在Portlet环境,如果没有Portlet环境那么globalSession相当于session

singleton:

当Spring核心文件被加载时,实例化配置的Bean实例

  • 对象创建:当应用加载,创建容器时,对象创建
  • 对象运行:容器存在,对象存在
  • 对象销毁:当应用销毁,销毁容器时,对象销毁

prototype:

当调用getBean()方法时实例化Bean

  • 对象创建:当使用对象时,创建新的对象实例
  • 对象运行:对象在使用,即存在
  • 对象销毁:当对象长时间不使用,被Java垃圾回收器回收了
Bean生命周期配置

init() ;destory();

Bean实例化三种方式
  • 无参构造
  • 工厂静态
  • 工厂实例
Bean的依赖注入
Bean的依赖注入分析

因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在Spring容器中,将UserDao设置到UserService内部

Bean的依赖注入概念

依赖注入:Spring框架核心IOC的具体实现

在编写程序时,通过控制反转,把对象的创建交给Spring,但是代码中不可能出现没有依赖的情况

IOC解耦只是降低依赖关系,并不会消除。

坐等框架把持久层对象传入业务层,而不用自己去获取

Bean的依赖注入方式
  • 构造方法
  • set方法

set方法注入:

P命名空间注入本质也是set方法注入,更加方便

首先引入P命名空间

xmlns:p="http://www.springframework.org/schema/p"

其次,修改注入方式

<bean id="userService" class="xxx.xxx.UserServiceImpl" p:userDao-ref="userDao"/>

构造方法注入

首先撰写构造方法

然后修改注入方式,形同普通注入

<constructor-arg name="userDao" ref="userDao"></constructor-arg>
Bean的依赖注入数据类型

注入数据的三种数据类型:

  • 普通数据类型
  • 引用数据类型
  • 集合数据类型
引入其他配置文件(分模块开发)

Spring配置文件拆解,通过import标签进行加载

<import resource='applicationContext-xxx.xml'/>
Spring重点配置
<bean>标签
    id属性:在容器中Bean实例的唯一标识,不允许重复
    class属性:要实例化的Bean的全限定名
    scope属性:Bean的作用范围,常用的是Singleton(默认)和prototype
    <property>标签:属性注入
        name属性:属性名称
        value属性:注入的普通属性值
        ref属性:注入的对象引用值
        <list>标签
        <map>标签
        <properties>标签
    <constructor-arg>标签
<import>标签:导入其他的Spring的分文件

Spring相关API

ApplicationContext实现类
  • ClassPathXmlApplicationContext:从类的根路径下加载配置文件(resources路径)
  • FileSystemXmlApplicationContext:从磁盘路径加载配置文件,配置文件可以在磁盘的任意位置
  • AnnotationConfigApplicationContext:使用注解配置容器对象时,需要用此类创建Spring容器,读取注解
getBean()方法使用
  • 利用id传递,getBean("userService") ,多个
  • 利用字节码传递,getBean(userService.class) ,单个

Spring配置数据源

数据源(连接池)的作用
  • 数据源提高程序性能
  • 事先实例化数据源,初始化部分连接资源
  • 使用连接资源时从数据源获取
  • 使用完毕将连接资源归还数据源

常见数据源(连接池):DBCP,C3P0,BoneCP,Druid

数据源开发步骤

导包–创建数据源对象–设置基本连接数据–使用数据源

Spring配置数据源

将DataSource的创建权交给Spring容器

@Test
    //测试Spring容器产生 c3p0数据源对象
    public void test4() throws Exception {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        DataSource datasource = (DataSource) applicationContext.getBean("dataSource1");
        Connection connection = datasource.getConnection();
        System.out.println(connection);
        connection.close();
    }
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/student"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
抽取jdbc配置文件

applicationContext.xml加载jdbc.properties配置文件获得连接信息

首先引入context命名空间和约束路径:

  • 命名空间:xmlns:context="http://www.springframework.org/schema/context"
  • 约束路径:http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

<!--    加载外部的properties文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

Spring注解开发

Spring原始注解

Spring注解代替xml配置文件可以简化配置,提高开发效率

原始注解主要是替代的配置

注解 说明
@Component 使用在类上用于实例化Bean
@Controller 使用在web层类上用于实例化Bean
@Service 使用在service层类上用于实例化Bean
@Repository 使用在dao层类上用于实例化Bean
@Autowried 使用在字段上用于根据类型依赖注入
@Qualifier 结合@Autowried一起使用用于根据名称进行依赖注入
@Resource 相当于@Autowried+@Qualifier,按照名称进行注入
@Value 注入普通属性
@Scope 标注Bean的作用范围
@PostConstruct 使用在方法上标注该方法是Bean的初始化方法
@PreDestroy 使用在方法上标注该方法是Bean的销毁方法

注意:

使用注解开发,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法

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

Spring整合Junit

Spring集成Junit步骤
  1. 导入spring集成Junit坐标
  2. 使用@Runwith注解替换原来的运行期
  3. 使用@ContextConfiguration指定配置文件或配置类
  4. 使用@Autowired注入需要测试的对象
  5. 创建测试方法进行测试