目录
一、概念
Spring 框架是一个集众多设计模式于一身的开源的、轻量级的项目管理框架。
Spring框架致力于JAVAEE 轻量级解决方案,提供一个以简单的、统一的、高效的方式构造整个应用,并且可以将单层框架(MVC编程思想:model模型(Dao、Service)、view视图(view)、controller控制(action))以最佳的组合糅合在一起建立一个连贯的体系。
二、Spring框架的核心作用
Spring框架用来管理、创建、使用、销毁项目中的组件,由于Spring框架生产和保存项目中组件对象,可称Spring是一个工厂、容器。
组件:项目中的service、dao、action(controller) 都是项目中的组件,spring框架通常不管理对entity对象的创建(entity一般自己创建)
三、第一个环境搭建
1.引入依赖
<dependency><!--spring核心-->
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--spring容器支持-->
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--spring容器支持-->
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--主要实现ioc模块-->
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--对web环境的支持和工具-->
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--aop相关-->
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--aop相关-->
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--aop相关-->
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency><!--数据库资源管理和错误处理-->
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
2.引入配置文件(任意名字、任意位置),resources中的spring.xml(推荐放在resources中,但对名字无任何规范要求)
<?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">
</beans>
3.组件接口和实现
package com.baizhi.dao;
public interface UserDao {
void save(String name);
}
package com.baizhi.dao;
public class UserDaoImpl implements UserDao{
@Override
public void save(String name) {
System.out.println("姓名:" + name);
}
}
4.通过工厂管理
5.启动工厂测试
//通过配置文件启动工厂
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
//通过getBean("bean的名字")获得工厂创建的对象
UserDao userDao = (UserDao) ctx.getBean("userDao");
userDao.save("张三");
四、Spring的两大核心编程思想
-
IOC (Inversion of Control,控制反转)
获得依赖对象的过程由自身管理(自己new创建对象)变为了通过容器(Spring)进行DI(dependency injection ,依赖注入)。
2.AOP(Aspect Oriented Programming,面向切面的编程)
将额外功能(加在一系列操作中的冗余代码)都放到通知中,然后和切入点组成切面。
一个切面指的就是一个(动态)代理对象。
五、依赖注入方式
1.SET方式注入
类里提供成员变量和对应的set方法(get方法可以不提供)
在配置文件需要被注入的类的bean
标签的标签体里按需求添加对应property
标签:
2.自动注入
自动注入使用SET方式注入组件对象。类里提供成员变量和对应set方法(get方法可以不提供)。
<!--被注入的对象上加入 autowire-->
<!--
byType,根据类型注入,要求同一个工厂里不能有同类型的bean
byName,要求变量名必须一致
-->
<bean class="com.baizhi.service.CityServiceImpl" id="cityService" autowire="byType"></bean>
3.构造方式注入(了解)
类里提供成员变量(同时提供有参、无参)
public CityServiceImpl() {
}
public CityServiceImpl(Integer age, Date bir, CityDao cd) {
this.age = age;
this.bir = bir;
this.cd = cd;
}
在被注入的类的bean里写:
<!--
对应构造函数的三个参数
index:参数的下标,下标从0开始
name:参数的名字
value或ref:注入的内容
-->
<constructor-arg index="0" name="age" value="15"/>
<constructor-arg index="1" name="bir" value="2022/01/11 12:30:05"/>
<constructor-arg index="2" name="cd" ref="cityDao"/>
4.和SET方式注入的本质区别(了解)
-
set : 先创建对象,调用无参构造,再通过set方法给成员变量赋值
-
构造方法注入: 在创建对象的同时给成员变量赋值,在设计上是强制给成员变量赋值。
六、Spring工厂的特性
-
默认在工厂中管理的对象都是单例的,全局唯一,只创建一次。
可配置为原型(可以认为是“多例”)模式,常用于Struts2的Action(每次请求都需要创建)
<bean class="xxx.XxxAction" id="xxxAction" scope="prototype"></bean>
-
Spring工厂原理(了解)。
使用反射来创建对象。
-
UserDAOImpl userDAO = (UserDAOImpl) Class.forName("com.baizhi.dao.UserDAOImpl").newInstance(); System.out.println(userDAO);
-
bean的生命周期。
-
对象创建:随着工厂启动,创建单例bean。原型bean在使用时创建。
-
对象销毁:随着工厂关闭,销毁单例bean。原型bean不会随着工厂关闭销毁。(了解:DisposableBean.destroy)
-
-
使用bean工厂创建对象的好处
-
使用配置文件管理java类,在生产环境中更换类的实现时不需要重新部署,修改配置重启即可(如果用了Spring注解式开发,就没有这一条了)。
-
默认只创建一个对象(单例模式),节省创建对象的时间和内存空间。
-
通过依赖注入建立了类与类之间的关系(使Java对象之间关系更为清晰,方便了维护与管理)。
-