【博学谷学习记录】超强总结,用心分享 |Spring Framework

前言

Spring技术是JavaEE开发必备技能,企业开发技术选型>90%。Spring可以简化开发,降低企业级开发的复杂性。框架整合,高效整合其他技术,提高企业级应用开发与运行效率


Sping Framework架构图

在这里插入图片描述

IOC控制反转

  • 使用对象是,由主动new产生对象转换为由IoC容器提供对象,此过程中对象创建控制权有程序转移到外部,此思想为控制反转。
  • Spring提供一个容器,称为IOC容器,用了充当IOC思想中的外部
  • IOC容器负责对象的创建、初始化等一系列操作,被创建或被管理的对象在IOC容器中统称为Bean
  • 在容器中建立bean和bean之间的关系的整个过程,称为依赖注入

IOC案列(XML版)

//1.导入坐标
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>
//2.定义Spring管理的类(接口)
//接口
public interface BookService {
    public void save();
}
//实现类
public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();
    @Override
    public void save() {
        System.out.println("BookService save");
        bookDao.save();
    }
}
//3.创建Spring配置文件,配置对应类作为Spring管理的bean,配置文件名为applicationContext.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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="bookService" class="org.service.impl.BookServiceImpl"/>
</beans>
//4.初始化IOC容器(Spring核心容器/Spring容器),通过容器获取bean
public class App {
    public static void main(String[] args) {
    	//加载配置文件得到上下文对象,也就是容器对象
        ApplicationContext context  =new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取资源
        BookService bookService = (BookService) context.getBean("bookService");
        bookService.save();
    }
}  

Bean

Bean的基础配置

属性列表作用
idbean的id,使用容器可以通过id值获取对应的bea,在一个容器中id值唯一
classbean的类型,即配置的bean的全路径类名
namebean的别名,可定义多个,使用逗号(,)分号(;)空格( )分割
scopebean的范围,singleton单例(默认),prototype非单例
scopebean的范围,singleton单例(默认),prototype非单例

Bean的实例化

bean本质就是对象,创建bean可以有多种方式完成

  • 使用构造方法实例化(常用)
    提供可访问的构造方法
public class BookDaoImpl implements BookDao {
	//空参可以不写
    public BookDaoImpl(){
        System.out.println("BookDao constructor");
    }
    @Override
    public void save() {
        System.out.println("BookDao save");
    }
}

提供可访问的构造方法

<bean id="bookDao" class="org.dao.impl.BookDaoImpl"/>
  • 使用静态工厂实例化
    静态工厂
public class OrderDaoFactory {
    public static OrderDao getOrderDao(){
        return new OrderDaoImpl();
    }
}

配置

<bean id="orderDao" class="org.factory.OrderDaoFactory" factory-method="getOrderDao"/>
  • 使用实例工厂实例化(原始)
    实例工厂
public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

配置

<bean id="userFactory" class="org.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
  • 使用实例工厂实例化(实用)
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
 	//创建实例
    @Override
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }
	//设置类型
    @Override
    public Class<?> getObjectType() {
        return UserDao.class;
    }
	//设置是否为单列
    @Override
    public boolean isSingleton() {
        return false;
    }
}

配置

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

Bean的生命周期

实现InitializingBean, DisposableBean接口

  • 初始化容器
  • 创建对象
  • 执行构造方法
  • 执行属性注入
  • 执行bean初始化方法
  • 使用bean
    • 执行业务操作
  • 关闭/销毁容器
  • 执行bean销毁方法

依赖注入(DI)

  • 依赖注入方式
  • Setter注入
    • 简单类型
      1.在bean中定义引用类型属性并提供可访问的set方法
public class BookServiceImpl implements BookService {
    private String name;
    private int age;
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

2.配置中使用property标签value属性注入属性值(无序)

<bean id="bookService" class="org.service.impl.BookServiceImpl">
    <property name="name" value="lisi"/>
    <property name="age " value="23"/>
</bean>
  • 引用类型
    1.在bean中定义引用类型属性并提供可访问的set方法
public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

2.配置中使用property标签ref属性注入引用类型对象

<bean id="bookDao" class="org.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="org.service.impl.BookServiceImpl">
    <property name="bookDao" ref="bookDao"/>
</bean>
  • 构造器注入
  • 简单类型
    1.在bean中定义引用类型属性并提供构造方法
public class BookServiceImpl implements BookService {
    private String name;
    private int age;
    public BookDaoImpl(String name, int age) {
    	this.name = name;
      	this.age = age;
  	}
}

2.配置中使用constructor-arg标签value属性注入属性值(无序)

<bean id="bookService" class="org.service.impl.BookServiceImpl">
    <constructor-arg name="name" value="lisi"/>
    <constructor-arg name="age " value="23"/>
</bean>
  • 引用类型
    1.在bean中定义引用类型属性并构造方法
public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

2.配置中使用constructor-arg标签ref属性注入引用类型对象

<bean id="bookDao" class="org.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="org.service.impl.BookServiceImpl">
    <property name="bookDao" ref="bookDao"/>
</bean>

依赖注方式选择
1.强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
2.可选依赖使用setter注入,灵活性强
3.Spring框架倡导使用构造器注入,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
4.若有必要可以两者同事使用,使用构造器注入完成强制依赖注入,使用setter注入完成可选依赖注入
5.实际开发过程中要根据实际情况分析,若受控对象没有提供setter方法就必须使用构造器注入
6.自己开发的模块推荐使用setter注入

DI案列(XML版)

//1.删除使用new创建对象的代码
//2.提供依赖对象对应的setter方法
public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    @Override
    public void save() {
        System.out.println("BookService save");
        bookDao.save();
    }
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}
//3.配置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.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="org.service.impl.BookServiceImpl">
    	//第一个bookDao属性的名称
    	//第二个bookDao当前容器的对应bean的名称
        <property name="bookDao" ref="bookDao"/>
    </bean>
</beans>

自动装配

  • IOC容器根据bean所依赖的资源在容器中自动查找并注入bean中的过程称为自动装配
  • 特征
    • 自动装配用于引用类型依赖注入,不能对简单类型进行操作
    • 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
    • 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
    • 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配失效
  • 自动装配(按类型)
<bean id="bookDao" class="org.dao.impl.BookDaoImpl" autowire="byType"/>
  • 自动装配(按名称)
<bean id="bookDao" class="org.dao.impl.BookDaoImpl" autowire="byName"/>
  • 按构造方法
  • 不启用自动装配

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值