首页 > 其他分享 >spring——IOC

spring——IOC

时间:2024-03-28 18:32:05浏览次数:15  
标签:容器 spring bean Spring 组件 IOC public

1、spring简介

1.1、Spring概述

官网地址:Spring | Home

Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用

Spring 框架来创建性能好、易于测试、可重用的代码。

Spring 框架是一个开源的 Java 平台,它最初是由 Rod Johnson 编写的,并且于 2003 年 6 月首

次在 Apache 2.0 许可下发布。

Spring 是轻量级的框架,其基础版本只有 2 MB 左右的大小。

Spring 框架的核心特性是可以用于开发任何 Java 应用程序,但是在 Java EE 平台上构建 web 应

用程序是需要扩展的。 Spring 框架的目标是使 J2EE 开发变得更容易使用,通过启用基于 POJO

编程模型来促进良好的编程实践。

1.2、Spring家族

项目列表:Spring | Projects

1.3、Spring Framework

Spring 基础框架,可以视为 Spring 基础设施,基本上任何其他 Spring 项目都是以 Spring Framework为基础的。

1.3.1、Spring Framework特性
  • 非侵入式:使用 Spring Framework 开发应用程序时,Spring 对应用程序本身的结构影响非常

小。对领域模型可以做到零污染;对功能性组件也只需要使用几个简单的注解进行标记,完全不会

破坏原有结构,反而能将组件结构进一步简化。这就使得基于 Spring Framework 开发应用程序

时结构清晰、简洁优雅。

  • 控制反转:IOC——Inversion of Control,翻转资源获取方向。把自己创建资源、向环境索取资源变成环境将资源准备好,我们享受资源注入。

  • 面向切面编程:AOP——Aspect Oriented Programming,在不修改源代码的基础上增强代码功能。

  • 容器:Spring IOC 是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发效率。

  • 组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XML和 Java 注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭建超大型复杂应用系统。

  • 声明式:很多以前需要编写代码才能实现的功能,现在只需要声明需求即可由框架代为实现。

  • 一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且

Spring 旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在 Spring Framework 的基

础上全部使用 Spring 来实现。

1.3.2、Spring Framework五大功能模块
功能模块功能介绍
Core Container核心容器,在 Spring 环境下使用任何功能都必须基于 IOC 容器。
AOP&Aspects面向切面编程
Testing提供了对 junit 或 TestNG 测试框架的整合。
Data Access/Integration提供了对数据访问/集成的功能。
Spring MVC提供了面向Web应用程序的集成功能。

2、IOC

2.1、IOC容器

2.1.1、IOC思想

IOC:Inversion of Control,翻译过来是反转控制

①获取资源的传统方式

自己做饭:买菜、洗菜、择菜、炒菜,全过程参与,费时费力,必须清楚了解资源创建整个过程中的全部细节且熟练掌握。

在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的

模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。

②反转控制方式获取资源

点外卖:下单、等、吃,省时省力,不必关心资源创建过程的所有细节。

反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。

③DI

DI:Dependency Injection,翻译过来是依赖注入

DI 是 IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器

的资源注入。相对于IOC而言,这种表述更直接。

所以结论是:IOC 就是一种反转控制的思想, 而 DI 是对 IOC 的一种具体实现。

2.2、 IOC在spring中的实现

Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建bean 之前,首先需要创建 IOC 容器。Spring 提供了 IOC 容器的两种实现方式:

①BeanFactory

这是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。

②ApplicationContext

BeanFactory 的子接口,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用

ApplicationContext 而不是底层的 BeanFactory。

2.3 基于XML管理bean

所有jia包下载地址:jar包icon-default.png?t=N7T8https://download.csdn.net/download/qq_43905491/89035509

2.3.1 创建IOC容器
  1. 创建 applicationContext.xml ,放在src目录底下。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:tx="http://www.springframework.org/schema/tx" 
        xmlns:aop="http://www.springframework.org/schema/aop" 
        xmlns:context="http://www.springframework.org/schema/context" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx.xsd 
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop.xsd">
          
        <!--创建bean-->
        <bean id="HelloWorld" class="com.spring.bean.HelloWorld"> </bean>
    </beans>
  2. 获取bean

    public class HelloWorld {
        public void sayHello() {
            System.out.println("Hello Spring");
         }
     }
    ​
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
            //根据bean的id获取对象
            //HelloWorld helloWorld  = (HelloWorld) ac.getBean("helloWorld");
            //根据类名获取对象  这种情况类只能有一个对象
            //HelloWorld helloWorld = ac.getBean(HelloWorld.class);
            //根据id+类名获取
            HelloWorld helloWorld = ac.getBean("helloWorld", HelloWorld.class);
            helloWorld.sayHello();
2.3.2 依赖注入之setter注入
    <!-- 依赖注入之setter注入 -->
    <bean id="user" class="com.spring.bean.User">
        <property name="username" value="周杰伦"></property>
        <property name="paswd" value="123456"></property>
    </bean>
        User user = ac.getBean(User.class);
        System.out.println(user);
//结果:  User [username=周杰伦, paswd=123456]
2.3.3 依赖注入之构造器注入
    <!-- 构造器注入 -->
    <bean id="user2" class="com.spring.bean.User">
       <constructor-arg value="林俊杰"></constructor-arg>
       <constructor-arg value="6789"></constructor-arg>
    </bean>
//结果  User [username=林俊杰, paswd=6789]

2.4基于注解管理bean

