Spring源码深度解析,Spring源码核心技术,IOC,Bean, (二)(附代码示例:)

二.Spring的 核心技术

目录

二.Spring的 核心技术

一,IOC 容器

2.1.1,代码示例:在没有 Spring 的管理下

2.1.2,示例代码:在 Spring 的管理下

二,容器概述

三 ,配置元数据

四,实例化容器

 2.4.1示例代码

五,Bean 概述

         2.5.1,Bean 的创建

2.5.2,Bean 的实例化

2.5.3, Bean 的生命周期

六,项目Demo地址,正在持续更新~~~~~~~~~~


 

一,IOC 容器

              IOC 也成为 DI(dependency injection) , 它是对象定义其依赖关系的过程. 一般对象通过构造器参数、工厂方法参数或者构造(工厂方法返回实例)之后 set 相应的属性完成依赖配置. 容器在创建Bean的时候注入这些依赖,这个过程从根本上来说是反转,因此叫做 IOC , 它通过直接构建类来控制其初始化或依赖类的位置。这种机制类似服务定位器设计模式。

Spring Framework IOC 容器的基础包是 org.springframework.beans 与 org.springframe.context. 其中接口 BeanFactory 提供框架配置和基本功能,其子接口 ApplicationContext 增加了更多的企业级功能,如国际化资源处理、事件发布以及应用层特定的上下文(如用于web应用的 WebApplicationContext).ApplicationContext BeanFactory 完整的超集.

我理解的 IOC :  即控制反转,依赖注入, iocSpring的核心组件它通过配置文件将需要的创建的对象以池的方式管理。 动态注入, 让一个对象的创建不用new了,可以自动的生产,这其实就是利用 java 里的反射,反射其实就是在运行时动态的去创建,调用对象,Spring就是在运行时,跟 xml Spring 的配置文件来动态的创建对象,和调用对象里的方法的。 

  • 多实例,仅当 bean 被使用的时候才创建
  • 单实例,创建 IOC 容器的时候实例, bean 就被创建了   (面试经常被问到)

    单实例,多实例源码分析实例https://blog.csdn.net/Crazy_Cw/article/details/90980030  @Scope 注解

2.1.1,代码示例:在没有 Spring 的管理下

public class Person {
	private String name;
	private Integer age;
	
	public Person(){
		super();
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Person(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Integer getAge() {
		return age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public void setAge(Integer age) {
		this.age = age;
	}
}
//如果没有用到Spring 我们是怎么做的呢?

public class Test {
    //在一般java的获得实例对象时

        Person per =new Person();
}

2.1.2,示例代码:在 Spring 的管理下

<?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 id="person" class="com.enjoy.cap1.Person">
		<property name="name" value="james"></property>
		<property name="age" value="19"></property>
	</bean>
</beans>
public class Test{
    public static void main(String args[]){
		//把beans.xml的类加载到容器
		ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
		//从容器中获取bean
		Person person = (Person) app.getBean("person");
		
		System.out.println(person);
	}
}

二,容器概述

ApplicationContext 接口相当于负责 bean 的初始化、配置和组装的IoC容器. 
           Spring为ApplicationContext 提供了一些开箱即用的实现, 独立的应用可以使用 ClassPathXmlApplicationContext 或者        FileSystemXmlApplicationContext,web 应用在 web.xml 配置监听,提供xml位置和org.springframework.web.context.ContextLoaderListener 即可初始化 WebApplicationContextIoC 容器.

三 ,配置元数据

配置元数据配置了应用中实例的实例化、配置以及组装的规则,SpringIoC容器通过此配置进行管理Bean. 配置元数据有以下几种方式:

基于XML配置: 清晰明了,简单易用基于Java代

码配置:无xml,通过 @Configuration 来声明配置、对象实例化与依赖关系

示例代码1.3:@Configuration 来声明配置、对象实例化与依赖关系

//配置类====配置文件
@Configuration
public class PersonConfig {
	//给容器中注册一个bean, 类型为返回值的类型, 
	@Bean("person")
	public Person person01(){
		return new Person("james",20);
	}
}

基于Java注解配置:少量的 XML(<context:annotation-config/>),通过注解声明实例化类与依赖关系
后续的分析基于XML配置, 与Java代码和注解大体上的机制是一样

四,实例化容器

实例化容器非常简单,只需要提供本地配置路径或者根据ApplicationContext的构造器提供相应的资源(Spring的另一个重要抽象)即可.

       2.4.1示例代码

//这是通过类路径找到 自定义的  springxml
ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");

此处先给出类图, 稍后再做具体分析.

五,Bean 概述

Spring IOC 容器管理了多个根据配置元数据创建的bean. 在容器内部,这些 Bean 可以描述为 BeanDefinition 对象,它主要包含这些元数据:

  • 全类名:通常为 Bean 的实际实现类
  • Bean 的行为配置元素,这种状态描述了 Bean 在容器中的行为,如作用域、生命周期回调等等.
  • 当前 Bean 依赖 Bean 的引用: 依赖项
  • 新创建对象中的其他配置设置,如池对象 Bean 的池大小限制等.

容器除了通过配置元数据管理bean之外, 还可以通过  ApplicationContext 的方法 getBeanFactory()获取, BeanFactory的实现 DefaultListableBeanFactory 来注册自己的bean, 但不建议使用.

 2.5.1,Bean 的创建

//第一种通过xml 方式来注册bean
<bean id="person" class="com.enjoy.cap1.Person"/>

//第二种方式 使用注解 @bean
@Bean("person")
	public Person person01(){
		return new Person("james",20);
	}

2.5.2,Bean 的实例化

可以将bean的定义想象为创建对象的菜谱,容器在请求时查看对应bean的配方(配置元数据),并使用该配方创建实际对象.

使用XML配置元数据的时候需要指定bean的class属性,class属性强制作为BeanDefinition的getBeanClassName()值,但这个属性不一定是运行时的最终类名(静态工厂方法或者类继承).

使用Class属性有种方式:

  • 通常,当容器本身通过反射调用其构造函数直接创建bean的时候需要制定Class,这与new ...()操作类似
  • 指定包含静态工厂方法的实际类,该方法用于创建对象.
<bean id="person" class="com.enjoy.cap1.Person" />

2.5.3, Bean 的生命周期

  • 创建---初始化---销毁的过程
  • bean 的生命周期是由容器管理的
  • 我们可以自定义bean 初始化, 销毁的方法
  • 容器在bean 进行到当前生命周期的时候,来调用自定义的初始化和销毁方法

 详细的 Bean 的生命周期 Spring 源码 示例 请看  -----》Spring源码深度解析,初始Spring源码---Bean的生命周期(五)(附代码示例:)https://blog.csdn.net/Crazy_Cw/article/details/92437266

六,项目Demo地址,正在持续更新~~~~~~~~~~

Spring源码深度解析,(附代码示例 码云地址: https://gitee.com/Crazycw/SpringCode.git

参考资料:  https://docs.spring.io/spring/docs/4.3.18.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/

请看下篇: Spring源码深度解析,初始Spring源码(三)(附代码示例:)

https://blog.csdn.net/Crazy_Cw/article/details/90980030

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可乐cc呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值