一、Spring简介
Rod Johnson发明,此人是一个轮子理论(不重复造轮子)推崇者,所以设计了Spring框架提高开发效率,直接使用框架的方法。
1)Spring核心功能
1.IOC / DI :控制反转/依赖注入
2.AOP : 面向切面编程
3.声明式事务
2)Spring框架runtime(运行时环境)
首先Spring其实就是一个大容器,但Spring框架的基本容器是 Core Container,也就是想要跑起来Spring框架的最低标准。
1.Test:Spring提供的测试功能
2.Core Container:Spring框架的核心容器。Spring启动的最基本的条件
Beans:负责创建类对象并管理对象
Core:核心类
Context:上下文参数,获取外部资源或者管理注解等
SpEL:expression.jar,Spring的一种表达式语言(类似于JSTL)
3.AOP:实现aop功能需要依赖
4.Aspects:切面AOP依赖的包
5.DataAccess/Integration:Spring封装数据访问层(DAO)相关内容
JDBC:Spring对JDBC封装后的代码
ORM:封装了持久层(DAO)框架的代码。例如Hibernate
transactions:对应 spring-tx.jar 声明式事务使用
6.WEB:需要Spring完成web相关功能的时候使用
例如:由tomcat加载Spring配置文件时需要由Spring-web包
3)Spring框架种重要概念
1.容器(container):Spring当作一个大的容器
2.BeanFactory接口:为Spring的老版本接口 新版本中ApplicationContext 接口是BeanFactory的子接口。
3.再Spring3 开始吧Spring框架的功能拆分成多个jar(Spring2之前就一个jar包)
二、IOC简介
IOC(inversion of Control):控制反转,IOC的主要功能就是之前程序员需要通过new进行实例化对象的事情,转交给Spring负责完成。
控制:控制类的对象 反转:交给Spring负责
最大的作用就是:解耦,开发人员不需要管理对象,解除了对象管理和开发人员之间的耦合
三、Spring环境搭建
1)导入jar包
Spring的基本运行环境是Core Container下的四个包以及一个日志包(commons-logging)
2)在src下新建 applicationContext.xml
1.文件名称和路径自定义
2.applicationContext.xml配置的信息最终存储到了ApplicationContext容器种
3.Spring的配置文件applicationContext.xml是基于schema的
schema的文件扩展名是.xsd,可以理解为DTD的升级版(DTD:可实现xml文件的自动补全功能)
每次引入一个xsd文件就是一个namespace(xmlns)命名空间
4.配置文件中只需要引入基本schema,以后需要什么引入什么,可以在官方文档中查找。
<通过bean/>创建对象,且默认在配置文件被加载时就将对象创建
<?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">
<!-- id 表示获取到对象标识
class 创建哪个类的对象
-->
<bean id="peo" class="com.bjsxt.pojo.People"/>
</beans>
在java中添加测试方法
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
People people = ac.getBean("peo",People.class);
System.out.println(people);
getBean(“<bean>标签 id 值”,返回值类型);如果没有第二个参数, 默认是 Object
getBeanDefinitionNames(),Spring 容器中目前所有管理的所有对象
四、Spring创建对象的三种方式
1)通过构造方法创建
1.无参构造方法:默认
2.有参构造方法:需要明确在xml文件中配置,并且在类中提供有参构造方法。
在applicationContext.xml中设置调用哪个构造方法创建对象,如果设定的条件匹配多个构造方法的时候,则执行最后的那个构造方法。
<bean id="peo" class="com.bjsxt.pojo.People">
<!-- ref 引用另一个 bean value 基本数据类型或String 等 -->
<constructor-arg index="0" name="id" type="int" value="123">
</constructor-arg>
<constructor-arg index="1" name="name" type="java.lang.String" value="张三"></constructor-arg>
</bean>
2)通过实例工场创建
工厂设计模式:帮助创建类对象,一个工厂可以生产多个对象,且可以根据用户需求创建不同的对象。
实例工场:必须先创建工厂,然后才能生产对象
public class PeopleFactory {
public People newInstance(){
return new People(1,"测试");
}
}
在applicationContext.xml中配置工厂对象和需要创建的对象
<bean id="factory" class="com.bjsxt.pojo.PeopleFactory"></bean>
<bean id="peo1" factory-bean="factory" factory-method="newInstance"></bean>
factory-bean:工厂的id factory-method:工厂创建对象的方法名
3)通过静态工厂创建
所谓静态工厂,即不需要创建工厂,可以直接生产对象。
public class PeopleFactory {
public static People newInstance(){
return new People(1,"测试");
}
}
<bean id="peo2" class="com.bjsxt.pojo.PeopleFactory" factory-method="newInstance"></bean>
五、Spring简化MyBatis
1. 导 入 mybatis 所 有 jar 和 spring 基 本包,spring-jdbc,spring-tx,spring-aop,spring-web,spring 整合 mybatis 的包等。
2.先配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!-- 上下文参数 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- spring 配置文件 -->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 封装了一个监听器,帮助加载 Spring 的配置文件爱 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
3.编写 spring 配置文件 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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 数据源封装类 .数据源:获取数据库连接,spring-jdbc.jar 中-->
<bean id="dataSouce" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"></property>
<property name="username" value="root"></property>
<property name="password" value="smallming"></property>
</bean>
<!-- 创建 SqlSessionFactory 对象 -->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据库连接信息来源于 dataSource -->
<property name="dataSource" ref="dataSouce"></property>
</bean>
<!-- 扫描器相当于 mybatis.xml 中 mappers 下 package 标签,扫描 com.bjsxt.mapper 包后会给对应接口创建对象-->
<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 要扫描哪个包 -->
<property name="basePackage" value="com.bjsxt.mapper"></property>
<!-- 和 factory 产生关系 -->
<property name="sqlSessionFactory" ref="factory"></property>
</bean>
<!-- 由 spring 管理 service 实现类 -->
<bean id="airportService" class="com.bjsxt.service.impl.AirportServiceImpl">
<property name="airportMapper" ref="airportMapper"></property>
</bean>
</beans>
4. 编写代码
4.1 正常编写 pojo
4.2 编写 mapper 包下时必须使用接口绑定方案或注解方案(必须有接口)
4.3 正常编写 Service 接口和 Service 实现类
3.3.1 需要在 Service 实现类中声明 Mapper 接口对象,并生成
get/set 方法
4.4 spring 无法管理 Servlet,在 service 中取出 Servie 对象
@WebServlet("/airport")
public class AirportServlet extends HttpServlet {
private AirportService airportService;
@Override
public void init() throws ServletException
{
/*
* 对 service 实例化
* ApplicationContext ac = new
*/
ClassPathXmlApplicationContext( "applicationContext.xml" );
/* spring 和 web 整合后所有信息都存放在 */
webApplicationContextApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext( getServletContext() );
airportService = ac.getBean( "airportService", AirportServiceImpl.class );
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("list", airportService.show());
req.getRequestDispatcher("index.jsp").forward(req, resp);
}
}