Spring5总结
一、概述
1、Spring 是轻量级开源的 JavaEE 框架
2、Spring 可以解决企业应用开发的复杂性
3、Spring 有两个核心部分:IOC 和 Aop
(1)IOC:控制反转,把创建对象过程交给 Spring 进行管理
(2)Aop:面向切面,不修改源代码进行功能增强
4、Spring 特点
(1)方便解耦,简化开发
(3)方便程序测试
(4)方便和其他框架进行整合
(5)方便进行事务操作
(2)支持 Aop 编程
(6)降低 API 开发难度
二、IOC容器底层原理
1、什么是 IOC
(1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
(2)使用 IOC 目的:为了耦合度降低
2、IOC 底层原理
xml 解析、工厂模式、反射
(1)xml配置文件,配置创建的对象
<bean id="userDao" class="com.yhd.dao.UserDao"></bean>
(2)工厂模式
有相应的service类和dao类,创建工厂类
class UserFactory{
public static UserDao getDao{
String classValue = class属性值 //1、xml解析
Class cls = Class.forName(classValue); //2、通过反射创建对象
return (UserDao)cls.newInstance;
}
}
三、IOC(BeanFactory接口)
1、IOC 思想
基于 IOC 容器完成,IOC 容器底层就是对象工厂
2、Spring 提供 IOC 容器实现两种方式:(两个接口)
(1)BeanFactory
IOC 容器基本实现,是 Spring 内部的使用接口,加载配置文件时候不会创建对象,在获取对象(使用)才去 创建对象
(2)ApplicationContext
BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用,加载配置文件时候就会把 在配置文件对象进行创建
3、ApplicationContext 接口有实现类
四、IOC操作Bean管理
1、Bean 管理
Bean 管理指两个操作
(1)Spring 创建对象
(2)Spirng 注入属性
2、Bean 管理两种方式
基于 xml 配置文件方式实现
基于 xml 方式创建对象:在 spring 配置文件中,使用 bean 标签,里面添加对应属性,就可以实现对象创建。bean 标签常用属性
id 属性:唯一标识
class 属性:类的全路径
基于注解方式实现
3、Bean 作用域
Spring 里面,默认情况下,bean 是单实例对象
(1)在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
(2)scope 属性值
第一个值 默认值,singleton,表示是单实例对象
第二个值 prototype,表示是多实例对象
singleton 和 prototype 区别
第一 singleton 单实例,prototype 多实例
第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象
设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用
getBean 方法时候创建多实例对象
4、bean 生命周期
从对象创建到对象销毁的过程称为bean 生命周期。
过程:
(1)执行无参数构造创建 bean实例
(2)调用 set 方法设置属性值,为bean 的属性设置值
(3)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(4)获取创建 bean 实例对象
(5)调用 bean 销毁的方法(需要进行配置销毁的方法)
代码演示过程:
public class Orders {
//无参数构造
public Orders() {
System.out.println("第一步 执行无参数构造创建 bean实例");
}
private String oname;
public void setOname(String oname) {
this.oname = oname;
System.out.println("第二步 调用 set 方法设置属性值");
}
//创建执行的初始化的方法
public void initMethod() {
System.out.println("第三步 执行初始化的方法");
}
//创建执行的销毁的方法
public void destroyMethod() {
System.out.println("第五步 执行销毁的方法");
} }
<bean id="orders" class="com.yhd.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
<property name="oname" value="电脑"></property>
</bean>
@Test
public void testBean() {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("bean.xml");
Orders orders = context.getBean("orders", Orders.class);
System.out.println("第四步 获取创建 bean 实例对象");
System.out.println(orders);
//手动让 bean 实例销毁
context.close();
}
5、bean 后置处理器, 生命周期有七步
(1)执行无参数构造创建 bean实例
(2)调用 set 方法设置属性值,为bean 的属性设置值
(3)把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
(4)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(5)把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
(6)获取创建 bean 实例对象
(7)调用 bean 销毁的方法(需要进行配置销毁的方法)
代码演示过程:
创建类,实现接口 BeanPostProcessor,创建后置处理器
public class MyBeanPost implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("在初始化之前执行的方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("在初始化之后执行的方法");
return bean;
} }
<!--配置后置处理器-->
<bean id="myBeanPost" class="com.yhd.spring5.bean.MyBeanPost"></bean>
6、Bean管理(xml自动装配)
根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入
根据属性名称自动注入
<!--实现自动装配
bean 标签属性 autowire,配置自动装配
autowire 属性常用两个值:
byName 根据属性名称注入 ,注入值 bean 的 id 值和类属性名称一样
byType 根据属性类型注入
-->
<bean id="emp" class="com.yhd.spring5.autowire.Emp" autowire="byName">
<!--<property name="dept" ref="dept"></property>-->
</bean> <bean id="dept" class="com.yhd.spring5.autowire.Dept"></bean>
根据属性类型自动注入
<!--实现自动装配
bean 标签属性 autowire,配置自动装配
autowire 属性常用两个值:
byName 根据属性名称注入 ,注入值 bean 的id 值和类属性名称一样
byType 根据属性类型注入
-->
<bean id="emp" class="com.yhd.spring5.autowire.Emp" autowire="byType">
<!--<property name="dept" ref="dept"></property>-->
</bean>
<bean id="dept" class="com.yhd.spring5.autowire.Dept"></bean>
五、
六、