Spring(一)

Spring

Spring新特性—注解的方式

SpringIOC容器(XML+注解)
SpringAOP编程(XML+注解)
Spring整合JDBC以及事务管理(XML+注解)
趋势:提倡零配置(比如SpringBoot大量使用了注解)

  • **
  • Spring框架概述
    是一个开源的设计层面框架,它解决的是业务逻辑层和其他各个层面的松耦合问题,因此它将采用面向接口的编程思想,–轻量级的java框架

Spring是一个一站式的java开源框架,可以解决开发层次中各个方面的问题:

这里写图片描述

Spring官网
spring.io

这里写图片描述

IOC:控制反转,不是技术,而是一种思想,
在java开发中,IOC意味着你将设计好的对象交给容器控制,而不是传统的你在对象内部直接控制, ioc必须明确谁控制了谁,控制了什么,为何是反转,哪些方面反转了

谁控制谁,控制了什么?传统javaSE中,我们直接在对象内部通过new来创建对象,是程序主动去创建依赖对象,而IOC是一个专门的容器来创建这些对象,即由IOC容器去控制对象的创建,IOC容器控制了对象的创建,控制了外部资源获取(不只是对象比如文件等)

为何是反转?传统应用程序是由我们自己在对象中主动控制去直接获取依赖,也就是正转,而反转是由容器来帮忙创建以及注入依赖对象。因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转,依赖对象的获取被反转了

IOC的好处:面向对象的法则,松耦合更优良,有了IOC容器后,把创建和查找对象依赖的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间的关系是松耦合,这样也方便测试,利于功能复用,使得程序变得更加灵活

IOC容器帮助对象找到对应的依赖对象并注入,而不是对象主动去找依赖对象

工厂设计模式设计一个简单的IOC容器

IOC容器就是一个底层设计思想:工厂模式:

这里写图片描述

IOC容易本质就是工厂
BeanFactory:
加载properties文件

这里写图片描述

这里写图片描述

这里写图片描述

Bean工厂就是模拟IOC容器:
这里写图片描述

SpringIOC的XML方式
1)创建对象
下载spring框架资源:
这里写图片描述

这里写图片描述
把必须导入的jar包导入到项目:
IOC需要的jar包,commons-logging (额外的apache的日志包)

这里写图片描述

编写一个applicationContext.xml文件
这里写图片描述

这里写图片描述

并没有通过new来创建对象

ApplicationContext接口的常用方法

ApplicationContext  ac = new ClassPathXmlApplicationContext("applicationContext.xml");

Spring核心–ApplicationContext接口主要用于初始化SpringIOC容器;
实现类:
这里写图片描述
ApplicationContext的实现类:
ClassPathXmlApplicationContext :使用类路径的方式初始化IOC容器
FileSystemApplicationContext:使用文件系统的方式初始化IOC容器

这里写图片描述

这里写图片描述

推荐使用类路径ClassPathXmlApplicationContext

bean的scope属性:
实际上就是单例和多例的问题:
scope配置

singleton:创建一个单例的对象
prototype:每次创建一个对象(多例)
request:用在web项目中,一个请求创建一个对象
session:用在web项目中,一个会话创建一个对象
scope默认是singleton的,不写也代表singleton

这里写图片描述

会输出5次相同的对象

将scope设置为prototype:
每次输出的对象都是不同的;

scope配置应用场景:
1)action对象:装在页面参数,每个不同,所以必然是多例的
2)service对象:单例
3)dao对象:应该设置为单例的,包括数据库连接池等都是单例的

bean的声明周期方法:
init-method:初始化方法
destory-method:销毁的方法

具体的方法名称需要在bean中定义:

这里写图片描述

这里写图片描述

destory方法的调用:
必须要把bean的scope定以为singleton
这里写图片描述

IOC进行依赖注入:
构造方法参数注入:

这里写图片描述
配置bean
构造方法注入是通过:constructor-arg进行注入的
这里写图片描述

这里写图片描述

setter方法注入:
最常用的注入方法
这里写图片描述

注意生成setter方法:
这里写图片描述
覆盖了有参构造函数,必须再写一个无参构造,否则无法初始化(因为有参构造方法默认会覆盖无参构造)

p名称空间注入

在bean配置xml文件中导入p名称空间:
这里写图片描述

也是必须依赖于setter方法

这里写图片描述
注入普通String字符串

这里写图片描述

注意:p名称空间简化setter方法注入,所以必须要有setter方法
p:属性:注入普通的数据(例如String)
p:属性-ref :注入javaBean对象(例如CustomerDao)

spEL表达式注入
spEL表达式,:SpringEL表达式,是Spring3.0之后的特性

