Spring核心(IoC) 入门解读

简介: Spring核心(IoC) 入门解读

IOC容器


什么是IoC容器和Bean?


说到容器,就是用来装东西,那么这里边装的是什么那?是bean对象。那么你会问什么是bean?这就要从很久很久以前说起,当我们创建对象的时候,我们会new一个对象出来,但是会有这么一个问题,当我们在不同的包下需要this对象的时候,我们都会进行new的操作,这还只是一个对象,那么要创建多个对象呢?


是不是很麻烦。Spring为我们解决了这一个难题,我们不在需要自己创建对象,由Sprig的BeanFactory为我们创建。所以说由SpringIoC容器管理的对象是bean对象,反过来说bean是由SpringIoc容器实例化、配置、组装的对象,而BeanFactory是SpringIoC的对象生产工厂。


思路结构:SpringIoC容器 --> BeanFactory工厂 --> bean对象


如何配置容器?


容器是个好东西,可以装bean对象、装水、装妹子……,容器该怎么使用那?有三种方式:


1、基于xml配置元数据


2、基于注解的方式告诉spring这个类要加载到容器当中去


3、基于java代码配置


简单介绍基于xml文件配置元数据(元数据就是实例化bean对象,处理bean对象之间的依赖等等一系列有关bean的配置)


xml文件基本结构:

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="【bean的别名】" class="【bean的完全限定的类名】">   
         <property name="【bean中对象参数名称】" ref="【所依赖的bean的别名】"/>
    </bean>


举个栗子

<bean id="demo" class="com.taobao.Seller">
         <property name="product" ref="productBean"/>
    </bean>
    <bean id="productBean" class="com.taobao.Product">
         <property name="id" value="007"/>
    </bean>
</beans>


实例化容器:


实例化容器一般在测试的时候用到:


知识小助手 --> 虽说SpringIoC容器靠BeanFactory工厂来创建对象的,但是更多的是org.springframework.context.ApplciationContext这个BeanFactory的子接口来做的,ApplicationContext是对BeanFactory的完善和补充。


容器的实例化是通过ApplicationContext来实例化的,其两个实现是ClassPathXmlApplicatonContext和FileSystemXmlApplication


举个栗子


//加载我们所配置的xml文件,默认从resource开始加载,可以加载多个xml文件哦
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml");
// getBean这个方法一看就是获取具体的bean,参数(bean的别名,bean的class)
PetStoreService service = context.getBean("petStore", PetStoreService.class);
// 拿到对象调用对象的getUsernameList()方法
List<String> userList = service.getUsernameList();


--> 以上就是容器简单的实例化


bean的详细概述:


image.png


Name: bean的命名


提倡小驼峰命名规则,可以使用id属性和name属性进行命名,在使用内部bean和开启自动装配时也可以不用命名,容器会为该bean生成唯一的名称。


bean的实例化方式:


1、Constructor arguments: 构造函数参数


在容器本身通过反向调用其构造函数直接创建bean的情况下指定要构造的bean类,需要bean的无参构造,稍微等同于使用new运算符的Java代码。



2、静态工厂方法实例化


定义使用静态工厂方法创建的bean时,请使用该class 属性指定包含static工厂方法的类,并使用factory-method名称的属性指定工厂方法本身的名称。您应该能够调用此方法(使用可选参数,如稍后所述)并返回一个活动对象,随后将其视为通过构造函数创建的对象。


举个栗子


//静态工厂类
public class ClientService {
    private static ClientService clientService = new ClientService();
    private ClientService() {}
    public static ClientService createInstance() {
        return clientService;
    }
}
<bean id="clientService"
    class="examples.ClientService"
    factory-method="createInstance"/>


3、实例工厂方法实例化


与通过静态工厂方法实例化类似,使用实例工厂方法进行实例化会从容器调用现有bean的非静态方法来创建新bean。


举个栗子


