注意:
1.spring并没有代替mybatis,mybatis是Dao层的框架,spring是贯穿三层的,可以和mybatis等整合。
2.单独使用spring最主要的目的不是为了简化代码,最主要是为了解耦
3.下面方法使用的注入方式为set注入,注入方式只有两种,另外一种是构造方法注入,但是一般不用
4.配置jdbc的时候,四个值,其中username值,会和“用户名”这个系统量冲突,所以可以使用user等不同于username的值
也可以使用jdbc.username将它和用户名区分开
5。引入的sping相关的jar包,最好同一个版本
6.入门案例里边是用service层调用dao层来示范,有一个问题,遇到很多次,下图中圈起来的部分到底是使用全类名还是使用类名将首字母小写。
在这个spring配置文件中已经给这个包起别名了,所以不能用全类名来写。
过程:
spring:贯穿三层的框架(半成品的软件) 可以单独每层,每层都使用spring会提升效率
为什么要使用spring:
1.解耦,传统的没有使用框架的项目,servlet层调用service层是直接new出来一个serviceImpl类,和service类的耦合性强。不符合设计原则(高内聚低耦合)。spring项目可以将service等(被调用的)资源整合起来放在spring容器中,由spring管理,需要new的时候,从容器里取,这样,servlet和service类的耦合性就会降低。
2.spring成为了一个规范,可以高效编程
spring的关键实现
1.AOP(面向切片编程)
2.IOC (控制反转)
不使用框架时,可能会使用servlet类中new一个service接口的实现类,通过这个实现类再来调用dao接口的mybatis映射来执行真正对数据库的操作。
使用xml配置:
在pom.xml中导入使用到的坐标,使用spring框架,在service中声明一个dao接口,然后给这个dao接口配set方法,之后再resources下创建applicationConfig.xml文件,这个文件是spring的配置文件。在这个文件里,用《bean》标签来注入对象,在《bean》里边注入需要注入的资源。例如:
注意点:。
2.在applicatioConfig.xml文件中,主要有
1.标签:注入对象
id属性
是唯一标识注入,当然这个属性是为了调用的时候,如果只是注入,不需要调用,则不需要这个id属性。
class属性:
让spring容器来管理的类的类型。这个必须要写 创建对象所在全路径
scope属性
:这个有5个值,
- singleton:创建单例对象,这个对象只有一个(默认就是这个值)
- prototype:创建的对象每一个都是不一样的。
- request:在请求域,,针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
- session:针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
- global session:global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。
总结:scope默认是singleton,一般开发大多数情况下保持默认就好了。有时候会修改为prototype。另外三个一般接触不到
name属性:
功能和id一样 ,id不能包含特殊符号,name可以(基本不用,为了满足struts1遗留问题)
* init-method属性(了解)
:在创建资源对象后,自动调用的方法。初始化的操作
* destory-method属性(了解)
:在容器对象销毁的时候,自动调用的方法。
3,入门案例
3.1 导包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
3.2 定义资源(service)
3.3 配置
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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1.创建spring控制的资源-->
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>
</beans>
3.4 定义应用程序
public class UserApp {
public static void main(String[] args) {
//2.加载配置文件,创建spring的容器对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//3.获取资源
UserService userService = (UserService) ctx.getBean("userService");
userService.save();
}
}
`
## 依赖注入 DI
如何理解DI:和iOC描述的是同一个事情,DI是从应用程序角度,A依赖B,把B注入到spring容器。
IOC:是从spring的角度,从被动调用的角度,转换成为主导控制new的角度。
### 5.1 set注入
在bean标签内部使用property标签:
* name属性 : 属性的名称
* value属性: 普通类型的数据
* ref属性 : 对象类型的数据
<img src="assets/image-20210419143206985.png" alt="image-20210419143206985" style="zoom:80%;" />
### 5.2 构造方法注入(了解)
在bean标签内部使用contrustor-arg标签:
* name属性 : 构造方法形参的名称
* value属性 :普通类型的数据
* ref属性 : 对象类型的数据
### 5.3 list集合数据注入
```xml
<bean id="" class="">
<propery name="">
<list>
<value>数据</value>
<value>数据</value>
<value>数据</value>
</list>
</property>
</bean>
5.4 properties集合数据注入
<bean id="" class="">
<propery name="">
<props>
<prop key="">值</prop>
<prop key="">值</prop>
<prop key="">值</prop>
</props>
</property>
</bean>
6,读取外部的properties配置文件
-
编写properties配置文件
username=root pwd=123321
-
在spring配置文件中读取properties配置文件
<!--2.加载配置文件--> <context:property-placeholder location="classpath:*.properties"/>
注意:spring定义的用于描述配置文件的位置。classpath表示配置文件在类路径下
-
使用properties数据
${key}
7,多xml配置文件
7.1 在创建容器对象时加载所有的配置文件(了解)
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext*.xml");
7.2 在主配置文件中引入其他的配置文件
<import resource="配置文件名称">
8,ApplicationContext体系结构
BeanFactory(接口)
|--ApplicationContext(接口) : 引入了容器的思想
|--ClassPathXmlApplicationContext : 读取类路径下的配置文件,并创建容器对象
|--FileSystemXmlApplicationContext : 读取文件系统下的配置文件,并创建容器对象
|--AnnotationConfigApplicationContext : 读取注解类,并创建容器对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUnVssGJ-1618918548314)(assets/image-20210419164119104.png)]
遇到的问题
1、Error : java 不支持发行版本5
解决:
https://blog.csdn.net/qq_22076345/article/details/82392236
2、运行后,控制台一直停止不下来
druid出错记录:com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl error
这是百度到的解决方案:
https://blog.csdn.net/qq_43488978/article/details/108855112
但是使用后发现不管用,如下图,我是使用jdbc.properties文件中写入连接数据库的信息,然后用下图的语句导入文件,是通配符。注意:就是这个,具体原因不详,可能是java和druid的版本导致的,不能用这个通配符,将修改为jdbc就可以解决。
3.运行后报错:Loading class `com.mysql.jdbc.Driver’. This is deprecated警告处理,jdbc更新处………………‘com.mysql.cj.jdbc.Driver’……这样的报错信息,循环出现
解决:将pom.xml中mysql-connect-java的版本修改为5版本,
出现的原因:jdbc 5版本使用的驱动是;com.mysql.jdbc.Driver,但是8版本使用的是不同的,所以会有问题
4、运行后报错:
查看:控制台打印的错误说明是什么,如果看不懂,百度,如果没有解决,继续下边的步骤
检查1:所有jar包的版本是否有较大的问题
检查2:所有的组件是否都有,都正确引入、注入
检查3:sql语句复制到数据库可视化工具里,看是否能正确运行
检查4:是否某个单词拼写错误
检查5:和标准资料对比,发现不同