一. Spring介绍
Spring是SSM(Spring、SpringMVC、Mybatis)框架之一。所谓框架,就是高度抽取可重用代码的一种设计,具有高度通用性;
1. 概述:
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
2. 使用Spring的优势
(1)方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 管理。
(2)方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持。
(3)降低 Java EE API 的使用难度
Spring 对 Java EE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了封装,使这些 API 应用的难度大大降低。
(4)方便程序的测试
Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。
(5)AOP 编程的支持
Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
(6)声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无须手动编程;
作为 Java 程序员,对 Spring 的理解和掌握程度,基本上就是编程能力的体现。
二. IoC
1. 概念
IoC(Inversion of Control)即控制反转。在使用Spring之前,我们获取对象几乎都是用过new的方式,但是呢,在使用Spring之后,我们就不在使用new的方式来创建对象,而是交给Spring来给我们创建,这种对对象控制权的转移就叫做控制反转。
IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中
2. IoC容器
- IoC 容器是 Spring 的核心,也可以称为 Spring 容器。Spring 通过 IoC 容器来管理对象的实例化和初始化,以及对象从创建到销毁的整个生命周期。
- Spring 中使用的对象都由 IoC 容器管理,不需要我们手动使用 new 运算符创建对象。由 IoC 容器管理的对象称为 Spring Bean,Spring Bean 就是 Java 对象,和使用 new 运算符创建的对象没有区别。
- Spring 通过读取 XML 或 Java 注解中的信息来获取哪些对象需要实例化。
- Spring 提供 2 种不同类型的 IoC 容器,即 BeanFactory 和 ApplicationContext 容器。
示例代码:
创建接口和实现类
public interface UserDao { void queryAll(); }
public class UserDaoImpl implements UserDao { public UserDaoImpl(){ System.out.println("UserDaoImpl对象创建了"); } @Override public void queryAll() { System.out.println("查询了所有用户信息");} }
创建spring配置文件
在工程resource目录下创建spring-config.xml,idea中可以直接在resource目录下使用菜单New–>XML Configuration File–> Spring Config创建。
<?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标签进行描述id指定创建出来的对象在核心容器中的名字(name),用作唯一标识class指定创建对象的类的全类名--> <bean id="userDaoImpl" class="com.hqyj.cl.dao.impl.UserDaoImpl"/> </beans>
测试
public class UserDaoTest { @Test public void selectAll() { ApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml"); UserDao userDaoImpl = ac.getBean("userDaoImpl", UserDao.class); userDaoImpl.selectAll(); } }
三. Spring的注入方式
1. setter注入
指 IoC 容器使用 setter 方法注入被依赖的实例。通过调用无参构造器或无参 static 工厂方法实例化 Bean 后,调用该 Bean 的 setter 方法,即可实现基于 setter 的 依赖注入。
在 Spring 实例化 Bean 的过程中,首先会调用默认的构造方法实例化 Bean 对象,然后通过 Java 的反射机制调用 setXxx() 方法进行属性的注入。因此,setter 注入要求 Bean 的对应类必须满足以下两点要求:
必须提供一个默认的无参构造方法;
必须为需要注入的属性提供对应的 setter 方法。
使用 setter 注入时,在 Spring 配置文件中,需要使用 元素的子元素 为每个属性注入值;使用构造注入
时,在配置文件中,主要使用 标签定义构造方法的参数,使用其 value 属性(或子元素)设置该参数的值。
优点:对象创建时,无需指定参数,不会限制对象的创建。
缺点:对象具有多个属性可以注入时,无法保证全部或某些属性一定被注入。
setter注入方式较为灵活,使用更方便。
示例代码:
创建一个实体类User
public class User { private int id; private String username; private String password; public User() {} public User(int id, String username, String password) { this.id = id; this.username = username; this.password = password;} public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';} }
Spring配置文件
<?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 id="user" class="com.hqyj.cl.pojo.User"> <property name="id" value="1"/> <property name="username" value="chenlei"/> <property name="password" value="111"/> </bean> </beans>
测试类
public class UserDaoTest { @Test public void selectAll() { ApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml"); User user = ac.getBean("user", User.class); System.out.println(user); } }
2. 构造注入
指 IoC 容器使用构造函数注入被依赖的实例。可以通过调用带参数的构造函数实现依赖注入,每个参数代表一个依赖。
通过使用构造函数注入被依赖的实例有三种方式:通过下标注入、通过属性注入、通过参数名注入。
优点:创建时必须要指定构造函数中的全部参数,bean才能被创建,保证了对象创建出来之后,成员变量一定都有值。
缺点:必须要指定全部参数,否则对象无法创建,使用该方式改变对象的创建过程。
3. 接口注入(自动装配)
byName
JavaBean会根据属性名在Spring的上下文中进行寻找,是根据Spring上下文的bean的id进行查找,只要有,就会进行自动注入。
保证 bean 的 id 是唯一的,且该 bean 的 id 是此类属性对应的 set方法的方法名
byType
JavaBean会根据属性名对应的接口类型,在Spring的上下文中进行查找,是根据Spring上下文中是否有该接口类型的实现类进行匹配,只要有,就会进行自动注入
保证 bean 的 id 是唯一的,且该 bean 的类型也是唯一的
注意:如果找到两个及以上,那么Spring会报错