-
什么是Spring
-
Spring框架结构
-
Spring优势
-
使用Spring
-
ApplicationContext类
-
创建bean的三种方式
-
基于xml的IoC环境搭建
-
分析
什么是Spring
Spring是分层的Java SE/Java EE应用的full-stack轻量级开源框架,以IoC(Inverse Of Control 反转控制)和AOP(Aspect Oriented Programing 面向切面编程)为内核,提供了表现层(View)Spring MVC和持久层Spring JDBC以及业务层事务管理的众多的企业级应用技术,还能整合开源世界众多知名的第三方框架和类库,逐渐成为是哎哟个最多的Java EE企业应用的开源框架。官网
Spring框架结构
Spring优势
-
降低耦合,简化开发。
-
通过Spring提供IoC容器可以讲对象之间的依赖关系交给Spring控制,避免硬编码造成的过度的程序耦合。程序员不必在位单例模式类、属性文件解析等这些底层的需求编写代码,可以更专注与上层应用。
-
AOP编程的支持
-
通过Spring的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应对。
-
声明式事务的支持
-
通过声明(配置)的方式灵活的进行事务的管理,提高开发效率和质量
-
方便程序的测试
-
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试编的简单容易
-
方便集成各种优秀的框架
-
Spring可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz……)的直接支持
-
降低Java EE API的使用难度
-
Spring对Java EE API(如 JDBC、JavaMail、RPC等)进行了封装,使这些API的使用难度大大降低
使用Spring
基于xml的IoC环境搭建
-
新建maven工程,在pom.xml中导入spring依赖,依赖关系可直接在maven仓库官网中去复制 maven仓库
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
下载成功后,如下:
图中的spring-jcl 包是apache的日志框架
打开maven中依赖关系视图查看当前项目的依赖结构如下:
-
创建serverce类和serverceImpl类
server类:
public interface IUserServerce {
public void updateUser();
}
实现类:
public class UserServerceImpl implements IUserServerce {
public void updateUser() {
System.out.println("用户信息更新成功");
}
}
-
创建测试类
public class IoCTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
IUserServerce userSvc = (IUserServerce) applicationContext.getBean(IUserServerce.class.getName());
userSvc.updateUser();
}
}
执行测试程序结果如下:
分析
ApplicationContext类
光标停留在ApplicationContext类上,右键,选择Diagrams命令、Show Diagrm查看依赖关系的UML图
-
可以看到,ApplicationContext是实现了BeanFactory的,那么这两个核心Core(容器)接口有什么区别?
-
ApplicationContex:在构建容器时,采用即时加载的策略创建对象,在读取完配置文件后,立刻就创建了配置的所有对象。适用于单例模式
-
BeanFactory:在构建容器时,采用延时加载策略创建对象,在获取对象时,才创建对象。适用多例模式,按需加载
-
ApplicationContex的实现类 在UML图中右键ApplicationContext,选择Show Implementions
在测试程序用是实现类ClassPathXmlApplicationContext,从图中看到类似的实现类还有
-
那么这3个实现类有什么区别?
-
ClassPathXmlApplicationContext:加载类路径下的配置文件,如果配置文件不存在于类路径下,加载失败
-
FileSystemXmlApplicationContext:加载磁盘中的配置文件(必须要有访问权限),但是项目部署后,不能保证每台机器(服务器)都有指定的磁盘,因此局限性太大
-
AnnotationConfigApplicationContext:用于读取注解创建容器
创建bean的三种方式
-
使用默认构造函数创建,配置如下:
<bean id="serverce.IUserServerce" class="serverImpl.UserServerceImpl"></bean>
实现类如下:
public class UserServerceImpl implements IUserServerce {
public void updateUser() {
System.out.println("用户信息更新成功");
}
}
执行结果如下:
问题:实现类中并没有写构造函数,那怎么执行成功的?
答:java中默认无参构造,当不重载构造函数时,默认调用无参构造,且午餐构造可省略不写。当重写了构造函数后,必须手动添加无参构造,否则此方式创建bean,会抛出异常
添加了无参构造后,执行成功:
问题:当使用某个jar包中的类,它没有构造函数,又不能修改,此时怎么创建bean?代码如下:
/**
* 模拟使用jar包中的类
*/
public class NewJar {
public IUserServerce getUserSvc(){
return new UserServerceImpl();
}
}
该怎么获取到IUserServerce的对象?直接new一个NewJar,然后获取?注意我们需要的是IUserServerce的对象,并不需要NewJar的对象,但是却创建了一个我们不需要的对象。方式2解决这个问题。
-
使用普通工厂方式创建
<!-- 方式2. 使用普通工厂方式创建-->
<bean id="factory.NewJar" class="factory.NewJar"></bean>
<bean id="serverce.IUserServerce" factory-bean="factory.NewJar" factory-method="getUserSvc"></bean>
执行结果如下:
有了第二种方式,引发出第三种方式。
-
使用工厂的静态方法创建
<bean id="serverce.IUserServerce" class="factory.NewJar" factory-method="getUserSvc"></bean>
执行结果如下:
~未完待续~
原文始发于微信公众号(程序员玄之):初识spring到搭建IoC环境
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/43021.html