初识spring到搭建spring 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环境搭建

  1. 新建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中依赖关系视图查看当前项目的依赖结构如下:

  1. 创建serverce类和serverceImpl类

server类:

public interface IUserServerce {

    public void updateUser();
}

实现类:

public class UserServerceImpl implements IUserServerce {
    public void updateUser() {
        System.out.println("用户信息更新成功");
    }
}
  1. 创建测试类
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图

  1. 可以看到,ApplicationContext是实现了BeanFactory的,那么这两个核心Core(容器)接口有什么区别?

    • ApplicationContex:在构建容器时,采用即时加载的策略创建对象,在读取完配置文件后,立刻就创建了配置的所有对象。适用于单例模式

    • BeanFactory:在构建容器时,采用延时加载策略创建对象,在获取对象时,才创建对象。适用多例模式,按需加载

  2. ApplicationContex的实现类
    在UML图中右键ApplicationContext,选择Show Implementions

在测试程序用是实现类ClassPathXmlApplicationContext,从图中看到类似的实现类还有

  1. 那么这3个实现类有什么区别?
    • ClassPathXmlApplicationContext:加载类路径下的配置文件,如果配置文件不存在于类路径下,加载失败
    • FileSystemXmlApplicationContext:加载磁盘中的配置文件(必须要有访问权限),但是项目部署后,不能保证每台机器(服务器)都有指定的磁盘,因此局限性太大
    • AnnotationConfigApplicationContext:用于读取注解创建容器

创建bean的三种方式

  1. 使用默认构造函数创建,配置如下:
 <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解决这个问题。

  1. 使用普通工厂方式创建
<!--    方式2. 使用普通工厂方式创建-->
    <bean id="factory.NewJar" class="factory.NewJar"></bean>
    <bean id="serverce.IUserServerce" factory-bean="factory.NewJar" factory-method="getUserSvc"></bean>

执行结果如下:

有了第二种方式,引发出第三种方式。

  1. 使用工厂的静态方法创建
<bean id="serverce.IUserServerce" class="factory.NewJar" factory-method="getUserSvc"></bean>

执行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值