使用 Spring 带来的好处
1.降低复杂性
2.松耦合
3.高性能
4.易测试 Junit
5.声明式事务
创建 Spring 流程
1.下载所需 jar 包
2.导入核心包 beans context expression core logging(日志包)
3.创建编写配置文件
创建对象交给 Spring 来管理
4.创建 applicationContex容器
5.通过 getBean 来获取到对象,如果对象不为空,则 Spring 搭建成功
public class HelloSpring {
public static void main(String[] args) {
// 从容器中获取被管理的对象
// 1.创建容器
// ClassPathXmlApplicationContext("classpath:applicationContext.xml");
// 使用指定配置文件,classpath 可忽略不写
@SuppressWarnings("resource")
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
// 2.从容器中获取 bean
Person person = (Person) applicationContext.getBean("person");
// 查看对象是否获取成功
System.out.println(person);
}
}
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="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"><!-- 让 Spring 管理 Person 的对象,对象名字叫做 person
class:全限定类名,要被管理的类的名字
name:被管理对象的名称
--><beanclass="com.xxx.Person"name="person"><!-- set 注入
必须提供 set 方法
value 属性用于注入基础数据类型
ref 属性用于注入引用数据类型
--><propertyname="name"value="张三"></property><propertyname="age"value="20"></property><propertyname="car"ref="car"></property></bean><beanclass="com.xxx.Car"name="car"><propertyname="name"value="布加迪威龙"></property><propertyname="color"value="鎏金"></property></bean></beans>
核心思想 IOC
inverse of control(反转控制)
说白了就是把对象的创建反转(交给) Spring 来管理
不需要手动去创建对象,需要调用时,从 Spring 获取对象
实现原理:通过反射 + 配置文件
Classclass = Class.forName("com.xxx.Person");
Objectobject = class.newIncetance();
context.put("person", object);
context.get("person");
DI技术
dependency injection
依赖 注入
类 A 中需要类 B 提供的功能
称为 A 依赖 B
例如: service 依赖 DAO
UserService
UserDao dao = new UserDaoImplForJDBC();
UserDao dao = new UserDaoImplForHibernate();
使用 Spring 之后
UserDao dao = context.getBean("userDaoImpl");
不需要修改源代码就能实现组件的切换
注入:从外部把需要的对象放到内部就叫注入
UserService
private UserDao dao;
set/get 方法
依赖注入最终的目的就是提高程序的扩展性,尽可能的不去修改源代码
bean 的创建方式
1.构造函数创建(默认的)
<beanname="person4"class="com.lanou3g.Person"><!-- name 指定参数名,需要与构造函数一致 --><!-- index 指定参数放到哪一个位置
使用场景:当多个构造函数参数相同,但是顺序不同时,调用 --><!-- type 指定参数的类型
使用场景:当多个构造函数参数顺序相同,但是数据类型不同时,调用 --><constructor-argname="car"ref="car"index="0"></constructor-arg><constructor-argname="name"value="0123"type="Integer"></constructor-arg><constructor-argname="age"value="20"></constructor-arg></bean>
2.静态工厂创建(调用指定的静态方法获取 bean)
<!-- 到 PersonFactory 中调用 getPerson 的静态方法来获取对象,并放入容器中
如果使用默认的创建方式, Spring 会到对应类中找到空参数的构造函数
如果指定了 factory-method, 则 Spring 会到类中找到指定的静态方法执行
class 指定类型可以与 bean 的类型不一致
--><beanname="person2"class="com.xxx.PersonFactory"factory-method="getPerson"><propertyname="name"value="王五"></property></bean>
1.set 注入(就是通过 set 方法,所以必须有 set 方法)
<bean class="com.lanou3g.Person"name="person">
<!-- set 注入
必须提供 set 方法
value 属性用于注入基础数据类型
ref 属性用于注入引用数据类型
-->
<propertyname="name" value="张三"></property>
<propertyname="age" value="20"></property>
<propertyname="car"ref="car"></property>
</bean>
<bean class="com.lanou3g.Car"name="car">
<propertyname="name" value="布加迪威龙"></property>
<propertyname="color" value="鎏金"></property>
</bean>
2.构造函数注入
<beanname="person4"class="com.lanou3g.Person"><!-- name 指定参数名,需要与构造函数一致 --><!-- index 指定参数放到哪一个位置
使用场景:当多个构造函数参数相同,但是顺序不同时,调用 --><!-- type 指定参数的类型
使用场景:当多个构造函数参数顺序相同,但是数据类型不同时,调用 --><constructor-argname="car"ref="car"index="0"></constructor-arg><constructor-argname="name"value="0123"type="Integer"></constructor-arg><constructor-argname="age"value="20"></constructor-arg></bean>
3.<:p 命名空间
<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="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"xmlns:p="http://www.springframework.org/schema/p"><!-- p 命名空间需要先引入命名空间 --><!-- p 命名空间
实质上还是调用 set 方法,只是为了简化书写 --><beanname="person5"class="com.lanou3g.Person"p:name="老王"p:age="50"p:car-ref="car"></bean>
4.SpEL 表达式
<!-- SpEL 注入
Spring 的表达式语言,能够实现一些简单的逻辑
与 JSP 的 EL 一个性质 --><beanname="person6"class="com.lanou3g.Person"><!-- 找到一个叫 person 的对象,调用 getName 方法获取数据 --><propertyname="name"value="#{person.name}"></property><propertyname="age"value="#{person5.age}"></property><propertyname="car"ref="car"></property></bean>
Spring 提供两种容器
1.BeanFactory(已经过时了) Spring 框架最古老的接口
仅定义了实现 IOC DI 基础功能的接口
特点:获取 bean 时才会创建对应 bean 以前的硬件设备资源匮乏
2.ApplicationContext 功能更加强大
特点:一旦加载配置文件就全部创建出来