Spring介绍与入门
1.什么是Spring?
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。
简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
一站式:Spring提供了三层解决方案.
2.Spring的优点:
1.方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,
避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、
属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2.AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
3.声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
4.方便集成各种优秀框架
3.Spring的两大核心:IOC和AOP
4.SpringIOC的入门:
4.1 创建工程ioc,添加依赖;
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.it</groupId>
<artifactId>ioc</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
</project>
4.2 准备接口和实现类:
注:这里只是模拟,所以简单写Service和Dao
service接口和实现类:
public interface AccountService {
/**
* 保存账户
*/
void save();
}
public class AccountServiceImpl implements AccountService {
/**
* 保存账户
*/
@Override
public void save() {
System.out.println("AccountServiceImpl---saveAccount()");
AccountDao accountDao = new AccountDaoImpl();//TODO 耦合待解决
accountDao.save();
}
}
dao接口和实现类:
public interface AccountDao {
/**
* 保存账户
*/
void save();
}
public class AccountDaoImpl implements AccountDao {
/**
* 保存账户
*/
@Override
public void save() {
System.out.println("AccountDaoImpl---saveAccount()");
}
}
4.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">
<!--id:作为唯一标识,不要重复,一般写接口或者类名,首字母小写
class属性:写类的全路径名,注意如果是接口,要写接口的实现类的全路径名-->
<bean id="accountDao" class="com.it.dao.impl.AccountDaoImpl"></bean>
</beans>
4.4 使用时从spring容器中获取对象:
public class IocTest {
@Test
public void fun(){
//1.获得工厂对象
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
//从工厂获取对象
AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDao");
//调用方法
accountDao.save();
}
}
基于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">
<!--
bean标签: 注册bean, 把对象交给Spring管理
1.【掌握】属性:
id/name属性: 随便写,作为bean的唯一标识,不要重复(建议写接口的名字,首字母小写)
class属性: 类的全限定名
scope属性: singleton 单例, 不管获得多少次 都是同一个, 创建出来存到Spring容器里面 【默认】
prototype 多例, 每获得一次 就创建一个新的对象,创建出来不会存到Spring容器里面
request 把创建的对象存到request域,针对web项目【了解】
session 把创建的对象存到session域,针对web项目【了解】
我们一般也是单例的, 特殊情况才是设置为prototype多例 eg:struts2里面的action
2. 【了解】的属性
init-method属性: 指定初始化方法,写方法名
destroy-method属性: 指定销毁的方法, 象征着当前对象从Spring容器里面移除了 写方法名
-->
<bean id="accountService" class="com.it.service.impl.AccountServiceImpl" scope="prototype"
init-method="initMethod" destroy-method="destoryMethod"
></bean>
</beans>
id/name属性
用于标识bean , 其实id 和 name都必须具备唯一标识 ,两种用哪一种都可以。但是一定要唯一、 一般开发中使用id来声明.
class属性: 用来配置要实现化类的全限定名
scope属性: 用来描述bean的作用范围
singleton: 默认值,单例模式。spring创建bean对象时会以单例方式创建。(默认)
prototype: 多例模式。spring创建bean对象时会以多例模式创建。
request: 针对Web应用。spring创建对象时,会将此对象存储到request作用域。
session: 针对Web应用。spring创建对象时,会将此对象存储到session作用域。
init-method属性:spring为bean初始化提供的回调方法
destroy-method属性:spring为bean销毁时提供的回调方法. 销毁方法针对的都是单例bean , 如果想销毁bean , 可以关闭工厂
bean的作用范围和生命周期
单例对象: scope="singleton"
一个应用只有一个对象的实例。它的作用范围就是整个引用。
生命周期:
对象出生:当应用加载,创建容器时,对象就被创建了。
对象活着:只要容器在,对象一直活着。
对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
多例对象: scope="prototype"
每次访问对象时,都会重新创建对象实例,多例的bean不会存到Spring容器里面
生命周期:
对象出生:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了.
spring中使用的主要工厂对象:
- ClassPathXmlApplicationContext:它是从类的根路径下加载配置文件
- FileSystemXmlApplicationContext:它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
- AnnotationConfigApplicationContext:当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
BeanFactory 和 ApplicationContext 的区别:
ApplicationContext加载方式是框架启动时就开始创建所有单例的bean,存到了容器里面
BeanFactory加载方式是用到bean时再加载(目前已经被废弃)