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、首先导入坐标
<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对象注入容器

@Component 
public class springBean { 
    
}

2.在配置类中注入

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

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

@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层实例对象.

public class UserServiceImp implements IUserService{
    IUserDao dao;

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

}
 <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

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

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 较多时,程序启动较慢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值