2.4.1 标记与扫描
  1. 编写类。类上需要添加注解@Controller、@Service、@Repository

    @Controller
    public class Admin {
    ​
        public void idAdmin() {
            System.out.println("扫描注入,获取对象");
        }
    }

    @Controller、@Service、@Repository这三个注解只是在@Component注解的基础上起了三个新的名字。

    对于Spring使用IOC容器管理这些组件来说没有区别。所以@Controller、@Service、@Repository这

    三个注解只是给开发人员看的,让我们能够便于分辨组件的作用。

    注意:虽然它们本质上一样,但是为了代码的可读性,为了程序结构严谨我们肯定不能随便胡乱标记。

  2. 添加扫描注入

        <!-- 扫描注入   --> 
        <context:component-scan base-package="com.spring.bean"></context:component-scan>
  3. 测试

            //根据类名
        //Admin admin = (Admin) ac.getBean(Admin.class);
        //根据id
        Admin admin = (Admin) ac.getBean(“admin”);
            admin.idAdmin();
  4. Bean中id的确认方法

    在我们使用XML方式管理bean的时候,每个bean都有一个唯一标识,便于在其他地方引用。现在使用注解后,每个组件仍然应该有一个唯一标识。

    默认情况

    类名首字母小写就是bean的id。例如:UserController类对应的bean的id就是userController。

    自定义bean的id

    可通过标识组件的注解的value属性设置自定义的bean的id

    @Service("userService")//默认为userServiceImpl public class UserServiceImpl implements

    UserService {}

2.4.2 基于注解的自动装配
①场景模拟

参考基于xml的自动装配

在UserController中声明UserService对象

在UserServiceImpl中声明UserDao对象

②@Autowired注解

在成员变量上直接标记@Autowired注解即可完成自动装配,不需要提供setXxx()方法。以后我们在项目中的正式用法就是这样。

@Controller
public class UserController {
    //自动装配  即生成对象
    @Autowired
    private UserService userService;
  
    public void saveUser(){
        userService.saveUser();
    }
}
public interface UserService {
    void saveUser();
}
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    @Override
    public void saveUser() {
        userDao.saveUser();
    }
}
public interface UserDao {
    void saveUser();
}   
@Repository
public class UserDaoImpl implements UserDao {
    @Override
    public void saveUser() {
        System.out.println("数据库保存成功");
    }
}

标签:容器,spring,bean,Spring,组件,IOC,public
From: https://blog.csdn.net/qq_43905491/article/details/137018548

相关文章

  • Spring Boot 工程开发常见问题解决方案,日常开发全覆盖
    本文是SpringBoot开发的干货集中营,涵盖了日常开发中遇到的诸多问题,通篇着重讲解如何快速解决问题,部分重点问题会讲解原理,以及为什么要这样做。便于大家快速处理实践中经常遇到的小问题,既方便自己也方便他人,老鸟和新手皆适合,值得收藏......
  • SpringBoot框架学习
    SpringBoot相比Spring的优点1.开发基于Spring的应⽤程序很容易。2.SpringBoot项⽬所需的开发或⼯程时间明显减少,通常会提⾼整体⽣产⼒。3.SpringBoot不需要编写⼤量样板代码、XML配置和注释。4.Spring引导应⽤程序可以很容易地与Spring⽣态系统集成,如SpringJDB......
  • Java项目:77 springboot母婴商城
    作者主页:舒克日记简介:Java领域优质创作者、Java项目、学习资料、技术互助文中获取源码项目介绍本课题后端使用SpringBoot+SpringCloud框架,前端采用html,JQuery,JS,DIV+CSS技术进行编程,设计在线商城。系统具有前台和后台两大服务。前台主要有用户登录注册、浏览商品、......
  • Spring AOP 实现《自动自动填充Entity》
    定义注解AutoFill.java/***自定义注解,实现自动填填充功能*/@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceAutoFill{OperationTypevalue()defaultOperationType.INSERT;}定义AOPAutoFillAspect.java@Aspect@Co......
  • SpringCloud(三)统一网关 -- GateWay
    gateway官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 我们为什么选择Gatway?:neflix不太靠谱,zuul2.0一直跳票,迟迟不发布​一方面因为Zuul1.0已经进入了维护阶段,而且Gateway是SpringCloud团队研发的,是亲儿子产品,......
  • SpringBoot冬奥会科普平台系统设计与实现毕设(文档+源码)
    目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot冬奥会科普平台系统,项目源码请点击文章末尾联系我哦~目前有各类成品毕设JavaWeb SSMSpringBoot等等......
  • 计算机java项目|Springboot基于Hadoop的物品租赁系统的设计与实现
    作者主页:编程指南针作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互......
  • springboot/ssm城乡居民基本医疗信息管理系统Java医院挂号问诊系统web
    springboot/ssm城乡居民基本医疗信息管理系统Java医院挂号问诊系统web基于springboot(可改ssm)+vue项目开发语言:Java框架:springboot/可改ssm+vueJDK版本:JDK1.8(或11)服务器:tomcat数据库:mysql5.7(或8.0)数据库工具:Navicat/sqlyog开发软件:eclipse//idea依赖管理包:Mave......
  • Elasticsearch入门及常用命令和Spring中的常用操作
    入门官网简介一个分布式的、Restful风格的搜索引擎。支持对各种类型的数据的检索。搜索速度快,可以提供实时的搜索服务。便于水平扩展,每秒可以处理PB级海量数据。常用术语索引:与MySQL数据库中的Database相对应类型:与MySQL数据库中的Table相对应文档:相当于MySQL中的一......
  • SpringCloud微服务集成Dubbo
    1、Dubbo介绍ApacheDubbo是一款易用、高性能的WEB和RPC框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。用于解决微服务架构下的服务治理与通信问题,官方提供了Java、Golang等多语言SDK实现。使用Dubbo开发的微服务原生......