Spring学习笔记(1)

3 篇文章 0 订阅
本文深入探讨了Spring框架的核心概念——IoC(控制反转)和DI(依赖注入)。通过实例展示了如何在Spring中配置和管理Bean,包括通过XML配置文件创建Bean、实现Bean的依赖关系以及生命周期管理。同时,解释了Bean的作用范围、实例化方式以及如何通过初始化和销毁方法控制Bean的生命周期。
摘要由CSDN通过智能技术生成

Spring系统架构

Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基。

Spring Framework系统架构

学习线路

核心概念

IoC( Inversion of Control )控制反转

使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。

Spring技术对Ioc思想进行了实现。

Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的外部。

IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean

DI ( Dependency Injection )依赖注入

在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入

目标:充分解耦

使用IoC容器管理bean (IoC)
在IoC容器内将有依赖关系的bean进行关系绑定(DI)

最终效果

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

IoC

导入Spring坐标

在pom.xml中

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>SpringTest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>//这里
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>
    </dependencies>

</project>

定义Spring管理的类(接口)

package org.example.service.impl;

import org.example.dao.BookDao;
import org.example.dao.impl.BookDaoImpl;
import org.example.service.BookService;

public class BookServiceImpl implements BookService {

    private BookDao bookDao = new BookDaoImpl();

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

package org.example.service;

public interface BookService {
    public void save();
}

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

在resources下新建applicationContext.xml文件。

New->XML Configuration File->Spring Config

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bookDao" class="org.example.dao.impl.BookDaoImpl"/>

    <bean id="bookService" class="org.example.service.impl.BookServiceImpl"/>

</beans>

bean定义时id属性在同一个上下文中不能重复

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

package org.example;

import org.example.dao.BookDao;
import org.example.service.BookService;
import org.example.service.impl.BookServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
		//加载配置文件得到上下文对象,也就是容器对象
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
	    //获取资源
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}

DI

删除使用new的形式创建对象的代码

public class BookServiceImpl implements BookService {

    //private BookDao bookDao = new BookDaoImpl();
    private BookDao bookDao;


    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }

}

提供依赖对象对应的setter方法

public class BookServiceImpl implements BookService {

    //private BookDao bookDao = new BookDaoImpl();
    private BookDao bookDao;


    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

set方法是容器在执行。

配置service与dao之间的关系

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bookDao" class="org.example.dao.impl.BookDaoImpl"/>

    <!--<bean id="bookService" class="org.example.service.impl.BookServiceImpl"/>-->
    <bean id="bookService" class="org.example.service.impl.BookServiceImpl">
        <!--property标签表示配置当前bean的属性
        name属性表示配置哪一个具体的属性
        ref属性表示参照哪一个bean-->
        <property name="bookDao" ref="bookDao"/>
    </bean>

</beans>

bean

bean基础配置

<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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bookDao" class="org.example.dao.impl.BookDaoImpl"/>

    <bean id="bookService" class="org.example.service.impl.BookServiceImpl"/>

</beans>

bean别名配置

    <bean id="bookDao" name="dao1 bookDaoImpl1" class="org.example.dao.impl.BookDaoImpl" />
    <bean name="service, bookServiceImpl" class="org.example.service.impl.BookServiceImpl" />

获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionExceptionNoSuchBeanDefinitionException: No bean named ‘bookServiceImpl’ available

bean作用范围

<bean id="bookDao" class="org.example.dao.impl.BookDaoImpl" scope="prototype"/>

通过scope定义bean的作用范围,可选范围如下
singleton:单例(默认)
prototype :非单例

bean的实例化

bean的实例化有3种方式。

构造方法(常用)

提供可访问的构造方法

public class BookDaoImpl implements BookDao {

    public BookDaoImpl() {
        System.out.println("book constructor is running ...");
    }

    public void save() {
        System.out.println("book dao save ...");
    }
}

配置

<bean id="bookDao" class="org.example.dao.impl.BookDaoImpl" />

无参构造方法如果不存在,将抛出异常BeanCreationException

静态工厂(了解)

静态工厂

public class OrderDaoFactory {
    public static OrderDao getOrderDao() {
        return new OrderDaoImpl();
    }
}

配置

<bean
      id="orderDao"
      factory-method="getOrderDao"
      class="com.itheima.factory.OrderDaoFactory"
      />

实例工厂(了解)

实例工厂

public class UserDaoFactory {
    public UserDao getUserDao() {
        return new UserDaoImpl();
    }
}

配置

<bean id="userDaoFactory" class="com.itheima.factory.UserDaoFactory" />

<bean
      id="userDao"
      factory-method="getUserDao"
      factory-bean="userDaoFactory"
      />

FactoryBean(实用)

FactoryBean

public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    public UserDao get0bject() throws Exception {
        return new UserDaoImpl();
    }
    public class<?> getobjectType() {
        return UserDao.class;
    }
}

配置

<bean
            id="userDao"
            class="com.itheima.factory.UserDaoFactoryBean"/>

bean生命周期控制

提供生命周期控制方法

public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println( "book dao save ..." );
    }
    public void init(){
        System.out.println("book init ...");
    }
    public void destory(){
        System.out.println( "book destory ...");
    }
}

配置生命周期控制方法

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method=destory" />

实现InitializingBean,DisposableBean接口(了解)

public class BookServiceImpl implements BookService , InitializingBean, DisposableBean {
    public void save() {
        System.out.println("book service save ...");
    }
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");
    }
    public void destroy() throws Exception {
        System.out.println("destroy");
    }
}

生命周期

初始化容器

1.创建对象(内存分配)

2.执行构造方法

3.执行属性注入( set操作)

4.执行bean初始化方法

使用bean

1.执行业务操作

关闭/销毁容器

1.执行bean销毁方法

容器关闭前触发bean的销毁

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值