Spring基础1
动力节点spring视频总结
视频链接:https://www.bilibili.com/video/BV1ii4y1K72R
- spring是什么
spring是为了解决企业开发的复杂性创建的轻量级java开发框架,spring的核心思想是IOC(控制反转)和AOP(面向切面编程)。
IOC可以简单理解为:原本需要手动创建对象,有了spring以后,交给spring创建,控制权给了spring,所以叫控制反转。
AOP可以简单理解为:java开发中有许多重复性的事务管理代码,把这些代码抽离出来,交给spring管理,只需要关注一些具体功能的代码实现。
- spring体系结构
- 创建spring项目
1.正常创建一个maven项目
2 .在pom.xml文件中添加spring依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
3.建立如图文件
service包中有SomeService接口和他的实现类SomeServiceImpl。
SomeService接口里只有一个doSome方法,无参数无返回值,在SomeServiceImpl里实现类doSome方法,并打印输出一句话“执行了doSome方法”。
resources目录是资源目录,而applicationContext.xml是spring的核心配置文件,可以任意取名字,但一般默认为是applicationContext.xml。在applicationContext.xml中,定义了spring管理的类
4.在SomeTest测试类
首先需要加载配置文件,然后通过getBean的方式,从spring容器中获取到SomeServiceImpl类对象,可以调用doSome方法。
正常情况下,我们可以通过new一个SomeServiceImpl的类对象来直接调用doSome方法
现在我们通过spring来创建对象,看似麻烦,实则这是spring的核心思想之一IOC(控制反转)的体现。
- 基于XML的DI(注入)
bean 实例在调用无参构造器创建对象后,就要对 bean 对象的属性进行初始化。初始化是由容器自动完成的,称为注入。
根据注入方式的不同,常用的有两类:set 注入、构造注入
1.set 注入
1.1简单类型注入
1.2引用类型注入
当指定 bean 的某属性值为另一 bean 的实例时,通过 ref 指定它们间的引用关系。ref 的值必须为某 bean 的 id 值
2.构造注入
构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。即使用构造器设置依赖关系。
3.引用类型属性自动注入
对于引用类型属性的注入,也可不在配置文件中显示的注入。可以通过为标签设置 autowire 属性值,为引用类型属性进行隐式自动注入(默认是不自动注入引用类型属性)。根据自动注入判断标准的不同,可以分为两种:
byName:根据名称自动注入
byType: 根据类型自动注入
3.1 byName:根据名称自动注入
容器是通过调用者的 bean 类的属性名与配置文件的被调用者 bean 的id 进行比较而实现自动注入的
3.2byType: 根据类型自动注入
使用 byType 方式自动注入,要求:配置文件中被调用者 bean 的 class 属指定的类,要与代码中调用者 bean 类的某引用类型属性类型同源。即要么相同,要么有 is-a 关系(子类,或是实现类)。但这样的同源的被调用 bean
只能有一个。多于一个,容器就不知该匹配哪一个了
- 基于注解的DI(注入)
使用注解,将不再需要在 Spring 配置文件中声明 bean 实例
需要在spring配置文件中配置组件扫描器,用于指定基本包的扫描注解。
可以使用(,)或者(;)分割多个包
不建议直接指定顶级的父包,扫描的时间边长,指定合适的包即可
- 定义Bean的注解@Component
需要在类上使用注解@Component,该注解的 value 属性用于指定该bean 的 id 值。
Spring 还提供了 3 个创建对象的注解:
@Repository 用于对 DAO 实现类进行注解
@Service 用于对 Service 实现类进行注解
@Controller 用于对 Controller 实现类进行注解
这三个注解与@Component 都可以创建对象,但这三个注解还有其他的含义
@Service 创建业务层对象,业务层对象可以加入事务功能,
@Controller注解创建的对象可以作为处理器接收用户的请求。
@Repository,@Service,@Controller 是对@Component 注解的细化,标注不同层的对象。即持久层对象,业务层对象,控制层对象。
@Component 不指定 value 属性,bean 的 id 是类名的首字母小写 - 简单类型的value注入
需要在属性上使用注解@Value,该注解的 value 属性用于指定要注入的值。
使用该注解完成属性注入时,类中无需 setter。当然,若属性有 setter,则也可将其加到 setter 上。
- byType 自动注入@Autowired
需要在引用属性上使用注解@Autowired,该注解默认使用按类型自动装配 Bean 的方式。
- byName 自动注入@Autowired 与@Qualifier
需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier的 value 属性用于指定要匹配的 Bean 的 id 值。
@Autowired 还有一个属性 required,默认值为 true,表示当匹配失败后,会终止程序运行。若将其值设置为 false,则匹配失败,将被忽略,未匹配的属性值为 null - JDK 注解@Resource 自动注入
Spring 提供了对 jdk 中@Resource 注解的支持。@Resource 注解既可以按名称匹配 Bean,也可以按类型匹配 Bean。默认是按名称注入。
- 注解与XML配置文件的对比
注解优点是: 方便, 直观,高效(
注解缺点:以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。
XML 方式优点是:配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载。
xml 的缺点是:编写麻烦,效率低,大型项目过于复杂。