Spring IOC

一、IoC的基本概念

1、IoC是随着近年来轻量级容器的兴起而逐渐被很多人提到的一个名词,他的全称是Inversion of Control,中文意思为“控制反转”,它还有一个别名叫依赖注入(Dependency Injection),依赖注入的核心理念是:你需要什么我就送给你什么,不需要自己去拿。

                                                                              

2、依赖注入的三种方式:

a、构造方法注入:被注入对象可以通过在其构造方法中声明依赖对象的参数列表,让外部(通常是IoC容器)知道它需要的依赖对象。这种方法的优点是,在对象构造完后,就可以马上使用。缺点在于在依赖对象比较多时,通过反射在构造对象时,对参数的处理比较困难,在维护上和使用上也比较麻烦。

public class UserService {
	private UserDao userDao; //UserDao为一个接口
	public UserService(UserDao userDao){//构造函数
		this.userDao=userDao;
	}
}

b、setter方法注入:为当前对象所依赖的对象所对应的属性加入setter方法,就可以通过setter方法将相应的依赖对象设置到被注入的对象中。这个方式在三种方式里面是最好的一种,是目前使用最多的一种方式。

public class UserService {
	private UserDao userDao; //UserDao为一个接口
	public UserDao getUserDao() {
		return userDao;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
}

c、接口注入:这种方法想通过IoC   Service  Provider为其注入依赖对象,必须要实现某个接口。这个接口提供一个方法,用来为其注入依赖对象,IoC   Service  Provider通过这些接口来了解为被注入对象注入什么对象。接口注入是现在不甚提倡的一种方法,因为它强制被注入的对象实现不必要的接口。

二、掌管大局的IoC  SerVice Provider

1、IoC  SerVice Provider的作用:a、对业务对象的构建管理。被注入的对象,不需要知道依赖对象是如何实例化。这个实例化的过程都交给IoC  SerVice Provider来完成;b、业务对象间的依赖绑定:将被注入的对象与依赖对象进行绑定。

2、IoC  SerVice Provider如何管理对象间的依赖关系,在spring中,Spring   Ioc 就是一个IoC  SerVice Provider ,主要通过xml配置文件来配置相应的依赖关系。

<bean id="userService" class="....UserService">
   <property name="userDao" ref="UserDaoImpl"></property>
</bean>
<bean id="UserDaoImpl" class="...impl.UserDaoImpl"></bean>

这里UserDaoImpl为一个UserDao接口的实现类。

三、Spring的IoC容器之BeanFactory

1、BeanFactory:基础类型的IoC 容器,如果没有特殊指定,默认采用延迟初始化策略(lazy-load)。只有当客户端对象需要访问容器中的某个受管对象时,才对该对象进行实例化以及依赖注入操作,这个容器启动的速度比较快。BeanFactory它是一个bean的工厂,可以完成对象的初始化、依赖注入。下面是一个Spring   IoC的基本实现过程:

a、首先定义一个 UserDao 接口:

import java.util.List;
import com.spring.domain.User;
public interface UserDao {
	public void addUser(User user);
}

b、定义一个UserDao接口的实现类UserDaoImpl

import com.spring.dao.UserDao;
public class UserDaoImpl   implements  UserDao {
	@Override
	public void addUser(User user) {
		// TODO Auto-generated method stub
		System.out.println("add user success" + user);
	}
}

c、定义一个UserService接口

package com.spring.service;
import java.util.List;
import com.spring.domain.User;
public interface UserService {
	public void addUser(User user);
}

d、定义一个UserService接口的实现类UserServiceImpl

package com.spring.service.impl;

import java.util.List;
import org.springframework.stereotype.Component;
import com.spring.dao.UserDao;
import com.spring.dao.impl.UserDaoImpl;
import com.spring.domain.User;
import com.spring.service.UserService;
public class  UserServiceImpl    implements   UserService {
	private UserDao userDao;
	@Override
	public void addUser(User user) {
		userDao.addUser(user);
	}
              //set与get方法
	public  UserDao  getUserDao () {
		return  userDao;
	}
	public void setUserDao (UserDao userDao) {
		this.userDao = userDao;
	}
}

e、创建一个applicationContext.xml配置文件

<pre name="code" class="java"><?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-3.0.xsd		
">
<bean id=”userDaoImpl” class=”com.spring.dao.impl.UserDaoImpl” scope=”prototype”></bean>
<bean id=”userServiceImpl”   class=”com.spring.service.impl.UserServiceImpl”>
  <property name=”userDao” ref=”userDaoImpl”></property>
</bean>
</beans>

e、测试是否注入成功 

public class UserServiceTest {
  public static void main(String[] args) {
      ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
      UserService UserService=context.getBean("userServiceImpl",UserService.class);
		User user=new User();
		UserService.addUser(user);
	}
}

这是一种xml配置文件实现方式,在spring2.5以后提供了一中更加方便的注解实现方式。关于注解方式此处不做详解。

2、在BeanFactory中bean 的scope属性

a、singleton:表示一个容器中之存在一个共享实例,所有对该类型bean的依赖都引用这一单一的实例。从容器启动,到它第一次被请求而实例化开始,只要容器不销毁或者退出,该类型bean的单一实例就一直会存活。

b、prototype:声明为prototype的bean,容器在接到该类型对象的请求时候,会每次重新生成一个新的对象实例给对方。每个对象被实例化以后都是自生自灭的。











    



### Spring IOC 原理及实现 #### 1. 控制反转IOC)的概念 控制反转(Inversion of Control,简称 IOC)是一种设计思想,旨在将对象的创建和管理从应用程序代码中分离出来。通过 IOC,开发者无需手动管理对象的生命周期和依赖关系,而是由框架负责这些任务。这种思想使得开发者可以专注于业务逻辑的实现,而不需要关心对象之间的交互细节[^1]。 #### 2. 依赖注入(DI) 依赖注入(Dependency Injection,简称 DI)是实现 IOC 的一种方式。DI 的核心在于通过外部配置或注解的方式,将对象的依赖关系注入到目标对象中,而不是由对象自己负责依赖的创建和管理。依赖注入有三种主要形式:构造器注入、Setter 方法注入和字段注入[^4]。 #### 3. Spring IOC 容器的核心接口 Spring 框架提供了两种主要的 IOC 容器接口: - **BeanFactory**:这是 Spring 框架的基础接口,面向 Spring 内部使用。它负责配置、创建和管理 Bean 的生命周期。 - **ApplicationContext**:这是一个更高级的容器接口,面向开发者使用。它扩展了 BeanFactory 的功能,提供了更多的企业级特性,如国际化支持、事件传播等。在实际开发中,通常使用 ApplicationContext 而非 BeanFactory[^2]。 #### 4. Spring IOC 的实现方式 Spring IOC 的实现主要包括以下几个方面: ##### (1) 元数据解析 Spring 使用 XML 文件、Java 注解或 Java 配置类来定义 Bean 的元数据。例如,通过 `<bean>` 标签在 XML 文件中定义 Bean,或者使用 `@Component`、`@Service` 等注解在 Java 类上声明 Bean[^5]。 示例代码(XML 配置): ```xml <bean id="userDao" class="com.mayuanfei.springioc.dao.impl.UserDaoImpl" /> ``` 示例代码(注解配置): ```java @Component public class UserDaoImpl implements UserDao { // 实现方法 } ``` ##### (2) 依赖注入 Spring 通过反射机制解析 Bean 的依赖关系,并将其注入到目标对象中。以下是一个简单的依赖注入示例: 示例代码(字段注入): ```java @Service public class UserService { @Autowired private UserDao userDao; // 自动注入 UserDao } ``` ##### (3) 生命周期管理 Spring 容器会管理 Bean 的整个生命周期,包括初始化、运行时和销毁阶段。开发者可以通过实现特定的接口(如 `InitializingBean` 和 `DisposableBean`)或使用注解(如 `@PostConstruct` 和 `@PreDestroy`)来定制 Bean 的生命周期行为。 示例代码(生命周期管理): ```java @Component public class MyBean { @PostConstruct public void init() { System.out.println("Bean 初始化"); } @PreDestroy public void destroy() { System.out.println("Bean 销毁"); } } ``` ##### (4) 扩展机制 Spring 提供了丰富的扩展点,允许开发者自定义容器的行为。例如,通过实现 `BeanFactoryPostProcessor` 或 `BeanPostProcessor` 接口,可以在 Bean 初始化前后插入自定义逻辑[^4]。 #### 5. Spring IOC 的优势 Spring IOC 的核心优势包括: - **解耦**:对象之间不再直接依赖具体实现,而是通过接口或抽象类进行交互。 - **灵活性**:通过配置文件或注解动态管理 Bean,便于修改和扩展。 - **可维护性**:集中处理对象的创建和依赖关系,降低了代码复杂度。 ### 总结 Spring IOC 是一种通过容器管理对象生命周期和依赖关系的设计模式。其核心原理包括元数据解析、依赖注入、生命周期管理和扩展机制。通过这些机制,Spring 实现了对象控制权的反转,从而提高了系统的解耦性、灵活性和可维护性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值