//实例工厂类
public class DefaultServiceLocator {
    private static ClientService clientService = new ClientServiceImpl();
    public ClientService createClientServiceInstance() {
        return clientService;
    }
}
<!--现有的bean-->
<bean id="serviceLocator" class="examples.DefaultServiceLocator"/>
<!-- 通过现有的bean的方法返回clientService对象 -->
<bean id="clientService"
    factory-bean="serviceLocator"
    factory-method="createClientServiceInstance"/>


bean的依赖注入DI


依赖注入(DI)是一个过程,通过这个过程,对象只能通过构造函数参数,工厂方法的参数或在构造对象实例后在对象实例上设置的属性来定义它们的依赖关系(即,它们使用的其他对象)。


DI存在两个主要变体:基于有参构造注入和基于Setter注入。

//有参构造
public class SimpleMovieLister {
    private MovieFinder movieFinder;
    public SimpleMovieLister(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
<beans>
    <bean id = "movieFinder"  class = "a.b.MovieFinder"/>
    //通过构造函数注入
    <bean id="simpleMovieLister" class="a.b.SimpleMovieLister">
        <constructor-arg ref="movieFinder"/>
    </bean>
</beans>
//基于Setter注入
public class SimpleMovieLister {
    private MovieFinder movieFinder;
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}
<beans>
    <bean id = "movieFinder"  class = "a.b.MovieFinder"/>
    <bean id="simpleMovieLister" class="a.b.SimpleMovieLister">
        <property name="movieFinder" ref="movieFinder">
        </property>
    </bean>
</beans>


bean的自动装配


image.png


当然也可以使用@Autowire按照类型装配和@Resource按照名称装配的注解

bean的范围


image.png


  • singleton:(默认)将单个bean定义范围限定为每个Spring IoC容器的单个对象实例。
  • protpeype: 将单个bean定义范围限定为任意数量的对象实例。
  • request: 将单个bean定义范围限定为单个HTTP请求的生命周期。也就是说,每个HTTP请求都有自己的bean实例,它是在单个bean定义的后面创建的。仅在具有Web感知功能的Spring环境中有效ApplicationContext。
  • session: 将单个bean定义范围限定为HTTP的生命周期Session。仅在具有Web感知功能的Spring环境中有效ApplicationContext。
  • application: 将单个bean定义范围限定为a的生命周期ServletContext。仅在具有Web感知功能的Spring环境中有效ApplicationContext。
  • websocket: 将单个bean定义范围限定为a的生命周期WebSocket。仅在具有Web感知功能的Spring环境中有效ApplicationContext


(点击可跳转)

1.Web网站架构演变历程

2. Java 编程军规

3.Springboot + redis + 注解 + 拦截器来实现接口幂等性校验

4. 有助于改善性能的Java代码技巧



目录
相关文章
|
1月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
1月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
1月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
6天前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
56 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
7天前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
7天前
|
Java 数据库连接 Maven
Spring基础1——Spring(配置开发版),IOC和DI
spring介绍、入门案例、控制反转IOC、IOC容器、Bean、依赖注入DI
Spring基础1——Spring(配置开发版),IOC和DI
|
30天前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
1月前
|
NoSQL Java Redis
Redis6入门到实战------ 八、Redis与Spring Boot整合
这篇文章详细介绍了如何在Spring Boot项目中整合Redis,包括在`pom.xml`中添加依赖、配置`application.properties`文件、创建配置类以及编写测试类来验证Redis的连接和基本操作。
Redis6入门到实战------ 八、Redis与Spring Boot整合
|
1月前
|
SQL 数据库
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
这篇文章是Spring5框架的实战教程,深入讲解了如何使用JdbcTemplate进行数据库的批量操作,包括批量添加、批量修改和批量删除的具体代码实现和测试过程,并通过完整的项目案例展示了如何在实际开发中应用这些技术。
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
|
1月前
|
XML Java 数据格式
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
这篇文章是Spring5框架的AOP切面编程教程,通过XML配置方式,详细讲解了如何创建被增强类和增强类,如何在Spring配置文件中定义切入点和切面,以及如何将增强逻辑应用到具体方法上。文章通过具体的代码示例和测试结果,展示了使用XML配置实现AOP的过程,并强调了虽然注解开发更为便捷,但掌握XML配置也是非常重要的。
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解