spring是一款开源框架,用来解决企业开发的复杂性。
spring框架提供了两个核心技术:
1.IOC:控制反转。把创建对象的权力交给spring框架来创建。并且管理对象的声明周期。
2.AOP:面向切面编程。在不改变源码的基础上可以对原有代码进行扩展。
IOC的使用
之前在使用springmvc中由于需要在Controller类中创建其他类的对象,这样会导致代码耦合度高,为了解决这个问题,spring框架为我们提供了IOC技术来实现代码的解耦。
控制反转(Inversion Of Control, IOC),是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度。其中最常见的方式为依赖注入(Dependency Injection, DI)。
- IOC:控制反转,由spring容器创建对象并管理对象的声明周期。
- DI:依赖注入,spring会自动注入该类所依赖的属性。
为了更好地理解Spring是如何使用IOC的,这里最开始将通过配置文件的方式实现bean的生成和管理。
1.引入spring依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
2.创建spring配置文件
<?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">
<!--把Teacher 对象交给spring管理.
bean表示一个对象.
id: bean的唯一标识
class: 表示要创建对象的全类名
-->
<bean id="teacher" class="com.aaa.Teacher"></bean>
</beans>
3.获取该类对象测试
public class Test {
public static void main(String[] args) {
//获取spring容器。
ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
//从容器中获取指定的对象。这里spring容器帮助我们创建了Teacher类的对象
Teacher teacher= (Teacher) app.getBean("teacher");
teacher.show();
}
}
获取bean的方式
从spring容器获取bean对象的方式有三种。
1.根据id获取bean对象
//获取spring容器。
ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
//从容器中获取指定的对象。---测试目的就是想让大家知道容器帮你创建Teacher类的对象。
Teacher teacher= (Teacher) app.getBean("teacher");
这种方式的缺点是id需要强制转换,一点强制转换就可能出现数据安全问题。
2.根据反射类获取bean对象
Teacher teacher = app.getBean(Teacher.class);
teacher.show();
这种方式的缺点是如果存在多个该类型的对象时将容器将无法判断产生报错。
3.根据id和反射类获取bean对象
Teacher teacher = app.getBean("teacher",Teacher.class);
使用注解完成bean的创建
在配置文件中创建bean标签的方式无法应对多个java类文件时的需求,当java类过多,也同样需要在配置文件中写入多个bean,为此spring提供了注解来帮助创建bean对象。我们只需要在spring配置文件中添加包扫描器,让spring扫描到用到spring注解的地方即可。
这里通过添加Component注解就实现了bean对象的创建,括号内的内容为bean的id值,可以省略不写。
除了Component注解还有其他注解也能实现bean对象的创建。
- @Controller: 控制层类
- @Service:业务层类
- @Repository:数据层类
这些注解的作用和@Component注解的作用是一样的。主要目的是为了区分不同业务层的bean对象。
bean的作用域
- spring一共提供了四种作用域:
- singleton:单例。 --spring只创建一次对象。如果不指明作用域默认为该作用域。
- prototype:多例。 --每次得到bean都会创建新的bean。
- request: 当请求时创建bean对象。
- session: 一次会话中共享一个bean。
DI依赖注入
借助spring注解可以完成bean对象的创建。但如果一个类依赖另一个类对象。单独创建bean就不起作用了,这个时候我们可以使用spring的DI功能。
DI(Dependency Injection):依赖注入,是给对象中的属性注入相应的值。
依赖注入也可以依靠注解完成,但为了更加理解依赖注入是如何作用的,将从如何设置配置文件开始讲解。
由于之前spring为我们创建了bean对象,我们只需要在配置文件中说明依赖关系的维护即可。
一种方法是通过在spring的配置文件中,为bean中添加<property> 标签,其中name为存在于该bean对应的实体类的属性,我们需要通过为该属性设置set方法用于接收,ref代表要关联的另一个bean的id值。
或者我们也可以通过构造方法为bean对象注入值。
<bean id="t2" class="com.ddd.Teacher">
<constructor-arg name="name" value="李四"/>
<constructor-arg name="age" value="19"/>
</bean>
通过注解实现依赖注入
如果通过在配置文件说明依赖关系就又需要写bean了,这样还是会出现一旦关系过多配置文件就变得难以维护。为此spring也提供了注解实现了依赖注入。
@Autowired:这个注解实现了自动设置依赖关系的绑定,我们只需要使用这个注解放在需要注入的对象上即可,无需关系配置文件中bean的配置。
SSM框架的使用
SSM即spring、springmvc和mybatis框架。通过之前的学习已经可以构建三个框架的结合使用,这将极大地提升开发效率。
由于springmvc的依赖包本身包含spring,所以我们需要做的是将spring与mybatis结合。
1.添加依赖
这里我们需要分别添加mybatis连接spring的依赖,spring连接jdbc的依赖以及一个数据库连接池依赖。数据库连接池用来管理数据库对象的创建,这样我们就不用再编写mybatis连接数据库的代码了。
<!--mybatis整合spring的依赖.3.0以后要求jdk9以上-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!--spring-jdbc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
<!--druid连接池: 存放连接数据库对象的池子。-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.23</version>
</dependency>
2.编写spring的配置文件
这里的配置跟之前相比,多了mybatis的配置,我们将mybatis的配置文件也写成一个bean对象,然后利用SqlSessionFactoryBean将spirng与mybatis连接,这里还需要MapperScannerConfigurer用来扫描mapper接口,使得mybatis能够找到方法并调用。
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--先配置springmvc的配置-->
<context:component-scan base-package="com.aaa"/>
<!--开启注解驱动-->
<mvc:annotation-driven/>
<!--放行静态资源-->
<mvc:default-servlet-handler/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--==========================整合mybatis的配置=========================================================-->
<!--数据源===druid-->
<bean id="ds" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/day1211"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<!--连接池的初始化个数-->
<property name="initialSize" value="5"/>
<!--连接池的最大连接个数-->
<property name="maxActive" value="10"/>
<!--最大等待时长-->
<property name="maxWait" value="5000"/>
</bean>
<!--配置spring和mybatis的整合类SqlSessionFactoryBean。集成mybatis配置文件中的内容。。-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--指定数据源。-->
<property name="dataSource" ref="ds"/>
<!--指定映射文件的路径-->
<property name="mapperLocations" value="classpath:/mapper/*.xml"/>
</bean>
<!--为dao接口生成代理实现类,并且该类对象交给spring管理。自动注入给其他层的对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--为哪些包下的接口生成代理实现类。-->
<property name="basePackage" value="com.aaa.mapper"/>
</bean>
</beans>
至此已经完成了SSM框架的整合。
如果想要在tomcat启动时就加载spring的配置文件,可以在web.xml配置中增加一个<load-on-starup>的标签,1代表启动服务器就进行一次加载。这样就不用等到方法调用时才加载spring的配置文件。
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<!--当启动tomcat时加载spring的配置文件。
如果不写,当第一次访问接口时加载
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
编码过滤
spring框架提供了一个编码过滤器的配置,可以根据自身需要设置,也可以手动编写一个过滤器类实现。 下例代码编写在spring配置文件下。根据自身的需求进行更改。
<!--定义编码过滤器-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--指定编码的值。默认ISO-8859-1-->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<!--是否设置请求的编码-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!--是否设置响应的编码-->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>