Spring框架介绍、IOC容器、依赖注入

本文详细介绍了Spring框架的核心体系,包括轻量级、非入侵性、注解支持等特点。重点讲解了IOC容器,如BeanFactory和ApplicationContext,以及它们在组件管理中的作用。此外,还阐述了Spring环境的搭建步骤,包括Maven项目的创建、依赖导入和简单使用。依赖注入(DI)的概念和实现方式,如setter注入、构造器注入和自动装配也进行了深入探讨。最后,提到了Spring容器注解的使用,如@Component、@Repository、@Service、@Controller等,并展示了如何通过注解简化配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Spring是一个开源框架(框架针:对项目的整体或者某一个部分提供了一个完整的实现方案)

官网:http://spring.io

1、Spring的七大核心体系

 2、框架的优点

(1)属于轻量级框架;从大小与开销两方面而言Spring都是轻量的

(2)非入侵;依赖性小

(3)大量使用注解,支持:约定优于配置

(4)  除了框架自己的产品以外,还支持兼容其他框架

(5)它没有任何的强制要求,不需要遵从任何的编程规范

(6)它是免费开源的,可以扩展

二、IOC容器

1、BeanFactory:通过反射+工厂模式完成对业务组件的管理;实质:Spring容器(装组件的地方)

BeanFactory是Spring的接口,有自己的实现类。在用户调用getBean("参数名")才会产生对象

 2、ApplicationContext是BeanFactory的子接口

优点:

(1)继承了BeanFactory的所有方法

(2)拓展了Events、Resources、i18n、Validation、Data Binding、Type Conversion、SpEL

(3)实例化组件的实机,项目一启动就会实例化所有的组件

(4)支持Web项目的集成

提供:IOC Container、Events、Resources、i18n、Validation、Data Binding、Type Conversion、SpEL

三、Spring环境搭建

1、创建Maven项目

2、导入Spring框架的依赖

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

3、简单使用

3.1 创建配置文件(xxx.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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 向Spring的容器中,注册某一个组件 id 和class 是必填内容  -->
    <bean id="userBean" class="com.woniuxy.springstudy.entity.UserBean"></bean>
</beans>

 3.2 从容器中获取实例(xxxTest.java)

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextTest {

    /**
     * Spring容器
     * BeanFactory factory
     */
    private ApplicationContext ac;

    @Before
    public void before(){
        //创建容器
        ac = new ClassPathXmlApplicationContext("classpath:beans.xml");
    }

    @Test
    public void testUserBean(){
        UserBean userBean = (UserBean) ac.getBean("userBean");
        System.out.println(userBean);
    }
}

4、bean

4.1 bean:是Spring容器管理组件的最小单位,可大(项目)可小(类)

4.2 管理方式(xxx.xml)

    <!-- 向Spring的容器中,注册某一个组件 id 和class 是必填内容  -->
    <bean id="userBean" class="com.woniuxy.springstudy.entity.UserBean"></bean>

4.3 作用范围

singleton:单实例,默认每一个容器组件都有一个唯一的实例

prototype:原型模式【克隆】,以最初的实例为原型,创建新的对象,应用程序自己负责实例的销毁

request:请求:跟HttpServletRequest对象有关,在一个请求范围的内容,Spring对组件有一个唯一的实例

session:会话:跟HttpSession对象有关,在一个会话范围内的内容,Spring容器对组件只有一个实例

application:应用上下文,跟ServletContext有关,在ServletContext范围内,Spring容器对组件只有一个实例

Websocket:socket通信。可以在服务器端直接给前端发送消息,在每次通信范围内,Spring容器对组件只有一个实例

四、依赖注入(DI:dependency Injection)

目录

一、Spring是一个开源框架(框架针:对项目的整体或者某一个部分提供了一个完整的实现方案)

二、IOC容器

三、Spring环境搭建

四、依赖注入(DI:dependency Injection)

五、Spring容器注解


依赖注入:以前是组件之间直接相互依赖,现在组件依赖容器,由容器创建组件的实例,以及维护实例之间的关系。容器创建好实例以及关系之后,再由容器将实例注入到程序的过程

所以:IOC和DI都是对Spring容器的一种描述,只不过:说法的方向不一样的

IOC:是从创建对象的控制权出发

DI:从对象的依赖关系的出现

 4.1 setter注入

step1:

public class UserServiceImpl implements IUserService {

    private IUserDao userDao;

    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }
}

step2:关系配置

  <!-- 向Spring的容器中,注册某一个组件 id 和class 是必填内容  -->
    <bean id="userServiceImpl" class="com.woniuxy.springstudy.usermag.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDaoImpl"></property>
    </bean>

    <bean id="userDaoImpl" class="com.woniuxy.springstudy.usermag.dao.impl.UserDaoImpl"></bean>

