Spring学习笔记+SpringMvc+SpringBoot学习笔记

壹、核心概念:

1.1. IOC和DI

IOC(Inversion of Control)控制反转:对象的创建控制权由程序转移到外部,这种思想称为控制反转。/使用对象时,由主动new产生对象转换为由外部提供对象,此过程种对象创建控制权由程序转移到外部,此思想称为控制反转。/Spring提供了一个容器,称为IoC容器,用来充当Ioc思想中的"外部"。/IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean。

DI(Dependency Injection)依赖注入:在容器中建立bean与bean之间的依赖关系的整个过程,,称为依赖注入。

Spring实现充分解耦:使用IoC容器管理bean+在IoC容器内将有依赖关系的bean进行关系绑定。

实现效果:使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系。

贰、重要知识点

2.1 <property>标签

<property>标签表示配置当前bean的属性,name属性表示配置哪一个具体的属性,ref属性表示参照哪一个bean。

2.2 给bean起别名

在<bean>标签的name属性中指定名称,多个别名之间可以用逗号、分号或者空格分隔。

在<>

2.3 bean的作用范围

通俗地说:看造的对象是单例的还是非单例的。

在<bean>标签的scope属性中进行修改,singleton是单例,prototype是非单例,默认是单例的。

使用FactoryBean实例化bean,想调整单例非单例:

复制代码
public boolean isSingleton(){
    return true; //表示单例
}

Spring帮我们管理的是可以复用的对象,提高我们的效率。

适合交给容器进行管理的bean(可以反复用):表现层对象,业务层对象service,数据层对象dao,工具对象。不适合交给容器进行管理的bean(有状态的,会记录成员变量的属性值):封装实体的域对象。

2.4 bean的实例化

私有的东西能访问是通过反射。

方法1:通过构造方法来实例化对象

复制代码
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

方法2:使用静态工厂创建对象

class配的是工厂类名,还需要添加工厂中真正用来造对象的方法名:

复制代码
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao">

方法3:实例工厂初始化bean

先把工厂对象造出来:

复制代码
<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>

factory-bean写工厂的实例在哪,factory-method写工厂中的方法名:

复制代码
<bean id="userDao factory-method="getUserDao" factory-bean="userFactory">

方法4:使用FactoryBean实例化bean

复制代码
public class UserDaoFactoryBean implements FactoryBean<UserDao>{
    //代替原始实例工厂中创建对象的方法
    @Override
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

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

2.5 bean的生命周期

bean生命周期:bean从创建到消亡的完整过程

在<bean>标签里,init-method属性填写初始化的方法,destroy-method填写销毁的方法。

想要调用销毁方法还要调用容器close方法(更加暴力),也可以调用registerShutdownHook方法。

在ServiceImpl类中可以,继承InitializingBean和DisposableBean

叁、实际操作过程

一、配置Spring文件

1.1 初始

管理什么?(Service与Dao)

如何将被管理的对象告知IoC容器?(配置)

被管理的对象交给IoC容器,如何获取到IoC容器?(接口)

IoC容器得到后,如何从容器中获取bean?(接口方法)

使用Spring导入哪些坐标?(pom.xml)

第1步:导入Spring坐标,记得刷新Maven如下:

复制代码
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.10.RELEASE</version>
</dependency>

第2步:定义Spring管理的类(接口)

BookService如下:

复制代码
public interface BookService {
    public void save();
}

BookServiceImpl如下:

复制代码
public class BookServiceImpl implements BookService{
    private BookDao bookDao = new BookDaoImpl();
    public void save(){
        bookDao.save();
    }
}

第3步:创建Spring配置文件,配置对应类作为Spring管理的bean

点击resources然后New-XML Configuration File-Spring Config

新建的.xml文件名为:applicationContext.xml

写入:

复制代码
<!--2.配置bean-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>

<bean>标签里的class属性表示给bean定义类型,id属性表示给bean起名字。

第4步:初始化IoC容器(Spring核心容器/Spring容器),通过容器获取bean

右键java-New-Java Class,创建一个名为App的文件

复制代码
public class App {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取bean
        BookDao bookDao = (BookDao)ctx.getBean("bookDao");
        bookDao.save();
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}

1.2 完善

第1步:删除使用new的形式创建对象的代码+第2步:提供依赖对象对应的setter方法

复制代码
public class BookServiceImpl implements BookService{
    //5.删除业务层中使用new的方式创建的dao对象
    private BookDao bookDao;
    public void save(){
        bookDao.save();
    }
    //6.提供对应的set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

第3步:配置service与dao之间的关系

相关推荐
fajianchen21 分钟前
Spring中观察者模式的应用
java·开发语言
库库林_沙琪马26 分钟前
深入理解 @JsonGetter:精准掌控前端返回数据格式!
java·前端
zkinglin27 分钟前
AORSA编译指南
笔记·其他·能源
手握风云-37 分钟前
JavaEE初阶第一期:计算机是如何 “思考” 的(上)
java·java-ee
普通的冒险者1 小时前
微博项目(总体搭建)
java·开发语言
BAGAE1 小时前
Flutter 与原生技术(Objective-C/Swift,java)的关系
java·开发语言·macos·objective-c·cocoa·智慧城市·hbase
江湖有缘1 小时前
使用obsutil工具在OBS上完成基本的数据存取【玩转华为云】
android·java·华为云
bxlj_jcj1 小时前
Kafka环境搭建全攻略:从Docker到Java实战
java·docker·kafka
国科安芯1 小时前
【AS32系列MCU调试教程】性能优化:Eclipse环境下AS32芯片调试效率提升
java·性能优化·eclipse
Chase_______2 小时前
静态变量详解(static variable)
java·开发语言·jvm