spEL表达式使用#{…}作为界定符,所有在大括号中的字符都将被认为是SpEL

这里写图片描述

这里写图片描述

2)依赖注入
注入不同的数据类型:(整合框架的重点)
普通数据类型: value属性 <value>
JavaBean对象:ref属性
List集合 :list
Map集合:map
Properties:props
注入普通数据类型:
这里写图片描述

这里写图片描述

注入javaBean:
这里写图片描述
这里写图片描述

注入数组:
这里写图片描述
注入list
这里写图片描述

注入map:
键key和值value都可以是值或者对象 key/key-ref value/value-ref

这里写图片描述
注入Properties数据
但是key和value一定是字符串,没有key-ref,prop标签没有value属性,必须在prop标签之间声明

这里写图片描述

Spring注解的方式
1)创建对象
导入spring-aop的包(必须依赖)
编写配置文件:开启IOC注解功能
依然是在applicationContext.xml

引入context的名称空间
这里写图片描述
base-package:开启IOC注解类所在的包(子包可以扫描到)

这里写图片描述

@Component//默认名称为类名 ,首字母小写 name属性可以修改bean的名称,等同于bean id class指的是当前类

在需要创建的类的顶部加上注解

这里写图片描述

这里写图片描述

如果不加入spring-aop的包,则会报错

SpringIOC常用的注解
@Conmponent:创建对象(普通的Spring项目
@Repository:和@Conmponent作用是一样的,都是用来创建对象(分层项目–Dao层
@Service :和@Conmponent作用是一样的,都是用来创建对象(分层项目–Service层
@Controller:和@Conmponent作用是一样的,都是用来创建对象(分层项目–Web层

Spring为了区分不同层次的对象,设计了不同的注解以作不同的标识,方便对对象的管理

这里写图片描述

@scope:单例和多例(对应的是XML中的scope属性的配置,有四种值:singleton、prototype)

这里写图片描述

@PostConstruct:初始化的方法(对应init-method)
@PreDestroy:销毁的方法(对应destroy-method)

这里写图片描述

注解基本和XML文件的配置是对应的,其实就是和XML配置的另外一种方式

2)依赖注入
SpringIOC依赖注入 注解
@Value:注入普通数据类型
@Autowired:自动根据类型注入
@Qulifer:指定注入的对象的名称
@Resource:即能根据类型自动注入,也可以根据对象名称注入

Value注解:

这里写图片描述

由于基本数据类型基本不会直接在代码中写入值,所以在applicationContext.xml中配置加载的properties:

这里写图片描述
在代码中使用EL表达式来获取值,从properties中读取值

@Autowired
自动根据类型(接口)进行注入,直接赋值给变量,无须提供一些构造方法或者setter方法,本质上是通过反射来实现
如果Spring的环境中没有CustomerDao的类型,那么就会注入失败

这里写图片描述
如果一个接口是两个实现类,那么也会报错无法注入

@Qualifier注解:
可以根据具体的实现类去注入—根据Service的value去注入
当我们@Autowired出现多个相同类型的对象的时候,可以使用@Qulifier指定需要注入对象的具体名称
注入customerDao1:

这里写图片描述

@Resource:
既能根据类型注入,也可以根据对象名称进行注入
根据类型注入:
这里写图片描述

根据类型注入:
这里写图片描述

可以同时代替@Autowired和@Qulifier

对比@Autowired和@Resource
1)注入方式不同,@Autowired只能根据类型进行注入,如果需要根据名称注入需要@Qulifier;@Resource既可以根据类型自动注入,也可以根据对象名称进行注入

2)所属的标准不同:
@Autowired来自于Spring框架
@Resource来自于JavaEE标准
@Resource注解会比@Autowired更加标准

推荐使用@Resource

Spring新注解(零配置注解)—不需要任何配置文件

@Configuration
作用:配置类,用于代替applicationContext.xml文件
也不需要开启注解,先见一个类
SpringConfig类,代替整个配置文件

@ComponentScan
作用:代替<context:component-scan/>标签

这里写图片描述

类路径方式加载 这个已不再适用:
这里写图片描述
更改为:
通注解配置类:

这里写图片描述

@PropertySource
作用,代替<context:property-placeholader/>标签
记载properties配置文件的信息

这里写图片描述

@Import

作用:可以同时导入多个配置类:代理spring中<import>
这里写图片描述

@Bean
作用;可以把一个对象放入SpringIOC容器中
也可以执行该方法的代码
这里写图片描述
注意:必须是用在方法上,不能是类上

@Bean vs @Resource /@Autowired?

@Resource和@Autowired是从SpringIOC容器和获取一个指定类型或者指定名称的对象

@Bean:执行某个方法,把方法的返回的对象,放入SpringIOC容器

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值