Spring全家桶之Spring入门

本文介绍了Spring框架,它为解决企业级应用开发复杂性而创建,具有非侵入性。阐述了侵入式与非侵入式区别,列举Spring优点,如简化开发、松耦合等。还介绍了Spring的六个模块,重点讲解IOC控制反转和DI依赖注入的概念、区别、关系及注入方式,包括注解注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

综述: Spring是为了 解决企业级应用开发的复杂性而创建的,是非侵入性的,不依赖于spring的API,通过AOP实现面向面片编程,通过依赖注入控制反转IOC,对象不需要直接创建。

侵入式与非侵入式简单区别:
侵入式就是在使用框架的时候继承或者实现框架的类或接口,侵入式对框架的依赖很高,不利于代码的复用。
非侵入式就是不继承或实现类或接口就能实现自己想要的结果,如之前学的Hibernate框架。

Spring的有点有哪些?
1、简化Java的开发
2、基于POJO轻量级和最小侵入式开发
3、通过依赖注入和面向接口实现松耦合
4、基于切面和惯例进行声明式编程
5、通过切面和模板减少样板式代码
6、方便集成其他框架(如MyBatis、Hibernate)
另外,Spring对javaEE开发中非常难用的一些API(JDBC、远程调用等)都进行了封装,是这些API应用难度降低。

Spring模块
在这里插入图片描述
可以看到,一共有六个模块
1、Spring核心容器
是Spring中最重要的部分,管理者bean的创建、配置和管理,除此之外还包括bean工厂和多种Spring应用上下文的实现。

2、AOP模块
对面向编程提供了很好的支持,帮助对象进行解耦。

3、数据集成与访问
对JDBC进行了更好的封装,避免啦编写臃肿的连接、创造等语句。

4、Web与远程调用
它的Web和远程 调用模块自带了一个强大的MVC框架,有助于在Web层提升应用的松 耦合水平。

5、Test
Test模块支持使用JUnit和TestNG对Spring组件进行测试。

二、Spring IOC与DI

IOC:Inverse of Control(控制反转),IOC只是一种思想,并不是具体的技术,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。更具体来说就是,当需要使用某个对象的时候,不自己去创建,而是通过Spring容器来创建,至于Spring容器是如何创建的则不用理会。

IOC控制反转实例:有一个公司A需要招收Java程序员,正常的是A公司直接进行招收符合自己要求的员工;而控制反转则是A公司需要招人,单是A公司不亲自来招收,而是通过第三方人才市场根据A公司的要求筛选出来的人里面直接拿来使用就行了,至于人才市场是如何执行招收的,A公司不用去管,这其实就是IOC思想。总之,一句话:控制反转,把对象创建交给spring进行配置。

例子
创建一个SpringTest1类的bean

public class SpringTest1 {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void sayHello(){
        System.out.println("Hello World!" );
    }
}

然后在applicationContext.xml中配置bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="com.SpringTest1" id="springTest1">
        <property name="name" value="ForMe"/>
    </bean>
</beans>

测试类

public class Test {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        SpringTest1 springTest1 = applicationContext.getBean("springTest1",SpringTest1.class);
        springTest1.sayHello();
        System.out.println(springTest1.getName());
    }
}

结果毫无疑问打印出 Hello World!和ForMe,IOC把对象的生命周期由Spring来管理,直接从Spring那里去获取一个对象,而不用再new。

DI:Dependency Injection(依赖注入)
DI指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。
Spring动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 Spring我们就只需要告诉Spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,Spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由Spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,Spring就是通过反射来实现注入的。
简单来说什么是依赖注入,就是给属性赋值(包括基本数据类型和引用数据类型)

IOC与DI的区别:
IOC: 控制反转,将类的对象的创建交给Spring类管理创建.
DI: 依赖注入,将类里面的属性在创建类的过程中给属性赋值.
DI和IOC的关系: DI不能单独存在,DI需要在IOC的基础上来完成。
总的来说:通过Spring配置创建对象就是IOC,通过Spring配置进行设置属性就是DI。

其实上面的例子已经使用了setter方式依赖注入。当然除此之外还有构造器注入,配置文件中要改为 <constructor-arg name="name" value="张三"/>

最后一种常用的注入方式是使用注解
主要有四种注解可以注册bean,每种注解可以任意使用,只是语义上有所差异:

@Component:可以用于注册所有bean
@Repository:主要用于注册dao层的bean
@Controller:主要用于注册控制层的bean
@Service:主要用于注册服务层的bean

看一个简单的实例
Student类

@Component(value = "student")
public class Student {
    @Value("张三")
    private String name;
    @Value("123456")
    private String id;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", id='" + id + '\'' +
                '}';
    }
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置文件只需要扫描包的配置 -->
    <context:component-scan base-package="com" />
</beans>

测试类

public class Test {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = applicationContext.getBean("student",Student.class);
        System.out.println(student.toString());
    }
}

在这里插入图片描述
使用注解方式省去了很多麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值