Spring框架技术总结
Posted 生命是有光的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架技术总结相关的知识,希望对你有一定的参考价值。
0、目录总览
1、Spring
1.0、Spring程序开发步骤
创建一个maven项目
- 在pom.xml导入Spring开发的基本包坐标
<!--导入spring的context坐标,context依赖core、beans、expression-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
- 编写Dao接口和实现类
UserDao接口
public interface UserDao{
public void save();
}
UserDaoImpl实现类
public class UserDaoImpl implements UserDao{
@Override
public void save(){
System.out.println("save running....");
}
}
- 在类路径下(resources)创建
applocationContext.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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
</bean>
</beans>
- 测试
public class UserDaoDemo {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
userDao.save();
//save running....
}
}
2、Spring配置文件
2.1、Bean标签基本配置
默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功
2.1.1、bean
-
名称:bean
-
类型:标签
-
归属:beans标签
-
作用:定义spring中的资源,受此标签定义的资源将受到spring控制
-
格式:
<beans> <bean /> </beans>
-
基本属性:
<bean id="beanId" name="beanName1,beanName2" class="ClassName"></bean>
id
:bean的名称,通过id值获取beanclass
:Bean的全限定名称name
:bean的名称,可以通过name值获取bean,用于多人配合时给bean起别名
例如:
<bean id="userDao" name="userDao1,userDao2" class="com.itheima.dao.impl.UserDaoImpl" >
</bean>
2.1.2、bean属性scope
-
名称:scope
-
类型:属性
-
归属:bean标签
-
作用:定义bean的作用范围
-
格式:
<bean scope="singleton"></bean>
-
取值:
singleton
:设定创建出的对象保存在spring容器中,是一个单例的对象,默认值prototype
:设定创建出的对象保存在spring容器中,是一个非单例的对象- request、session、application、 websocket :设定创建出的对象放置在web容器对应的位置
2.1.2.1、singleton
- 将scope作用范围设置为单例
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="singleton">
</bean>
- 测试
@Test
// 测试scope属性
public void test1(){
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao2 = (UserDao) app.getBean("userDao");
System.out.println(userDao1 == userDao2);
// true,两次创建出来的对象是相同的
}
2.1.2.2、prototype
- 将scope作用范围设置为多例
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="prototype">
</bean>
- 测试
@Test
// 测试scope属性
public void test1(){
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao2 = (UserDao) app.getBean("userDao");
System.out.println(userDao1 == userDao2);
// false,两次创建出来的对象是不相同的
}
2.1.3、bean声明周期
-
名称:init-method,destroy-method
-
类型:属性
-
归属:bean标签
-
作用:定义bean对象在初始化或销毁时完成的工作
-
格式:
<bean init-method="init" destroy-method="destroy"></bean>
-
取值:bean对应的类中对应的具体方法名
-
注意事项:
-
当scope=“singleton”时,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次
-
当scope=“prototype”时,spring容器要创建同一类型的多个对象,init方法在每个对象创建时均执行一次
-
当scope=“singleton”时,关闭容器会导致bean实例的销毁,调用destroy方法一次
-
当scope=“prototype”时,对象的销毁由垃圾回收机制gc()控制,destroy方法将不会被执行
-
2.1.4、总结
- 当scope的取值为singleton时
-
Bean的实例化个数:1个
-
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
-
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
-
也就是上述代码执行时,实例化配置的Bean实例
-
-
Bean的生命周期
- 对象创建:当应用加载,创建Spring容器时,对象就被创建了
- 对象运行:只要Spring容器在,对象一直活着
- 对象销毁:当应用卸载,销毁容器时,对象就被销毁了
- 当scope的取值为prototype时
-
Bean的实例化个数:多个
-
Bean的实例化时机:当调用
getBean()
方法时实例化Bean实例-
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao1 = (UserDao) app.getBean("userDao");
-
-
Bean的生命周期
- 对象创建:当使用对象时,创建新的对象实例
- 对象运行:只要对象在使用中,就一直或者
- 对象销毁:当对象长时间不用时,被 Java 的垃圾回收期回收
2.2、Bean实例化三种方式
- 无参构造方法实例化(重要)
- 工厂静态方法实例化(了解)
- 工厂实例方法实例化(了解)
2.2.1、无参构造方法实例化
它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败
<!-- 无参构造创建对象-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"
</bean>
2.2.2、工厂静态方法实例化
工厂的静态方法返回Bean实例 :
- 使用
class
属性来指定包含static
工厂方法的类的全限名 - 使用
factory-method
属性来指定工厂方法本身的名称
- 编写工厂静态方法
/**
* 工厂静态方法
*/
public class StaticFactory {
public static UserDao getUserDao(){
return new UserDaoImpl();
}
}
- 在Spring核心配置文件配置
<!-- 工厂静态方法创建对象-->
<bean id="userDao" class="com.itheima.factory.StaticFactory" factory-method="getUserDao">
</bean>
2.2.3、工厂实例方法实例化
工厂的非静态方法返回Bean实例:
- 使用此机制,请将
class
属性留空,并在factory-bean
属性中,指定包含要创建对象的实例方法的bean的名称 - 使用
factory-method
属性设置工厂方法本身的名称
- 编写工厂实例方法
/**
* 工厂实例方法创建对象
*/
public class DynamicFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
- 在Spring核心配置文件配置
<!-- 工厂实例方法创建对象-->
<bean id="factory" class="com.itheima.factory.DynamicFactory"></bean>
<bean id="userDao" factory-bean="factory" factory-method="getUserDao" />
2.3、Bean的依赖注入
- IoC(Inversion Of Control)控制翻转,Spring反向控制应用程序所需要使用的外部资源
- DI(Dependency Injection)依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入
因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在Spring容器中,将UserDao设置到UserService内部。
2.3.1、依赖注入概念
-
依赖注入 Dependency Injection:它是Spring框架核心IOC的具体实现
-
在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层(Service)仍会调用持久层(Dao)的方法。
-
简单的说,就是坐等框架把持久层(Dao)对象传入业务层(Service),而不用我们自己去获取
2.3.2、依赖注入方式
怎么将UserDao(持久层)怎样注入到UserService(业务层)内部呢?
- 构造方法
- set方法
2.3.2.1、set方法注入(主流)
-
名称:property
-
类型:标签
-
归属:bean标签
-
作用:使用set方法的形式为bean提供资源
-
格式:
<bean> <property /> </bean>
-
基本属性:
<property name="propertyName" value="propertyValue" ref="beanId"/>
name
:对应bean中的属性名,要求该属性必须提供可访问的set方法(严格规范为此名称是set方法对应名称)
value
:设定非引用类型属性对应的值,不能与ref同时使用
ref
:设定引用类型属性对应bean的id ,不能与value同时使用
- 注意:一个bean可以有多个property标签
要求被注入的属性,必须有set方法,set方法的方法名由set + 属性首字母大写,
- 在UserServiceImpl中添加setUserDao方法
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
@Override
public void save() {
userDao.save();
}
}
- 配置Spring容器调用set方法进行注入
- 注意点:这里的值是一个引用,ref
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<!-- name是属性名,也就是setUserDao方法去掉set,之后首字母小写-->
<!-- Bean引用注入,用ref-->
<property name="userDao" ref="userDao"></property>
</bean>
2.3.2.2、构造方式注入(了解)
-
名称:constructor-arg
-
类型:标签
-
归属:bean标签
-
作用:使用构造方法的形式为bean提供资源,兼容早期遗留系统的升级工作
-
格式:
<bean> <constructor-arg /> </bean>
-
基本属性:
<constructor-arg name="argsName" value="argsValue />
name
:对应bean中的构造方法所携带的参数名
value
:设定非引用类型构造方法参数对应的值,不能与ref同时使用 -
其他属性:
<constructor-arg index="arg-index" type="arg-type" ref="beanId"/>
ref
:设定引用类型构造方法参数对应bean的id ,不能与value同时使用
type
:设定构造方法参数的类型,用于按类型匹配参数或进行类型校验
index
:设定构造方法参数的位置,用于按位置匹配参数,参数index值从0开始计数
- 注意:一个bean可以有多个constructor-arg标签
- 创建有参构造
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
userDao.save();
}
}
- 配置Spring容器调用有参构造时进行注入
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
2.3.3、依赖注入数据类型
上面的操作,都是注入的引用Bean,都是对UserDao对象的引用进行注入的,除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。
对于集合数据类型注入:
-
名称:array,list,set,map,props
-
类型:标签
-
归属:property标签 或 constructor-arg标签
-
作用:注入集合数据类型属性
-
格式:
<property> <list></list> </property>
- 常量注入
<bean id="student" class="com.kuang.pojo.Student">
<!-- 第一种,普通值注入,value-->
</bean>
- Bean注入
- 注意点:这里的值是一个引用,ref
<bean id="student" class="com.kuang.pojo.Student">
<!-- 第二种,Bean注入,ref-->
<property name="address" ref="address" />
</bean>
- 数组注入
<bean id="student" class="com.kuang.pojo.Student">
<!-- 第三种,数组注入-->
<property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
</array>
</property>
</bean>
- List注入
<bean id="student" class="com.kuang.pojo.Student">
<!-- 第四种,List注入-->
<property name="hobbys">
<list>
<value>听歌</value>
<value>看木鱼水心</value>
<value>敲代码</value>
<value>玩游戏哈哈</value>
</list>
</property>
</bean>
- Map注入
<bean id="student" class="com.kuang.pojo.Student">
<!-- 第五种,Map注入-->
<property name="card">
<map>
<entry key="身份证" value="123456123456123456" />
<entry key="银行卡" value="654321654321654321" />
</map>
</property>
</bean>
- set注入
<bean id="student" class="com.kuang.pojo.Student">
<!-- 第六种,Set注入-->
<property name="games">
<set>
<value>英雄联盟</value>
<value>刀塔</value>
<value>刺客信条</value>
<value>虐杀原型</value>
</set>
</property>
</bean>
- null注入
<bean id="student" class="com.kuang.pojo.Student">
<!-- null空值注入-->
<property name="wife">
<null />
</property>
</bean>
- Properties注入
<bean id="student" class="com.kuang.pojo.Student">
<!-- properties
key = value
-->
<property name="info">
<props>
<prop key以上是关于Spring框架技术总结的主要内容,如果未能解决你的问题,请参考以下文章