Spring-依赖注入(IOC)

本文详细介绍了Spring框架中的依赖注入(IOC),包括IOC的概念、本质、主要目的,以及Spring的两种容器——Bean工厂和应用上下文。重点讨论了如何使用应用上下文从不同来源加载上下文,如Java配置、XML文件,并通过@Autowired进行自动装配。最后,文章概述了IOC容器(Bean)的生命周期,包括从创建到销毁的各个阶段。

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

SPRING

一、依赖注入(IOC)

1.什么是依赖注入

(1)我们经常说的控制反转(Inversion of Control —IOC)和依赖注入(Dependency Injection—DI),在Spring 环境下是等同的概念。

(2)控制反转是通过依赖注入实现的。

(3)所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系。而不是通过对象本身负责自己的创建和解决自己的依赖。

2.本质:

创建应用对象之间协作关系(依赖)的行为通常称为装配。这也是依赖注入的本质。

3.依赖注入主要目的

依赖注入的主要目的是解耦,即降低耦合性。

4.两种Spring容器

Spring自带了多个容器实现,可以归为两种不同类型:

(1)bean工厂

​ (由BeanFactory接口定义)

是最简单的容器,提供基本的DI支持。(低级封装,功能一般)

(2)应用上下文

​ (由ApplicationContext接口定义)

基于BeanFactory构建,并提供应用框架级别的服务。(高度封装,功能强大,推荐使用)

5.使用Spring应用上下文

Spring自带了多种类型的应用上下文。

1⭐AnnotationConfigApplicationContext从一个或多个基于Java的配置类中加载Spirng应用上下文
2AnnotationConfigWebApplicationContext从一个或多个基于Java的配置类中加载Spring Web应用上下文。
3⭐ClassPathXmlApplicationContext从类路径下的一个或多个XMl配置文件中加载上下文定义,把应用上下文的定义文件作为资源
4⭐FileSystemXmlApplicationContext从文件系统下的一个或多个XML配置文件中加载上下文定义
5XmlWebApplicationContext从Web应用下的一个或多个XMl配置文件中加载上下文定义
5.1 从Java配置中加载上下文(.class文件)
//1.从Java配置中加载配置,将Bean装载到应用上下文。
ApplicationContext context=new AnnotationConfigApplicationContext(com.springaction.knights.config.KnightConfig.class);

示例:

public void launchByAnnotationConfigApplicationContext(){
     // 使用AnnotationConfigApplicationContext来配置Bean
     ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Bean_dog.class,BeanConfiguration.class);
     //  装配bean中的对象
     Dog dog = applicationContext.getBean(Dog.class);
     Person person = applicationContext.getBean(Person.class);
     System.out.println(dog.getName());
     System.out.println(person);
     // 返回对于指定类型Bean(包括子类)的所有名字
     String[] namesForType = applicationContext.getBeanNamesForType(Dog.class);
     for (String name : namesForType) {
        System.out.println(name);
    }
}
5.2 从类路径加载上下文(xml文件)
//1.从类路径下读取配置文件,将Bean装载到应用上下文。
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

示例:

public void launchByClassPathXmlApplicationContext(){
    //  使用ClassPathXmlApplicationContext来配置bean
    ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
    //  装配bean中的对象
    Person person = (Person)ac.getBean("person");
    System.out.println(person);

}
5.3 从文件系统加载上下文(xml文件)
//1.从文件系统读取配置文件,将Bean装载到应用上下文。
ApplicationContext context=new FileSystemXmlApplicationContext("D:/applicationContext.xml");

示例

public void launchByFileSystemXmlApplicationContext(){
    //  使用ClassPathResource来配置bean
    ApplicationContext ac = new FileSystemXmlApplicationContext("D:\\git-workspace\\ssm-in-action\\spring-in-action\\src\\main\\resources\\beans.xml");
    //  装配bean中的对象
    Person person = (Person)ac.getBean("person");
    System.out.println(person);

}
⭐ 5.4 从BeanFactory加载(xml文件)
//从类路径下读取配置文件
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));

示例

public void launchByBeanFactory(){
    //  使用ClassPathResource来读取配置文件
    BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
    Dog bean = (Dog) beanFactory.getBean("dog");
    System.out.println(bean.getName()+bean.getAge());

}

应用上下文准备就绪之后,我们就可以调用上下文的getBean()方法从Spring容器中获取bean.

5.5 使用@Autowired进行自动装配
	@Autowired
	User user;

使用**@Autowired** 时需要使用**@Component**来对应

@Component
public class User {

	private Long id;

	private String name;

	private Integer age;
}

6. IOC容器(Bean)的生命周期

  1. 通过构造器或工厂方法创建 Bean 实例
  2. 为 Bean 的属性设置值和对其他 Bean 的引用
  3. Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
  4. 调用 Bean 的初始化方法
  5. Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitializatio方法
  6. Bean 可以使用
  7. 容器关闭时, 调用 Bean 的销毁方法

在 Bean 的声明里设置 init-methoddestroy-method 属性, 为 Bean 指定初始化销毁方法.

<!-- 配置相应的 Bean 后置处理器 class:对应Bean后置处理器的全类名-->
<bean class="com.nchu.Processer.MypostProcesser"></bean>
public class MypostProcesser implements BeanPostProcessor {

	@Override
//	初始化之前的方法
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		//	可以直接对bean进行修改 或 替换
		Son son = new Son();
		if("son".equals(beanName)){
			son.setSex("女");
			System.out.println("before");
			return son;
		}
		return bean;
	}
		
	@Override
//	初始化之后的方法  Object:bean对象、String:bean的id
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //后置处理器会对每一个
		//	可以只针对某个bean进行处理
		if("student".equals(beanName))
		System.out.println("after"+"  "+beanName);
		return bean;
	}
}

相关项目代码在我的github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值