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时再加载(目前已经被废弃)