框架是什么(个人理解,可能有所偏差)
框架,将程序的各功能,不同的组合(配合方式)成为一个运行软件,这个组合方式就是框架;
打个比方,Java是牛肉,SQL数据库是辣椒,Web前端是芹菜,Http是酱油,你用一种炒法将这些组合起来成一道菜,这个炒法就是一个框架,spring是另一种炒法,spring就是另一个框架。
Spring 作用
降低耦合:修改需求时,只需要修改spring.xml配置文件,而不需要修改运行代码
搭建环境
用Spring jar包生成Spring.xml文件,将该文件从Java下移动到Resource包里,里面的Beam对象,产生ID(唯一)和后面的Class类全地址,之后使用AppLicationContext的getBean方法(参数为ID)调用该类
<bean id="a" class="project.a"></bean>
JUnit 单元测试框架
可以使用@Test 将Test方法替代Main方法,而且可以创建多个运行类,方便测试
控制反转
从new对象,到spring容器获取对象,spring接收对象的生命周期控制
依赖注入
用@Resource注解替代了getBean方法
其实控制反转和依赖注入是一回事,从对象角度和应用程序角度有区分
增强
AOP 切面
前置增强
后置增强
异常抛出增强
环绕增强
最终增强
自定义增强
语法
属性注入 proprety方法
必须要有set/get方法
1.基本数据类型(值类型)直接使用Value进行注入
2.引用数据类型(对象型)用ref="对象的beanID"注入
3.可以注入list、set、map、数组
<bean id="a" class="project.a">
<property name="数据类型" value="值">
<property name="引用类型" ref="类名">
<property name="List"> //list set 写法一样
<list>
<value>abc<value> //基本类型
<ref bean="对象BeanID" /> //引用类型
</list>
</property>
<property name="map"> //map 里是键值对
<map>
<entry key="a" value="b" /> //基本类型
<entry key="b" value-ref="对象BeanID" /> //引用类型
</map>
</property>
</bean>
构造方法注入
constructor 构造函数
<bean id="a" class="project.a">
<constructor-arg name="name" value="value" /> //根据名称注入,最好的方法
<constructor-arg index="1" value="value" /> //根据索引位置注入,耦合性高
<constructor-arg type="type" value="value" /> //根据属性类型注入,耦合性高
</bean>
命名空间注入
需要先引入命名空间
<beans xmlns:p="https://www.springframework.org/schema/p" /> //头文件引入
<bean id="a" class="project.a" p:name="name" p:age="age" p:obj-ref="obj" />
//缩减了代码,原来的方法体变成了单行代码
工厂注入
使用注解
@Configuration
public class Main {
@Bean
public Class1 class1(){
return new Class1();
}
@Bean
public Class2 class2(){
Class2 class2=new Class2;
class2.setName("name"); //设置属性
class2.setMethod(Method()); //Method 方法 设置方法
return new class2();
}
}
生命周期
1.Bean的实例化:
spring启动后,会查找和加载需要被spring管理的Bean,并且实例化。
2.Bean属性注入:
Bean被实例化后对将Bean的引入和值注入到Bean的属性中。
3.调用BeanNameAware的setBeanName()方法:指定ID
如果实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法。
4.调用BeanFactoryAware的setBeanFactory()方法:注入容器(父容器ApplicationContext的父类)
如果Bean实现了BeanFactoryAware接口的话,spring就将调用他们的setBeanFactory()方法,将BeanFactory容器实例传入。
5.调用ApplicationContextAware的setApplicationContext方法:注入容器(spring容器ApplicationContext)
如果Bean实现了ApplicationContextAware接口的话,spring将调用Bean的setApplicationContext方法,将Bean所在用用上下文引用传入进来。
6.调用BeanPostProcessor的预初始化方法:
如果Bean实现了BeanPostProcessor接口,spring将调用他们的postProcessBeforeInitialization()方法。
7.调用InitializingBean的afterPropertiesSet()方法:
如果Bean实现了InitializingBean接口,spring将调用他们的afterPropertiesSet()方法,类似的,如果Bean使用init-method生命了初始化方法的话,这个方法也会被调用。
8.调用BeanPostProcessor的初始化后的方法:
如果Bean实现了BeanPostProcessor接口,spring就将调用他们的postprocessAfterInitialization()方法。
9.Bean可以使用了:
这个时候,Bean就已经准备好了,可以被应用程序使用了,他们将一直驻留在应用的上下文中,直到应用的上下文被销毁。
10.调用DisposableBean的destory()方法:销毁Bean
如果Bean实现DisposableBean接口,spring将嗲用他的destory()就扣方法,相同的,如果Bean使用了destory-method生命销毁方法,该方法也会被调用。
作用域
singleton 单例模式,在整个Spring ioC容器中,只有一个Bean实例
prototype 多例模式,每次GetBean都会得到新的Bean实例,Bean由客户端管理,spring容器不再管理生命周期
request 用于Web环境,每次HTTP请求都会产生新的Bean实例
session 用于Web环境,使用session定义的Bean将会产生新实例
application 用于Web环境,整个系统的ServletCo'ntext创建单例模式