Spring-Spring、IoC、DI、注解开发
2024-07-12 14:15 阅读(254)

1、Spring是什么

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

Spring整体架构

Spring优点:


Spring属于低侵入设计。

IOC将对象之间的依赖关系交给Spring,降低组件之间的耦合,实现各个层之间的解耦,让我们更专注于业务逻辑。

提供面向切面编程。

对各种主流插件提供很好的集成支持。

对事务支持的很好,只要配置即可,无须手动控制

缺点:


依赖反射,影响性能

以前所有东西都是由程序去进行控制创建,耦合性太高(模块与模块之间的依赖性太强,需求改一个模块,实际需要改好几个模块),而现在是由我们自行控制创建对象 , 把主动权交给了调用者。程序不用去管怎么创建,怎么实现了。它只负责提供一个接口

问题:耦合度高

解决办法:使用对象时,在程序中不要主动使用new产生对象,转换由外部提供对象


2、IOC

控制反转IoC(Inversion of Control),是一种设计思想(对象的产生控制权由程序转移到外部)


控制:谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring(core containner)来创建的

反转:程序本身不创建对象 , 而变成被动的接收对象


Spring对IoC思想进行了实现


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

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

如果两个bean之间有关系,进行DI(依赖注入)

2.1、使用IoC

在resources路径下创建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="stu" class="com.zyh.pojo.Student"></bean>
</beans>

IOC容器通过读取配置文件,加载配置bean标签来创建对象(在核心容器中创建好bean对象后,就放在核心容器中,需要使用的时候再拿出去用)

读取配置文件

//读取配置文件
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student stu = applicationContext.getBean("stu", Student.class);
        System.out.println(stu);

2.2、IoC容器创建bean(实例化bean)的三种方法

无参构造函数:构造方法(常用),无参构造方法如果不存在,将抛出异常BeanCreationException

<bean id="bookDao" class="com.src.dao.impl.BookDaoImpl"/>

静态工厂

<bean id="bookDao" class="com.src.factory.OrderDaoFactory" factory-metod="getOrderDao"/>

实例工厂:先造出工程实例对象

<bean id="userFactory" class="com.src.factory.userDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory">

2.3、Bean生命周期

初始化容器


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

2.执行构造方法

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

4.执行bean初始化方法


使用bean


1.执行业务操作


关闭/销毁容器


1.执行bean销毁方法


3、DI

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


setter注入

在bean中定义引用类型属性并提供可访问的set方法

public class BookSeviceImpl implements BookService{
	private BookDao bookDao;
	public void setBookDao(BookDao bookDao){
		this.bookDao = bookDao;
	}
}

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

配置中使用property标签value属性注入简单类型对象

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

构造器注入

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

public class BookSeviceImpl implements BookService{
	private BookDao bookDao;
	public BookServiceImpl(BookDao bookDao){//构造方法
		this.bookDao = bookDao;
	}
}
<bean id = "bookService" class="com.org.example.service.impl.serviceImpl">
	<constructor-arg name = "bookDao" ref = "bookDao"/>
</bean>
<bean id = "bookDao" class="com.org.example.dao.impl.BookDaoImpl">

3.1 自动装配

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

1、自动装配用于引用类型注入,不能对简单类型进行操作

2、使用按类型装配(byType)必须保障容器中相同类型的bean唯一,推荐使用

3、使用按名称装配(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐

4、自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

4、注解开发

在类上加上@Component就相当于对这个类定义为bean了

需要在配置文件中加上<context : compontent-scan base-package="com.org.example">

Spring提供@Component注解的三个衍生注解


@Controller:用于表现层bean定义

@Service:用于业务层bean定义

@Repository:用于数据层bean定义