Spring

Spring概述

什么是Spring

Spring是一个开放源代码的设计层面框架,
解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。
Spring是于2003 年兴起的一个轻量级的Java 开发框架
简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

spring特点

1.方便解耦,简化开发

通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

2.AOP编程的支持

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

3.声明式事务的支持

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

4.方便程序的测试

可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。

5.方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。

6.降低Java EE API的使用难度

Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)
提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。

7.Java 源码是经典学习范例

Spring的源码设计精妙、结构清晰、匠心独运,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。

下载

下载地址

 https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring

IOC

什么IOC

IOC: Inversion of Control(控制反转)
控制反转:将对象的创建权反转给(交给)Spring。

传统开发模式

业务和实现类过于紧密,底层业务要修改源代码

通过工厂可以实现,接口与实现业务的分离

在工厂内部使用配置文件加载

使用spring-IOC

1.添加jar包

将复制的Jar包复制到工程lib文件夹当中,编译一下

 

一个接口,两个不同数据库的实现

UserDao

package com.qc.demo;

public interface UserDao {

    public void save();

    public void delete();

}  

UserDaoMysqlImpl

package com.qc.demo;

public class UserDaoMysqlImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("mysql-save");
    }

    @Override
    public void delete() {
        System.out.println("mysql-delete");
    }
}

UserDaoOracleImpl

package com.qc.demo;

public class UserDaoOracleImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("Oracle-save");
    }

    @Override
    public void delete() {
        System.out.println("Oracle-delete");
    }
}    

2.创建配置文件

通常名称起为applicationContext.xml[创建在src下]

<?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">
</beans>

3.添加配置文件

<!--
    id: 为自己起的名称
    class: 为接口实现类的全路径
-->
<bean id="userDao" class="com.qc.demo.UserDaoMysqlImpl"></bean>

4.测试使用

@Test
public void demo(){
        // 1.加载配置文件
        ApplicationContext applicationContext =
        new ClassPathXmlApplicationContext("classpath:applicationContext.xml");

        // 2.参数为配置文件当中<bean>的id
        UserDao userDao = (UserDao)applicationContext.getBean("userDao");
        userDao.save();
        userDao.delete();
}

假如现在需求变了,我要改为Oracle的实现我们就只需要更改配置文件就行了

再去测试类运行,结果如下

IOC与DI

DI

依赖注入

前提必须有IOC的环境
Spring管理这个类的时候才能将类的依赖的属性值注入(设置)进来
依赖注入:给spring管理类当中依赖的属性,通过配置文件进行赋值的过程

传统方式

DI方式

1.实现类当中的属性要提供set方法

2.在配置文件当中配置依赖注入

测试

Spring的工厂类

BeanFactory

老版本使用方式
当调用getBean的时候才会创建实例对象

ApplicationContext

新版本使用方式
当加载配置文件时候就会创建实例对象

ApplicationContext实现类

1.ClassPathXmlApplicationContext
加载类路径下的配置文件

2.FileSystemXmlApplicationContext [了解就行,企业基本用第一种]
加载文件系统下盘符里面的配置文件

Bean相关配置

名称与标识

id: 使用了约束中的唯一约束。里面不能出现特殊字符的

name: 没有使用约束中的唯一约束。里面可以出现特殊字符。

设置对象的生命周期方法

init-method: Bean被初始化的时候执行的方法

destroy-method: Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)

如果想要某个对象,创建的时候调用某个方法,销毁的时候调用某个方法,该类当中就必须存在被调用的方法

 

在加载配置文件的时候对象就会帮你创建好

销毁

Bean是单例创建

Bean的作用范围的配置 

scope

singleton: 默认的,Spring会采用单例模式创建这个对象。

prototype: 多例模式。

request: 应用在web项目中,Spring创建这个类以后,将这个对象存入到request范围中。

session: 应用在web项目中,Spring创建这个类以后,将这个对象存入到session范围中

globalsession: 应用在web项目中,必须在porlet(基于Java的Web组件,子域名)环境下使用。但是如果没有这种环境,相对于session。

工厂实例化的方式

无参构造-默认

测试

静态工厂实例化

测试

实例工厂实例化

测试

分模块配置

在加载时,添加多个配置文件名称

在一个配置文件当中引入另一个配置文件[开发当中经常使用的形式]

Spring属性注入

构造方法的方式的属性注入

测试

Set方法的属性注入

测试

Set方法设置对象类型的属性

 

 测试

P名称空间的属性注入

使用p名称空间,就不需要写那那么多的property

使用时,要添加名称空间

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

spEL表达式的属性注入

测试

可以把另外一个对象的属性,甚至是对象里面的方法,然后他就把他的结果,进行赋值。

测试

集合类型属性注入

数组

测试

List集合

测试

Set集合

 

 测试

Map集合

测试

IOC注解方式快速入门

在spring4之后,想要使用注解形式,必须得要引入aop的包

在配置文件当中,还得要引入一个context约束

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       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">
</beans>

配置组件扫描

哪个包下的类型使用组件扫描

在类开上添加注解

配置IDEA注解支持

测试

使用注解注入属性

可以不用提供set方法,直接在属性名上添加@value("值")

测试

如果提供了set方法,在set方法上添加@value("值");

测试

IOC注解详解

@Component

修改一个类,将这个类交给Spring管理  相当于在配置文件当中配置<bean id=""  class="">

@Component三个衍生注解

为了更好的进行分层,Spring可以使用其它三个注解,功能类似,目前使用哪一个功能都一样, 后期可能会添加一些属于各自的属性
@Controller web层
@Service service层
@Repository dao层

属性注入

@Value 设置普通属性值

@Autowired

设置对象类型的属性值,直接使用这种方式,是按照类型完全属性注入[使用Autowired注入,注入的对象必须交给了Spring管理]

不需要在注解上使用id名称

习惯是按照名称完成属性注入,必须让@Autowired【根据类型注入】注解与@Qualifier【根据名称注入】一起使用

单独使用 @Resource

@PostConstruct 初始化方法

@PreDestroy 销毁方法

@scope 作用范围【单例: singleton,多例: prototype

关于包扫描

XML与注解比较

XML可以适用任何场景 ,结构清晰,维护方便,注解不是自己提供的类使用不了,开发简单方便

XML与注解整合开发

XML管理Bean

注解完成属性注入

使用过程中, 可以不用扫描,扫描是为了类上的注解

在没有扫描的情况下, 使用属性注解@Resource @Value @Autowired @Qulifier

<context:annotation-config/>

posted @ 2020-01-31 11:19  Leader_TBlog  阅读(191)  评论(0编辑  收藏  举报