spring IOC

一、Spring框架的理解

  • Spring 框架是一款轻量级的开发框架,核心思想是 IOC(控制反转)和AOP(面向切面编程),为Java应用程序开发开发提供组件管理服务,用于组件之间的解耦,以及简化第三方JavaEE中间技术的使用(JMS,任务调度,缓存,ORM框架),是一个基础架构型的开发框架。

Spring框架包括:IOC容器、Validation、数据校验、AOP面向切面编程、Transactions事物管理、Spring IDBC、Spring MVC框架、以及各类第三方JavaEE中间件技术集成。

创建一个spring项目

二、IOC的核心概念

IOC(Inversion of Control, 中文释义:控制反转) 是Spring 框架的核心思想之一,主要用于解耦,IOC 是指将创建对象的控制权转移给 Spring 框架进行管理。由Spring 框架根据配置文件或注解等方式,创建 bean 对象并管理各个 bean 对象之间的依赖关系。使对象之间形成松散耦合的关系,实现解耦;

控制:指的是对象创建(s实例化、管理)的权利

反转:控制权交给外部环境(Spring框架、TOC容器)

  • 使用对象时由主动new对象转换为由外部提供对象,此过程的创建全由程序转移到外部,这种思想叫做控制反转。

三、Spring技术对此提供的实现

  • Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的外部
  • IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为Bean

四、Spring IOC容器的理解

  • IOC通常被理解为IOC Container容器,IOC容器其实就是一个Map,key是每个bean对象的ID,value是bean对象本身。IOC容器负责创建bean对象并管理bean的生命周期。 并且根据配置好配置文件或注解,管理IOC容器中的每个bean,以及根据bean之间的依赖关系,完成bean之间的注入。
  • IOC容器属于Spring Core模块,用来创建和管理Bean,默使用单例的方式将bean存储在DefaultListableBeanFactory类的beanDefinitionMap中(一个ConcurrentHashMap类型的Map集合);
  • IOc容器使用ConcurrentHashMap集合存储了BeanDefinition对象,该对象封装了Sprin g 对一个Bean所有配置信息,包括:类名,属性,构造方法参数,依赖,是否延迟加载,是否是单例等配置信息;

具体实现:

1).xml实现

1、首先导入坐标
XML 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.27</version>
</dependency>
2、在resources目录下创建一个xml文件

在弹出的窗口创建以.xml结尾的文件名即可创建成功

3、 在xml文件中写入bean对象,id唯一表示bean对象,不可重复,class即Javabean对象

2、注解实现

1.标识到类上,即可将该类作为bean对象注入容器

java 复制代码
@Component 
public class springBean { 
    
}

2.在配置类中注入

首先创建一个类,使用@configuration标识该类为配置类

使用@Bean注解标注在方法上,就可以将方法的返回值类型注入IOC容器

java 复制代码
@Configuration
@ComponentScan("com.apesourse.spring.demo")
public class SpringBeanConfiguration {

    @Bean
    public User springBean() {
        return new User ();
    }
}

五、Spring DI 的理解

DI ( Dependency Inject,中文释义:依赖注入)是对 IOC 概念不同角度的描述,是指应用程序在运行时,每一个 bean 对象都依赖 IOC 容器注入到当前 bean 对象所需要的另一个 bean 对象。(例如:在 Mybatis 整合 Spring 时,SqlSessionFactoryBean 依赖 IOC 容器注入一个 DataSource 数据源 Bean )

1、xml实现

在service(即业务层)需要调用dao(即数据访问层)的方法时,我们就可以用依赖注入的方法获取dao层实例对象.

java 复制代码
public class UserServiceImp implements IUserService{
    IUserDao dao;

    public void setDao(IUserDao dao) {
        this.dao = dao;
    }

}
XML 复制代码
 <bean id="daoiml" class="apesourse.dao.UserDaoiml">
 </bean>

 <bean id="serviceImp" class="apesourse.service.UserServiceImp">
    <property name="dao" ref="daoiml"/>
 </bean>

2.注解实现

@Autowired:自动注入依赖,Spring会在上下文中寻找匹配的Bean,并注入到被标记的字段、构造器或方法中。

@Qualifier :与 @Autowired一起使用,指定注入Bean的名称,用于当存在多个类型兼容的Bean时,指定要使用的Bean。

@Resource :类似于 @Autowired, @Resource可以指定Bean的名称,也可以按类型注入。

六、Spring 的 Bean 是什么?

简单来说,Bean 代表被 IOC 容器管理的对象;我们通过配置文件或注解,告诉 IOC 容器帮助我们管理哪些对象。

七、Spring 框架中的常见注入方法

  • Setter注入: 使用 Setter方法注入Bean
  • 构造注入: 使用 构造 方法注入Bean
  • 属性注入: 使用 成员属性 注入 Bean,不推荐。原因:使用私有的成员属性变量,依靠反射实现,破坏封装,只能依靠 IOC 容器实现注入,不严谨。

八、Spring 中常见的 ApplicationContext 实现类

一)ClassPathXmlApplicationContext

根据类路径 classpath 下的配置文件加载 bean

