【Spring5】IOC容器与解耦合(下)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 文章目录1 IOC的概念与刨析1.1 IOC简介1.2 IOC底层原理1.3 IOC容器1.3.1 何为容器?1.3.2 IOC容器的理解2 IOC操作Bean管理2.1 Bean管理2.2 Bean管理xml形式2.2.1 创建对象与注入过程2.2.2 注入空值和特殊符号2.2.3 注入属性2.2.3.1 外部bean与内部bean2.2.3.2 注入集合2.3 工厂Bean2.4 Bean的作用域2.5 Bean的生命周期2.6 xml自动装配(偷懒的技巧)

3.也可以 使用内部bean的方式实现上述效果,对对象类型的属性进行注入: 在案例代码中,UserDaoImpl添加了name属性,因此,不仅仅展示了内部bean,同时也演示了级联赋值的操作:


 

<!--service和dao对象创建-->
    <bean id="userService" class="com.ithxh.spring5.service.UserService">
        <property name="userDao">
            <bean id="userDao" class="com.ithxh.spring5.dao.UserDaoImpl">
                <!--对象属性赋值-->
                <property name="userName" value="黄小黄"></property>
            </bean>
        </property>
    </bean>

2.2.3.2 注入集合

1.注入数组

以Student类的courses数组为例。



<bean id="student" class="com.ithxh.spring5.demo.Student">
        <!--数组类型属性注入-->
        <property name="courses">
            <array>
                <value>java</value>
                <value>English</value>
                <value>python</value>
            </array>
        </property>
    </bean>

2.注入List

与上面类似,相关的Student代码省略,不再赘述。set类型的注入也与下面代码类似,将list标签替换成set标签即可。

    <bean id="student" class="com.ithxh.spring5.demo.Student">
        <!--List类型属性注入-->
        <property name="list">
            <list>
                <value>java</value>
                <value>c</value>
                <value>c++</value>
            </list>
        </property>
    </bean>

3.注入Map

  <bean id="student" class="com.ithxh.spring5.demo.Student">
        <!--Map类型属性注入-->
        <property name="map">
            <map>
                <entry key="Java" value="jdk-1.8"></entry>
            </map>
        </property>
    </bean>

以上,如果在集合中存储的Value为对象,则可以通过标签实现,样板代码案例如下:


2.3 工厂Bean

Spring中有两种bean,一种是普通bean(自己创建的),一种是工厂bean(Spring里内置的)。区别如下:


普通bean:在配置文件中定义的bean类型就是返回类型;

工厂bean:在配置文件中定义的bean类型可以和返回类型不一样。


工厂bean实现步骤:

1.创建类,让该类作为工厂bean,实现FactoryBean接口;

2.实现接口里的方法,在实现方法里面返回bean类型


示例如下:

import org.springframework.beans.factory.FactoryBean;
import java.util.ArrayList;
import java.util.List;
/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * 工厂bean示例
 */
public class MyBean implements FactoryBean<Student> {
    @Override
    public boolean isSingleton() {
        //返回是否为单例
        return FactoryBean.super.isSingleton();
    }
    @Override
    public Student getObject() throws Exception {
        //定义返回bean
        Student student = new Student();
        //省略...
        List<String> strings = new ArrayList<>();
        strings.add("黄小黄");
        student.setList(strings);
        //返回...
        return student;
    }
    @Override
    public Class<?> getObjectType() {
        return Student.class;
    }
}

2.4 Bean的作用域

在Spring中可以设置创建的bean是单实例还是多实例。默认情况下,创建的bean是单实例对象。


在Spring的bean标签中,存在属性scope可以用于设置,其不同值对应表述如下:

1.默认值,singleton,表示单实例对象;

2.prototype,表示多实例对象;

3.request、session,表示每次创建将其放在域对象中(不常用)。


易错点:简述singleton与prototype的区别


1.singleton表示单实例,prototype表示多实例;

2.设置值为singleton时,在加载spring配置文件的时候就会创建单实例对象;而设置值为prototype时,是在调度getBean()方法的时候,去创建多实例对象。


2.5 Bean的生命周期

1.通过构造创建bean实例(无参构造);

2.为bean的属性设置值和其他bean(调用set方法);

3.调用bean中的初始化方法(需要通过bean标签的init-method属性配置);

4.bean可以使用,对象可以获取;

5.当容器在关闭的时候,调用bean的销毁方法(需要通过bean标签的destroy-method属性配置)。


示例代码:

创建类并设置相应的初始化和销毁方法

public class Student {
    private String name;
    public Student(){
        System.out.println("调用了无参构造");
    }
    public void setName(String name) {
        this.name = name;
        System.out.println("调用了set方法");
    }
    public void initMethod(){
        System.out.println("初始化方法");
    }
    public void destroyMethod(){
        System.out.println("销毁方法");
    }
}

文件配置

<bean id="student" class="com.ithxh.spring5.demo.Student" init-method="initMethod" destroy-method="destroyMethod">
        <property name="name" value="黄小黄"/>
    </bean>


测试

    @Test
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("demo3.xml");
        Student student = context.getBean("student", Student.class);
        System.out.println(student);
        //手动销毁bean实例
        ((ClassPathXmlApplicationContext) context).close();
    }


如果创建的类实现了接口BeanPostProcessor,则 创建了后置处理器。在bean生命周期初始化前和初始化后会分别调用postProcessBeforeInitialization 和 postProcessAfterInitialization方法, 配置文件也需要进行相应的配置。


2.6 xml自动装配(偷懒的技巧)

根据指定的装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入。


实现自动装配是通过bean标签的属性autowire配置自动装配,其有两个常用值:


byName根据属性名称自动装配,注入值bean的id和类属性名称一样

byType根据属性类型注入。

演示自动装配

    <bean id="student" class="com.ithxh.spring5.demo.Student" autowire="byName"></bean>
    <bean id="与待装配的属性名一致" class="xxx"></bean>


相关文章
|
22天前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
1月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
13天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
28 0
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
128 9
|
1月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
31 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
2月前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
40 4
|
1月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
67 0
|
1月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
48 0
|
9天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
38 2
|
19天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。