Spring笔记01

Spring能干什么

image-20221013130506458

其中Microservices(微服务)、Cloud(分布式)、Web apps(Web应用)开发占主流

image-20221013130956618

Spring Framework:全家桶中最底层的框架,要学的内容

Spring Boot:加速Spring开发的技术,快速得到推广

Spring Cloud:分布式开发

Spring Framework系统架构

image-20221013131723313

学习路线

  1. Core Container:是装对象的核心容器,而JAVA程序是面向对象的。所以最先学
  2. Data Access/Integration:开始学习整合Spring与MyBatis
  3. 学习APO 与 Aspects技术
  4. 学习Transactions(事务)

image-20221013132433992

Part 01:核心容器

目标:充分解耦
Ioc(Inversion of Control)控制反转
  • 将对象的创建控制权由程序转移到外部。在使用对象时,程序不主动使用new产生对象,而由外部提供对象。从而降低耦合度

  • Spring对IoC思想进行了实现

    • Spring提供了一个容器,称为IoC容器来充当外部

      由程序创建对象转换为IoC容器创建对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oKjPqEe1-1666346096218)(https://cdn.jsdelivr.net/gh/StarryVerse/CSDN-/img/image-20221013184729718.png)]

转变为

image-20221013190845726

  • DAO(data access object)是为某种类型的数据库或其他持久性机制提供一个抽象接口的[对象]。通过映射应用程序对持久层的调用,DAO提供一些特定的数据操作,而无需暴露数据库细节。
Bean

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

DI(Dependency Injection)依赖注入

在IoC容器中建立bean与bean之间的依赖关系的整个过程。将容器内有关系的bean进行关系绑定。

IoC入门案例

思路分析

image-20221013193608411

步骤
导入Spring坐标

在pom.xml中添加依赖

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>

添加完成后刷新Maven

定义Spring管理的类(接口)
public interface BookService {
	public void save();
}
public class BookServiceImpl implements BookService {
	private BookDao bookDao = new BookDaoImpl();
	
	public void save() {
		bookDao.save();
	}
}
创建Spring配置文件,配置对应类作为Spring管理的bean

在resource中添加Spring Config 命名为applicationContext.xml

配置applicationContext.xml

配置bean

//id属性表示给bean起名字
//class属性表示给bean定义类型 用实现类去定义 不要用接口去定义
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
初始化IoC容器,通过容器获取bean

在itheima包下新建一个类App2.java

//ApplicationContext为一个接口,用它的实现类ClassPathXmlApplicationContext去生成新的对象
//ApplicationContext ctx = new ClassPathXmlApplicationContext("resources里的Spring Config配置文件名称");

//获取资源
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
bookService.save();

DI入门案例

思路分析

在这里插入图片描述

步骤
  • 删除使用new的形式创建对象的代码
  • 提供依赖对象对应的setter方法
public class BookServiceImpl implements BookService {
	private BookDao bookDao = new BookDaoImpl();
	
	public void save() {
		bookDao.save();
	}
}
public class BookServiceImpl implements BookService {
	private BookDao bookDao;
	
	public void save() {
		bookDao.save();
	}
	
	public void setBookDao(BookDao bookDao) {
		this.bookDao = bookDao;
	}
}
  • 在applicationContext.xml配置service与dao之间的关系

property标签表示配置当前bean的属性

name属性表示配置哪一个具体的属性

ref属性表示参照哪一个bean

<property name="bookDao" ref="bookDao"/>

IoC和Bean

bean配置

bean基础配置

在这里插入图片描述

bean别名配置

在这里插入图片描述

bean作用范围配置

在这里插入图片描述
在这里插入图片描述

bean实例化

三种方式
构造方法(常用)
  • bean本质上就是对象,创建bean使用构造方法完成
    • spring创建bean时调用的是无参的构造方法
    • 若无参构造方法不存在,将抛出异常BeanCreationException
    • spring报错如何看:从下往上找原因,越下面越核心,一般最下面的就能解决问题

在这里插入图片描述

静态工厂(了解)
实例工厂中的FactoryBean
  • 导入Spring坐标

  • 定义Spring管理的类

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

<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
  • 在工厂类中使用FactoryBean

FactoryBean也是一个Bean对象。

public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    @Override
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    @Override
    public Class<?> getObjectType() {
        return UserDao.class;
    }
}
  • 在main方法中获取IoC容器和Bean对象
public class AppForInstanceUser {
    public static void main(String[] args) {
        //获取IoC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		//获取Bean
        UserDao userDao = (UserDao) ctx.getBean("userDao");

        userDao.save();
    }
}