java 复制代码
public class Test01 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ApplicationContext = new ClassPathXmlApplicationContext("beans.xml");
        Student student = (Student) ApplicationContext.getBean("Student");
        System.out.println(student);
        IUserDao userDaoImp = (IUserDao) ApplicationContext.getBean("UserDaoImp");
        System.out.println(userDaoImp);
    }
}

    

(二)FileSystemXmlApplicationContext

根据当前磁盘的一个绝对路径下的配置文件加载 bean

(三)AnnotationConfigApplicationContext

根据读取到的注解加载 bean

java 复制代码
public class Test01 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ApplicationContext = new AnnotationConfigApplicationContext(applicationconfig.class);
        IUserController controller = (IUserController)ApplicationContext.getBean("controller");
        controller.save();
    }
}

(四)WebApplicationContext

web 容器下按照配置文件加载 bean

九、Spring 框架注解有哪些?

用于声明 Bean 的注解:

|-------------|------------------------------------------------------|
| @Component | 定义通用 Bean的注解,可标注任意类为 Bean,若一个 Bean 不知道属于哪一层,可使用该注解标注 |
| @Repository | 定义数据访问层 Bean 的注解 |
| @Service | 定义业务层 Bean 的注解 |
| @Controller | 定义控制层 Bean 的注解 |

用于注入的注解:

|------------|---------|
| @Autowired | 按类型自动注入 |
| @Qualifier | 按名称自动注入 |

声明配置、扫描、启动特性的注解:

|-------------------------|----------|
| @Configuration | 声明配置类 |
| @ComponentScan | 组件扫描 |
| @EnableScheduling | 启动任务调度 |
| @EnableAspectJAutoProxy | 启动自动代理工厂 |

十、@Component 和 @Bean 的区别?

|-------|---------------------------------------------|----------------------------------------------------------|
| | @Component | @Bean |
| 注解作用于 | 类 | 方法 |
| 方式 | 通常通过类路径扫描来实现自动扫描并完成装配 Bean 到 Spring IOC 容器中 | 通常用于注解某个方法,通过 @Bean 注解告诉了Spring IOC 容器,该方法的返回值实例是一个 Bean |

十一、@Autowired 和 @Resource 的区别是什么?

|--------|-----------------|-----------------|
| | @Autowired | @Resource |
| 提供方 | Spring 提供的注解 | JDK 提供的注解 |
| 默认注入方式 | byType(按类型自动注入) | byName(按名称自动注入) |

十二、BeanFactory 和 ApplicationContext 区别?

两者之间的关系:

BeanFactory 和 ApplicationContext 是 Spring 的两大核心接口,都可以当作 Spring 的容器。

两者区别与不同:

BeanFactory 是 Spring 里面最底层的接口,是 IOC 的核心,定义了 IOC 的基本功能,包含了各种 Bean 的定义、加载、实例化、依赖注入生命周期管理等行为。

ApplicationContext 接口作为 BeanFactory 接口的子接口,包含 BeanFactory 所具备的功能外,还提供了其它框架功能:继承 MessageSource(支持国际化)、资源文件访问、可以同时加载多个配置文件、可以通过监听器管理 Bean 的生命周期。

Bean 的创建加载方式:

BeanFactory 采用的是延迟加载形式来注入 Bean ,只有在使用到某个 Bean 时,才会对该 Bean 进行加载实例化。这样不能提前发现一些存在的 Spring 的配置问题。若 Bean 的某一个属性没有注入, BeanFactory 加载后,直至第一次使用调用 getBean() 方法才会抛出异常

ApplicationContext 是在容器启动时,一次性创建了所有的 Bean。这样,在容器启动时,我们就可以发现 Spring 中存在的配置错误,这样有利于检查所依赖属性是否注入。ApplicationContext 启动后预载入所有的单实例 Bean ,所以在运行时速度比较快,因为它们已经创建好了。相对于 BeabFactory ,ApplicationContext 唯一的不足是占用内存空间,当应用程序配置 Bean 较多时,程序启动较慢

相关推荐
q***333712 分钟前
Spring boot启动原理及相关组件
数据库·spring boot·后端
无心水18 分钟前
【Python实战进阶】7、Python条件与循环实战详解:从基础语法到高级技巧
android·java·python·python列表推导式·python条件语句·python循环语句·python实战案例
一点★19 分钟前
“equals”与“==”、“hashCode”的区别和使用场景
java·开发语言
N***H48625 分钟前
SpringCloud实战十三:Gateway之 Spring Cloud Gateway 动态路由
java·spring cloud·gateway
s***w1121 小时前
SpringMVC新版本踩坑[已解决]
java
老李头喽1 小时前
走进单元测试
java·单元测试
就叫飞六吧1 小时前
Spring MVC 接口命名为什么会有 *.do/actions等身影?
java·spring·mvc
Victor3561 小时前
Redis(154)Redis的数据一致性如何保证?
后端
葡萄成熟时 !1 小时前
黑马学生管理系统
java·开发语言
r***86981 小时前
springboot三层架构详细讲解
spring boot·后端·架构