• Java之spring新手教程(包教包会)


    Java-Spring(一)之IoC以及bean的生命周期

    文章目录


    一、什么是Spring

    在这里插入图片描述
    这是度娘上的比较官方的解释。
    说得更加详细一点,Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。

    二、Spring的核心

    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

    轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

    控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

    面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

    容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

    框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
    所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

    三、什么是耦合

    简单来讲耦合指的就是两个类之间的联系的紧密程度
    最简单的例子就是我些了一段代码,而在另外一个地方又写了一遍差不了太对的代码。这样可以成为耦合度高。

    在java编程的过程中,我们尽量要避免重复的造轮子,应运而生的框架就诞生了,Spring就能够做到解耦合。

    四、spring项目的搭建

    这里我是用的是maven仓库来添加的依赖
    把以下依赖加入pom文件中

    
        
          org.projectlombok
          lombok
          1.18.20
          provided
        
     
              
                org.springframework
                spring-beans
                5.3.3
              
              
              
                org.springframework
                spring-context
                5.3.9
              
              
              
                org.springframework
                spring-core
                5.3.8
              
              
              
                taglibs
                standard
                1.1.2
              
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    这就是我们spring所需要的基础的依赖

    五、配置文件

    在资源文件包下建立一个XML文件作为我们spring的一个配置文件

    六、IoC(控制反转)

    在基本的项目搭建完成之后,我们就要先来了解Spring的核心之一:
    IoC(控制反转)
    在我们以前的程序书写中,我们用到对象大都是以new的方式去创建对象:
    以前学到创建对象的方式
    1、new
    2、反射
    3、序列化

    那么Spring给我们提供的一种全新的创建对象的方式。
    我们可以把创建对象的工作全部交给Spring来给我们完成
    这个就叫做IoC
    比如:

    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class Person {
        private String name;
        private Car car;
        private List list;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    我这里有一个对象,那么我们要创建对象就可以去配置文件中书写

    
    
    • 1

    来表示我们创建的对象,以及相应的赋值

    在主方法中调用

      ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
            Person person = (Person) ac.getBean("per");
    
    • 1
    • 2

    以getBean()的方式来获取我们的bean对象

    七、属性注入的方式

    1、设值注入

    
    	
    		
    		
    		
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这其实就是简单的调用set方法来给属性赋初值,如果在类中没有set方法,就会出现异常

    2、构造方法注入

    
    	
    		
    		
    		
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    顾名思义,和设置注入一样就是通过构造器去给属性赋值,同set一样,也是必须要有有参构造方法的书写的。

    八、DI(依赖注入)

    IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency IInjection,依赖注入)来实现的。

    比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

    其实在上面的例子中我们也用到了DI,

    
    
    • 1

    这里的User也依赖与我们的Role的一个对象,

    所以我们要在配置文件中添加一个新的Bean对象。

    	
    		
    		
    		
    	
    
    	
    		
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意:在我们DI的过程中我们是不需要去注意Bean对象的顺序,spring会进行二次扫描,来创建我们需要有依赖的对象。

    九、集合属性的注入

    其实集合也是一种对象我们可以通过DI的方式去注入集合属性

    1、内部注入

    
    		
    			
    				123
    				123
    				123
    			
    		
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在我们的Bean对象的内部去注入我们的属性就是我们注入的集合类型

    set集合 map映射改这里就行

    			
    				
    			
    
    • 1
    • 2
    • 3

    由于map是以键值对的形式存储的,我们在给值的同时,也要以entry来给值

    2、外部注入

    这里我们就要用到我们的头部文件,

    xmlns:util="http://www.springframework.org/schema/util"
     xsi:schemaLocation="http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
    
    • 1
    • 2

    就能在我们xml配置文件中来用到我们的util工具

    
    			123
    			123
    			123
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5

    十、Spring管理Bean的作用域

    spring bean作用域的作用域有5种
    Spring Bean 中所说的作用域,在配置文件中即是“scope”

    1、singleton(单实例)

    是默认的作用域
    在不配置scope时我们创建的对象时单例的

     Person person = (Person) ac.getBean("per0");
            Person person1 = (Person) ac.getBean("per0");
            Person person2 = (Person) ac.getBean("per0");
            Person person3 = (Person) ac.getBean("per0");
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    所有对象的地址相同

    2、prototype

    修改scope的值为prototype之后
    在这里插入图片描述
    就变成了不同的对象

    3、request

    Request作用域针对的是每次的Http请求,Spring容器会根据相关的Bean的
    定义来创建一个全新的Bean实例。而且该Bean只在当前request内是有效的。

    4、session

    针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例, 且该userPreferences bean仅在当前HTTP Session内有效。 与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例, 将不会看到这些特定于某个HTTP Session的状态变化。 当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

    5、global session

    global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。

    十一、Bean的生命周期

    1、五步

    1、构造
    2、set赋值
    3、初始化
    4、对象获取到了
    5、销毁

    这里我们要重写init方法和destroy方法

    public class BeanLife {
        private String name;
    
        public BeanLife () {
            System.out.println("无参构造");
        }
    
        public void setName (String name) {
            System.out.println("Set");
            this.name = name;
        }
        public void init(){
            System.out.println("init");
        }
        public void destroy(){
            System.out.println("destroy");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    执行结果为
    在这里插入图片描述

    2、七步

    在Bean创建对象的时还有一种在前后插入方法的类

    public class BeanLife1 implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization (Object bean, String beanName) throws BeansException {
            System.out.println("之前");
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization (Object bean, String beanName) throws BeansException {
            System.out.println("之后");
            return bean;
        }
    }
    
    
    
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    我们创建BeanLife时就会出现

    在这里插入图片描述
    1、构造
    2、set赋值
    3、之前插入方法
    4、初始化
    5、对象获取到了
    6、之后回去方法
    7、销毁

    十二、Bean的两种方式

    1、创建普通Bean对象

    就是最普通的创建普通Bean对象

    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext1.xml");
            Person person = ac.getBean("factory",Person.class);
            person.setName("lili");
            System.out.println(person);
    
    • 1
    • 2
    • 3
    • 4

    2、创建工程Bean工厂

    public class Factory implements FactoryBean {
        @Override
        public Person getObject () throws Exception {
            return new Person();
        }
    
        @Override
        public Class getObjectType () {
            return Person.class;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    然后来通过工厂来创建队形的实例

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    Linux下JSON解析工具
    Spring-Boot (二) application.properties配置文件内容
    这几个必备的vscode插件,你安装了几个
    k8s 部署 springboot 项目内存持续增长问题分析解决
    南京邮电大学微机原理 第三次实验代码
    2.【远程调用框架】Feign远程调用
    C语言航路外传之如何隐藏代码及声明和定义的在工程中真正的使用场景
    AI智能盒子助力打造垃圾发电AI应用标杆!
    【C#】用于基于 UV DLP 的 3D 打印机的切片软件源码解析(一)DLP原理 & GUI
    chatgpt赋能python:Python找零-让你的生活更轻松
  • 原文地址:https://blog.csdn.net/bhegi_seg/article/details/126105930