【无标题】

Spring Boot VS Servlet

使用Spring Boot 项目演示框架相比于servlet所具备的以下优点

  1. 无需配置tomcat 点击运行按钮就可以运行,(sb内置web容器)
  2. 快速添加外部jar包
  3. 快速发布项目(java -jar方式)
  4. 对象自动装配

Spring Framework系统架构

coew cintainer 核心容器
AOP
Aspects
在这里插入图片描述

IoC(inversion of control 控制反转)/DI(dependency inject 依赖注入)

依赖注入

spring是什么?

  • 它是包含了多个工具方法的ioc容器,对象的创建和销毁的权利都交给了spring来管理,它本身又具备了存储对象和获取对象的能力
  • spring提供了一个容器,称为ioc容器,用来充当ioc思想中的“外部”

功能

  • 将对象存入容器
  • 从容器中取出对象

IoC和DI是啥,有什么区别?

IoC

  • 控制反转,由上级对象创建并控制下级对象,而是下级对象注入当前对象中,当下级发生改变,当前类都是不受影响的
  • 使用对象时,主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部

DI
-通过setter方法注入
-通过构造方法注入

bean:

bean 对象 带有某种特征的对象 bean对象默认为单例
适合交给容器进行管理的bean

  • 表现层对象
  • 业务层对象
  • 数据层对象
  • 工具对象
    不适合交给容器进行管理的bean
    -封装实体的域对象
<?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 标签配置bean-->
<!--    id属性给bean起名字-->
<!--    class属性表示给bean定义类型 一般为所需对象的实现类的路径-->
    <bean id="我的第一个商品" class="com.hututu.ioc3.EmptyClass" />

    <!-- 注册新的类,并且进行构造方法注入 -->
    <bean id="我的第二个商品" class="com.hututu.ioc3.SecondClass">
        <!-- 请用 "我的第一个商品" 的对象,注入我的构造方法参数中 -->
        <constructor-arg ref="我的第一个商品" />
    </bean>

    <!-- setter 方法注入 -->
<!--    property表示配置当前bean属性 -->
<!--    name表示配置具体哪一个属性-->
<!--    ref表示参考哪一个bean-->

    <bean id="我的第三个商品" class="com.hututu.ioc3.ThirdClass" >
        <property name="emptyClass" ref="我的第一个商品" />
        <property name="secondClass" ref="我的第二个商品" />
    </bean>
   
</beans>

spring通过反射机制去实现的,所以当类为private时也可以正常被调用

bean实例化
- 通过构造方法
- 静态工厂
- 实例工厂
	==FactoryBean==
public class FactoryBean implements org.springframework.beans.factory.FactoryBean<BookService> {

    // 代替原始实例工厂中创建对象的方法
    public BookService getObject() throws Exception {
        return new BookServiceImpl();
    }

    @Override
    public Class<?> getObjectType() {
        return BookService.class;
    }

    @Override
    public boolean isSingleton() {
        return true;  //单例
      //  return false; 非单例
    }
}

构造方法

package com.hututu.impl;

/**
 * @author hututu
 * @date 2022/08/12 16:23
 **/
public class BookServiceImpl implements BookService{
  

    private BookServiceImpl() {
        System.out.println("Bookservice构造方法");
    }

    @Override
    public void save() {
        System.out.println("bookservice被调用了");

    }
}

静态工厂

public class StaticFactory {
    public static Bean createBean(){
        return new Bean();
    }
}

实例工厂

public class instance_factory {
    //无参构造
    public  instance_factory(){
        System.out.println("实例化工厂");
    }
    public Bean createBean(){
        return  new 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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">


<!--构造方法-->
    <bean id="bean1" class="com.hututu.static_factory.Bean" />

<!--    静态工厂-->
    <bean id="bean2" class="com.hututu.static_factory.StaticFactory" factory-method="createBean"/>
<!--    实例工厂-->
    <bean id="instance" class="com.hututu.static_factory.instance_factory" />
    <bean id="bean3" factory-bean="instance" factory-method="createBean" />
</beans>
bean生命周期
  • 初始化容器
    1创建对象
    2执行构造方法
    3执行属性注入
    4bean初始化方法

  • 使用bean

  • 关闭/销毁容器
    bean销毁:

手工关闭容器 configurableApplicationContext接口close()操作
注册关闭钩子 在虚拟机退出前先关闭容器再退出虚拟机 configurableApplicationContext接口registerShutdownHook()操作

注解注册

注解(@componment)修饰类

   <!-- 扫描这个包的下所有类 -->
    <context:component-scan base-package="com.hututu.ioc2" />

@Component 被修饰的类全部注册进spring容器中(实例化过程全部交给spring)
@component
@Controller MVC的C部分(控制器)
@Service 中间数据整合
@Repository 数据获取操作
@Configuration 配置
以上都是可以将类注册进spring中

@Configuration
public class AppConfig {
    @Bean
    // <bean id="方法名" factory-bean="appConfig" factory-method="hututu"
    public String hututu(){
        return "胡图图";
    }
}

总结

  1. 直接调用context.getBean(…)
  2. 使用bean注入 (IoC/DI 广泛使用)
  • 构造方法 (推荐)
  • setter方法
  • 属性直接注入
 <!-- 注册新的类,并且进行构造方法注入 -->
    <bean id="我的第二个商品" class="com.hututu.ioc2.SecondClass">
        <!-- 请用 "我的第一个商品" 的对象,注入我的构造方法参数中 -->
        <constructor-arg ref="我的第一个商品" />
    </bean>

    <!-- setter 方法注入 -->
    <bean id="我的第三个商品" class="com.hututu.ioc2.ThirdClass">
        <property name="emptyClass" ref="我的第一个商品" />
        <property name="secondClass" ref="我的第二个商品" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是香橙啊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值