bean生命周期

  • 生命周期:从创建到消亡的完整过程
  • bean生命周期:bean从创建到销毁的整体过程
  • bean生命周期控制:在bean创建后销毁前做一些事情
1.在配置文件中配置 bean 的生命周期
//创建
init-method="init"
//销毁
destroy-method="destory"

要想执行destroy-method="destory"就要关闭容器

关闭容器方法
  • 暴力close法

ctx.close();

//ApplicationContext类中没有close方法,而在ClassPathXmlApplicationContext类中有close关闭容器的方法,所以用ClassPathXmlApplicationContext类获取IoC
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
        ctx.close();	//加在末尾
  • 关闭钩子法

ctx.registerShutdownHook(); //加在获取IoC容器后的任何地方都可以

2.用接口配置生命周期(了解)
//调用InitializingBean, DisposableBean接口并覆写方法

在这里插入图片描述
在这里插入图片描述

销毁destroy()对应DisposableBean

创建afterPropertiesSet()对应InitializingBean

afterPropertiesSet()在属性设置之后执行

生命周期的过程

在这里插入图片描述

DI

在这里插入图片描述

setter注入
–引用类型
  • 在bean中定义引用类型属性并提供可访问的setter方法
public calss BookServiceImpl implements BookService{
	private BookDao bookDao;
	public void setBookDao(BookDao bookDao){
		this.bookDao = bookDao;
	}
}
  • 配置中使用property标签ref属性注入引用类型对象
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
	<property name="bookDao" ref="bookDao"/>
</bean>
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
–简单类型
  • 在bean中定义引用类型属性并提供可访问的setter方法
public class BookDaoImpl implements BookDao{
	private int connectionNumber;
	public void setConnectionNumber(int connectionNumber) {
		this.connectionNumber = connectionNumber;
	}
}
  • 配置中使用property标签value属性注入简单类型数据
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
	<property name="connectionNumber" value="10"/>
</bean>
构造器注入

标准书写的配置和代码的耦合度较高

–引用注入
  • 在bean中定义引用类型属性并提供可访问的构造方法
public calss BookServiceImpl implements BookService{
	private BookDao bookDao;
	public BookServiceImpl(BookDao bookDao){
		this.bookDao = bookDao;
	}
}
  • 配置中使用constructor-arg标签ref属性注入引用类型对象
-- constructor-arg中的name和传入构造器的形参一致 ref属性与id一致
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
	<constructor-arg name="bookDao" ref="bookDao"/>
</bean>
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

其他书写方法

type指定形参对象的类型

index指定形参对象的位置

依赖自动装配
  • IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

  • 自动装配方式
    在这里插入图片描述

  • 配置中使用bean标签autowire属性设置自动装配的类型

byType byName constructor no

<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>
	
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
  • 依赖自动装配特征
    在这里插入图片描述
集合注入

在这里插入图片描述

  • 注入数组对象
		<property name="arr">
            <array>
                <value>20</value>
                <value>30</value>
                <value>40</value>
                <value>50</value>
            </array>
        </property>	
  • 注入List
		<property name="stringList">
            <list>
                <value>China</value>
                <value> </value>
                <value>666</value>
                <value>50</value>
            </list>
        </property>
  • 注入Set
		<property name="stringSet">
            <set>
                <value>5</value>
                <value>38</value>
                <value>42</value>
                <value>57</value>
            </set>
        </property>
  • 注入Map
		<property name="integerStringMap">
            <map>
                <entry key="01" value="mar"/>
                <entry key="02" value="co"/>
                <entry key="03" value=" "/>
                <entry key="04" value="fu"/>

            </map>
        </property>
  • 注入Properties
		<property name="properties">
            <props>
                <prop key="country">china</prop>
                <prop key="province">ZheJiang</prop>
                <prop key="city">HangZhou</prop>
            </props>
        </property>

注解开发

使用注解,极大的简化了spring的开发。

定义bean

@Component

  • @Repository
  • @Service
  • @Controller

@ComponentScan

 <entry key="04" value="fu"/>

        </map>
    </property>

- 注入Properties

	<property name="properties">
        <props>
            <prop key="country">china</prop>
            <prop key="province">ZheJiang</prop>
            <prop key="city">HangZhou</prop>
        </props>
    </property>



### 注解开发

使用注解,极大的简化了spring的开发。

#### 定义bean

@Component

- @Repository
- @Service
- @Controller

@ComponentScan

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fantasy`

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

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

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

打赏作者

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

抵扣说明:

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

余额充值