Spring(一)---IOC思想

引言

当下最火的框架,莫不是Spring全家桶了,而Spring框架在业务层有两个非常重要的思想,IOC和AOP. 这边,我先记录下我对Spring框架IOC的一些理解.

简单介绍

老规矩,看一下百度百科.这里写图片描述

其实说明白了 ,就是通过配置,将以前手动new对象的实例化过程,交给Spring 框架.当项目启动的时候,Spring框架中的,管理所有Bean的Spring容器会启动,帮我们自动初始化创建我们所需要的Bean,这边就称为IOC.当我们要调用对象的时候,直接注入即可.

**重点内容:**IOC底层其实就是反射!!!

IOC控制反转实现

一般分为两步:

1.配置文件
我这边简单举例说明:

<?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">

    <!-- 将dao交给spring管理 -->
    <bean id=userDao class="cn.ding.spring.UserDaoImpl">
</beans>

2.引用
这里写图片描述

DI依赖注入的实现

这里写图片描述

IoC:是一个大的思想,将某件事情(对象创建权利等)的控制前交给第三方管理。
DI:还是IoC的思想,将对象依赖注入权利交给第三方管理。

简单举例来说,就是Service通过IOC创建,而Service 里面的DAO 通过DI注入进去.

Spring工厂

ApplicationContext直译为应用上下文,是用来加载Spring框架配置文件,来构建Spring的工厂对象,它也称之为Spring容器的上下文对象,也称之为Spring的容器。
ApplicationContext 只是BeanFactory(Bean工厂,Bean就是一个java对象) 一个子接口.
前面一直说我们把创建对象的权利交给了Spring工厂,那么Spring工厂又是什么呢?

这里写图片描述
这时候不禁想问,为什么不用BeanFactory直接操作呢?
其实ApplicationContext对BeanFactory做了一些扩展

  • 事件传递
  • Bean自动装配
  • 各种不同应用层的Context实现

    Spring工厂的两种获取方式

    • 如果applicationContext.xml 在 src下, ClassPathXmlApplication读取
    • 如果applicationContext.xml 在WEB-INF下,FileSystemXmlApplicationContext读取

IOC装配Bean—XML方式讲解

实例化bean有四种方式:
1. 无参数构造器 (最常用)
2. 第二种 静态工厂方法
3. 实例工厂方法
4. FactoryBean方式。(源码底层用的多)

* BeanFactory和FactoryBean的区别?*
BeanFactory(ApplicationContext):是一个工厂(其实是构建了一个spring上下文的环境,容器),用来管理和获取很多Bean对象,
FactoryBean:是一个Bean生成工具,是用来获取一种类型对象的Bean,它是构造Bean实例的一种方式。

Bean的作用域

这里写图片描述

注意:在spring中默认值是singleton(单例),也就是说一个spring容器中,只能有一个对象的实例.

Bean的注入

简单来说,bean的注入就是给一个对象赋值.有三种方式:这里写图片描述

  1. 第一种:构造器参数注入
    我们举一个实例: new Car(Sring id,Sring name,Double price),以下是applicationContext.xml的写法:
    这里写图片描述

  2. 第二种:setter方法属性注入(setter方法的规范-JavaBean规范),这边举一个实例:
    new Person(Integer id,String name,Car car),配置如下:
    这里写图片描述

  3. 第三种:接口注入
    这个就不放出实例了,有兴趣的朋友可以留言,或者自己去查找相关资料~

spEL表达式

spEL(Spring Expression Language)是一种表达式语言,它是spring3.x版本的新特性。
它的作用是:支持在运行时操作和查询对象,其语法类似统一的EL语言,但是SpEL提供了额外的功能,功能更强大。
语法: #{…} , 引用另一个Bean 、属性、 方法
SpEL表达式的使用功能比较多,Bean操作相关的通常有:
1. #{beanid} 引用Bean(具体对象)
2. #{beanId.属性} 引用Bean的属性
3. #{beanId.方法(参数)} 调用Bean的方法

IOC容器装配Bean—基于注解的配置方式

扫描机制

这边想要引用注解,必须开启包扫描,让spring框架知道,哪些包下面有注解需要去扫描

<context:componet-scan  base-package="xxx.xxx"/> 

依赖注入的注解

1.简单类型的注入: @Value:适用于简单类型注入

@Value=("jack")
String name;

2.复杂类型注入:
注解实现属性依赖注入,将注解加在setXxx方法上 或者 属性定义上 !(任选其一,省代码了)

Spring和web集成

可以发现 如果每次程序运行,我们都手动去new ClassPathXmlApplicationContext(),然后获得Bean,很麻烦. 而且spring容器是一个大对象,创建的时候要占用许多资源,所以,我们应该将其绑定到web Servlet 容器中,让Web容器来管理Spring容器的创建和销毁。

其实这个操作对我们来说非常简单,就是在web.xml中配置一个Spring 容器的监听器,当web Servlet 启动,自动帮我们一次性创建spring 容器,初始化所有的Bean对象.当web Servlet 关闭,关闭掉我们的spring容器即可.

总结

相信通过这篇文章 ,大家也能像我一样对Spring 容器,IOC 思想有了初步的认识.我上传了部分资料,关于Spring 基础和源码,大家如果需要可以自行下载.
链接: https://pan.baidu.com/s/1pNspgin 密码: zg97

猜你喜欢

转载自blog.csdn.net/qq_14853889/article/details/79296831