4.2 构造器注入

step1:

public class UserServiceImpl implements IUserService {

    private IUserDao userDao;

    public UserServiceImpl(IUserDao userDao) {
        this.userDao = userDao;
    }
}

step2:

    <!-- 向Spring的容器中,注册某一个组件 id 和class 是必填内容  -->
    <bean id="userServiceImpl" class="com.woniuxy.springstudy.usermag.service.impl.UserServiceImpl">
        <constructor-arg name="userDao" ref="userDaoImpl"></constructor-arg>
    </bean>

    <bean id="userDaoImpl" class="com.woniuxy.springstudy.usermag.dao.impl.UserDaoImpl"></bean>

4.3 自动装配

装配规则:

byType:按照属性的类型来进行装配,必须提供setter()

byName:按照属性的名称来进行装配,必须提供setter()

constructor:按照构造器来进行装配,必须提供构造方法

default: 不使用自动装配

byName:Spring在装配组件时,会自动检查组件身上的所有的属性,并获得属性的名称,回到Spring容器问有没有跟这个名称一模一样的组件存在 ?如果没有,装配时不会抛出任意异常,但是在运行时,会抛出NullPointerException 属于精准装配

byType:Spring在装配组件时,会自动检查组件身上的所有的属性,并获得属性的类型,回到Spring容器问有没有跟这个类型有关的组件实例存在?如果没有,装配时不会抛出任意异常,但是在运行时,会抛出NullPointerException;如果有,但是超过1个以上,那么在装配时将会抛出UnsatisfiedDependencyException;如果有,并且只有1个,则装配成功

constructor:Spring在装配组件时,会自动检查组件身上所有的构造器,并获得构造器的参数类型,使用byType的方法完成对参数进行装配值

代码:

<beans default-autowire="constructor"></beans>

五、Spring容器注解

常见的注解:@Controller @Service @Repository @Component

@Component:表示一个需要被Spring容器管理起来的普通Java类

@Repository:表示一个需要被Spring容器管理起来的持久层类

@Service:表示一个需要被Spring容器管理起来的业务层类

@Controller:表示一个需要被Spring容器管理起来的控制层类

5.1 组件注解的用法

step1:

/**
 * 默认情况下:会使用UserServiceImpl类名的首字母小写,
 * 作为该组件在Spring容器中的名字
 * @Service(value="us") 自定义名字
 */
@Service
public class UserServiceImpl implements IUserService {

    private IUserDao userDao;
}
@Repository
public class UserDaoImpl implements IUserDao {

}

 step2:在xxx.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启Spring容器的自动扫描功能-->
    <context:component-scan base-package="com.woniuxy.springstudy"></context:component-scan>

</beans>

5.2 关系注解的用法

5.2.1 @Autowired 先使用byType的方式进行装配,当发现数量>1时,会进行byName进行精准装配,Spring提供模糊装配模式

@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    private IUserDao userDao;
}

5.2.2 @Resource 先使用byName的方式进行装配,找不到时会进行byType进行装配JDK提供的精准装配模式

@Service
public class UserServiceImpl implements IUserService {

    //非常精准的指定:需要装配的组件
    //一旦写了name,那么就不会再ByType
    @Resource(name="userDaoImpl")
    private IUserDao userDao;
}

5.2.3 查看容器中组件的名称

@Before
public void before(){
    //创建容器
    ac = new ClassPathXmlApplicationContext("classpath:beans.xml");
    //查看所有组件的名称
    String[] beans = ac.getBeanDefinitionNames();
    System.out.println(Arrays.toString(beans));
}

5.3 拓展注解

5.3.1 @PostConstruct  该注解的作用:实例化组件时,做初始化任务

@Service
public class UserServiceImpl implements IUserService {

    @PostConstruct
    public void init(){
        System.out.println("初始化的任务");
    }
}

5.3.2 @PreDestroy 销毁组件实例时,做收尾工作

@Service
public class UserServiceImpl implements IUserService {
    @PreDestroy
    public void destory(){
        System.out.println("收尾的任务");
    }
}

5.3.3 自定义配置类(替代xxx.xml文件)

step1:

@Configuration
@ComponentScan(basePackages = {"com.woniuxy.springstudy"})
public class ApplicationContextConfigure {

}

step2:

@Before
public void before(){
    ac = new AnnotationConfigApplicationContext(ApplicationContextConfigure.class);
    //查看所有组件的名称
    String[] beans = ac.getBeanDefinitionNames();
    System.out.println(Arrays.toString(beans));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值