木木的Java知识整理——Spring

本文主要介绍了Spring框架的基本概念,包括Spring作为轻量级开源框架的主要优点和模块划分。深入探讨了Spring的IOC(反转控制)和DI(依赖注入)原理,通过实例展示了如何通过工厂+反射+配置文件实现对象的解耦合。同时,解释了IOC和DI如何帮助开发者在程序中实现对象的创建和管理,强调了Spring如何通过XML配置进行对象的属性注入,从而实现代码的灵活性和可维护性。

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

一、Spring概述

1.1 Spring的概述

1、Spring是什么?
一个轻量级的开源框架,可以使我们的开发变得简单,是一个一站式的框架。

2、Spring的优点有哪些?
1.方便解耦,简化开发
2.AOP编程的支持
3.声明式事务的支持
4.方便程序的测试
5.方便继承各种优秀框架
6.降低JavaEE API的使用难度

3、Spring的模块有哪些?
Spring核心包:
1.Beans
2.Core
3.Context
4.SpEl

1.2 Spring的IOC的底层实现原理

传统方式的开发

UserService us = new UserService();

在Web层直接创建一个业务层的对象
缺陷:没有面向接口编程

改进:通过面向接口编程

UserService us = new UserServiceImpl();

在Web层通过业务层的接口创建了实现类
缺点:Web层与业务层产生了耦合,不符合OCP原则(修改关闭,扩展开放)

改进:使用工厂模式
由原来直接用接口创建实现类 改为 通过用工厂来创建实现类
工厂类代码:

class FactoryBean{
	public UserService getUs() {
		return new UserServiceImpl();
	}
	//......
}

耦合关系变为:接口和工厂类耦合
获得对象实例:

UserService us = FactoryBean.getUs();

如果需要切换底层实现,虽然不用改获得实例的代码,但是需要改工厂类的代码。

!!!那有没有一种方法可以不需要修改任何的源代码呢?
方案:使用工厂+反射+配置文件(xml)(可以完成程序的解耦合)

<bean id="us" class:"com.linmin.UserServiceImpl"/>
class FactoryBean{
	public static Object getBean(String id) {
		//...
		//反射
	}
}

原理:在工厂类中通过解析xml文件的< bean >标签,根据传入的id去创建对应类型的对象(例如:id为us,则返回对应的UserService对象)。

代码:
1、传统方式:

/*UserService.java*/
public interface UserService {
    public void sayHello();
}
/*UserServiceImpl.java*/
public class UserServiceImpl implements UserService {
    @Override
    public void sayHello() {
        System.out.println("hello Spring!");
    }
}

2、Spring IOC:

/*applicationContext.xml*/
<!-- UserService的创建权交给了Spring -->
<bean id="userService" class="com.imooc.ioc.demo1.UserServiceImpl"></bean>

3、测试:

/*SpringDemo1.java*/
public class SpringDemo1 {
    @Test
    /**
     * 传统方式开发
     */
    public void demo1(){
        UserService userService = new UserServiceImpl();
        
        userService.sayHello();
    }
    @Test
    /*
        Spring的方式实现
     */
    public void demo2(){
        //创建Spring的工厂
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过工厂获得类:
        UserService userService=(UserService) applicationContext.getBean("userService");
        userService.sayHello();
    }
}

二、IOC和DI的概念

2.1 IOC和DI的概念

IOC : Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理(即创建UserService对象控制权被反转到了Spring框架)。

DI :Dependency Injection 依赖注入的概念,就是在Spring创建这个对象的过程中,将这个对象所依赖的属性注入进入。

将上面的例子通过增加属性的方式来了解依赖注入:

代码:
1、传统方式:

/*UserService.java*/
public interface UserService {
    public void sayHello();
}
/*UserServiceImpl.java*/
public class UserServiceImpl implements UserService {
    // 添加属性:
    private String name;

    @Override
    public void sayHello() {
        System.out.println("Hello Spring! "+name);
    }

    public String getName() {
        return name;
    }

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

2、Spring IOC:

/*applicationContext.xml*/
<!-- UserService的创建权交给了Spring -->
<bean id="userService" class="com.imooc.ioc.demo1.UserServiceImpl">
	<property name="name" value="李四"/>
</bean>

增加property标签,将属性注入。

3、测试:

/*SpringDemo1.java*/
public class SpringDemo1 {
    @Test
    /**
     * 传统方式开发
     */
    public void demo1(){
        // UserService userService = new UserServiceImpl();
        UserServiceImpl userService = new UserServiceImpl();
        // 设置属性:
        userService.setName("张三");
        userService.sayHello();
    }
    @Test
    /*
        Spring的方式实现
     */
    public void demo2(){
        //创建Spring的工厂
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过工厂获得类:
        UserService userService=(UserService) applicationContext.getBean("userService");
        userService.sayHello();
    }
}

可以看到,增加属性后,spring的方式不需修改源代码,只是修改xml文件即可。

控制反转:< bean id="" class=""></ bean >
依赖注入:< property name="" value=""/>
依赖注入就是用spring来生成对象时,将对象的属性赋值进去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值