Spring
- Spring概述
-
- 分层的一站式轻量级开源框架,以IoC(控制反转Inversion ofControl)和AOP(面向切面Aspect Oriented programming)为内核。
- Spring框架的优点:
-
- 大工厂,将所有对象的创建和依赖关系交给Spring容器管理,降低组件间的耦合性
-
- 方便测试,对JUnit4支持,通过注解测试Spring程序
-
- 支持声明式事务处理,通过配置完成对事务的管理
-
- 方便集成各种优秀框架
-
- 降低API使用难度(如JDBC,JavaMail等提供了封装)
-
- 非侵入式设计,使代码对框架的依赖性最小
- Spring的体系结构
- Spring的核心容器
- BeanFactory,管理Bean的工厂,负责初始化和调用生命周期方法
- ApplicationContext,BeanFactory的子接口,称为应用上下文。创建接口实例的两种方法
-
- 从类路径(相对路径)classPath中寻找指定(configLocation)的XML配置文件,并装载完成实例化工作
ApplicationContext aplicationContext=new ClassPathXmApplication(String configLocation);
- 从类路径(相对路径)classPath中寻找指定(configLocation)的XML配置文件,并装载完成实例化工作
-
- 从文件系统路径(绝对路径)中寻找制定的XML配置文件,并装载完成实例化工作
ApplicationContext aplicationContext=new FileSystemXmApplication(String configLocation);
缺点是导致灵活性变差。
- 从文件系统路径(绝对路径)中寻找制定的XML配置文件,并装载完成实例化工作
-
- Web项目中使用基于ContextLoaderListener实现的方式完成实例化ApplicationContext,只需要 在web.xml文件中添加如下代码** 且使用场景多 **
- 上述创建完Spring容器后,就可以获取容器中的Bean。采用如下两种方法:
- Object getBean(String name):根据容器中的Bean的id或name来获取指定的Bean,获取后需要进行强制类型转换。—-多
- T getBean(ClassrequiredYype): 根据类的类型来获取Bean的实例,泛型方法故获取Bean后不需要强制类型转换。—-少
- 控制反转:通过实例化Spring容器(ApplicationContext),通过Spring容器来获取实现类的对象(getBean方法),即将控制权交由Spring容器,降低耦合,使程序易于维护。
大白话:把对象的创建交由Spring的大工厂管理 - 依赖注入:Spring容器负责将被依赖对象赋值给调用者的成员变量(即为调用者注入了它依赖的实例)。
大白话:将对象间的调用关系交由Spring来负责管理
- 实现方式:
1⃣️属性setter方法注入:Spring容器使用Setter方法注入被依赖的实例。通过** 调用无参数构造器*或无参数静态工厂方法实例化Bean后,调用该Bean(指被依赖调用的Bean)的setter对象名()方法,即可实现基于setter方法的依赖注入。———接下行
1.在变量处申明被依赖Bean对象,并添加编写该变量的Setter方法。XxService.java文件
package package;
public class XxServiceImpl implentments XxService{
//申明XxDad 属性 private XxDao xxDao;
//添加Xx属性的setter方法,用于实现依赖注入 public void setXxDao(XxDao xxDao){ this.xxDao=xxDao;}
//实现接口中的方法 //.........略}
2.在xml文件中配置该Bean并使用property标签注入到调用者的Bean实例中
<!—添加一个id为XxDao的实例 —> <bean I’d=“XxDao” class=“package.XxDaoImpl”>
<!—添加一个id为XxService的实例 —>
<bean I’d=“XxService” class=“package.XxServiceImpl”>
<!—将一个id为XxDao的Bean实例注入到XxService实例中 name表示调用者Bean实例中被调用Bean的属性名 ref属性用于指定其属性值即引用id为XxDao的Bean实例 —>
<property name=“XxDao” ref=“XxDao”>
</bean>
** 注意XxService文件中的xxDao属性名和property中name的属性值的关系