一、Spring 框架简介
1. Spring 几大核心功能
1.1 IoC/DI 控制反转/依赖注入
1.2 AOP 面向切面编程
1.3声明式事务
2. Ioc
2.1 名称:控制反转(Inversion of Control)
2.2 IoC是什么?
2.2.1 IoC完成的的事情:原先由程序员主动通过 new 实例化对象事情,转交给 Spring 负责
2.2.2 控制反转中控制指的是:控制类的对象.
2.2.3 控制反转中“反转”指的是转交给 Spring 负责.
2.2.4 IoC 最大的作用:解耦(程序员不需要管理对象.解除了对象管理和程序员之间的耦合.)
二、Spring环境搭建
Spring框架下载地址:https://repo.spring.io/release/org/springframework/spring/
commons-logging包下载地址:http://commons.apache.org/proper/commons-logging/download_logging.cgi
1. 导入jar包:四个核心包一个日志包(commons-logging)
2. 在src目录下新建 applicationContext.xml
2.1 文件名称和路径自定义
2.2 记住 Spring 容器 ApplicationContext,applicationContext.xml 配置的信息最终存储到了 AppliationContext 容器中
2.3 Spring 配置文件是基于 schema
2.3.1 schema文件扩展名为xsd
2.3.2 把 schema 理解成 DTD 的升级版.
2.3.2.1 比 DTD 具备更好的扩展性.
2.3.3 每次引入一个 xsd 文件是一个 namespace(xmlns)
2.4 配置文件中只需要引入基本 schema
2.4.1 通过<bean/> 创建对象.
2.4.2 默认配置文件被加载时创建对象
<?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="peo" class="com.sen.pojo.People"> </bean> </beans> |
3.测试方法
3.1 getBean(“<bean>标签 id 值”,返回值类型); //如果没有第二个参数, 默认是 Object
3.2 getBeanDefinitionNames(); //Spring容器中目前所有管理的所有对象
//加载spring的xml文件 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //由spring创建普通对象,People.class可以不写,不过返回的就是Object,需要强转 People people = ac.getBean("peo",People.class); System.out.println(people); |
三、Spring创建对象的三种方式
1. 通过构造方法创建
1.1 无参构造创建:默认情况.
1.2 有参构造创建:需要明确配置
1.2.1 需要在类中提供有参构造方法
1.3 在 applicationContext.xml 中设置调用哪个构造方法创建对象
<bean id="peo" class="com.sen.pojo.People"> <!-- ref:引用另一个bean value表示基本数据类型或者是String等 index:从0开始,表示形参的位置 name:形参名 type:形参类型(区分开关键字和封装类,比如int和Integer) value或ref:传入的实参 index、name、type三者可以同时出现,这三个参数可以精准控制要使用什么构造方法 注意: 当有多个同形参(形参位置不同)的构造方法时 调用构造方法的顺序和xml中的标签顺序无关,和类的构造方法顺序有关,遇到第一个符合的构造方法就执行第一个 --> <constructor-arg name="id" type="int" value="123"></constructor-arg> <constructor-arg name="name" type="java.lang.String" value="张三"></constructor-arg> </bean> </beans> |
2. 实例工厂
2.1 工厂设计模式:帮助创建类对象.一个工厂可以生产多个对象.
2.2 实例工厂:需要先创建工厂,才能生产对象
2.3 步骤:
2.3.1 必须要有一个实例工厂
public class PeopleFactory { public People creatPeople(){ return new People(3,"实例工厂"); } } |
2.3.2 在 applicationContext.xml 中配置工厂对象和需要创建的对象
<!-- 实例工厂的创建配置 前提:必须要有一个实例工厂 其次在xml中配置工厂对象和需要创建的对象 class:实例工厂的类的全路径 factory-bean:实例工厂的类 factory-method:实例工厂创建类的方法 --> <bean id="factory1" class="com.sen.pojo.PeopleFactory"></bean> <bean id="peo1" factory-bean="factory1" factory-method="creatPeople"></bean>
|
3. 静态工厂
3.1 不需要创建工厂,快速创建对象.
3.2 步骤
3.2.1 编写一个静态工厂(在方法上添加 static)
public class PeopleFactory { public static People creatPeopleStatic(){ return new People(4,"静态方法创建的对象"); } } |
3.2.2 在 applicationContext.xml 中
<!-- 静态工厂的创建配置 只需要写上静态工厂的类,以及创建对象的静态方法 class:静态工厂的类的全路径 factory-method:创建对象的静态方法 --> <bean id="factory2" class="com.sen.pojo.PeopleFactory" factory-method="creatPeopleStatic"></bean>
|
四、给Bean的属性赋值(注入)
1.通过构造方法设置值(详见三)
2.设置注入:通过对应的set/get方法给对象赋值
2.1 如果属性是基本数据类型或者是String等类型,直接使用<property>标签
2.2 可以通过value属性或者value子标签进行赋值
<bean id="peo" class="com.sen.pojo.People">
<!-- 可以通过value属性或者value子标签进行赋值 --> <property name="id" > <value>1</value> </property> <property name="name" value="对对象设置注入"></property>
<!-- 对Set属性进行基本赋值 如果Set中的元素是对象的话,使用ref--> <property name="sets"> <set> <value>Set中每一个元素</value> <value>就是使用一个value</value> <value>来进行赋值</value> </set> </property>
<!-- 给List属性进行赋值、 如果list中只有一个值,可以使用value属性进行赋值 --> <property name="lists"> <list> <value>List中的每一个元素</value> <value>和给Set赋值差不多</value> </list> </property>
<!-- 给数组进行赋值 如果数组只有一个值,可以使用value属性进行赋值 --> <property name="strs"> <array> <value>数组中的一个元素</value> <value>也是使用一个value子标签</value> <value>来进行赋值</value> </array> </property>
<!-- 给map属性进行赋值 --> <property name="maps"> <map> <entry key="a" value="对Map进行赋值"></entry> <entry key="b" value="一个entry就是一个元素"></entry> <entry key="c"> <value>可以使用属性也可以使用子标签</value> </entry> </map> </property> |
五、DI
1. DI:中文名称:依赖注入(Dependency Injection)
2. DI 是什么?
2.1 DI 和 IoC 是一样的
2.2 当一个类(A)中需要依赖另一个类(B)的对象时,把 B 赋值给 A 的过程就叫做依赖注入.
<bean id="peo" class="com.sen.pojo.People"> <!-- DI:依赖注入 对对象属性进行赋值 ref:另一个bean的id name:该属性的名称 --> <property name="dp" ref="DIpeo"></property> </bean> <!-- DI --> <bean id="DIpeo" class="com.sen.pojo.DIpeople"> <property name="id" value="1"></property> <property name="price" value="11"></property> </bean> |