Spring学习笔记之IOC容器

IOC容器

1.IOC思想

1.1 获取资源的传统方式

自己做饭:买菜、洗菜、择菜、改刀、炒菜,全过程参与,费时费力,必须清楚了解资源创建整个过程中的全部细节且熟练掌握。

1.2 反转控制方式获取资源

点外卖:下单、等、吃,省时省力,不必关心资源创建过程的所有细节。
反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。

2. IOC容器在Spring中的实现

Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建bean 之前,首先需要创建 IOC 容器。Spring 提供了 IOC 容器的两种实现方式:

  • BeanFactory
    这是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。

  • ApplicationContext
    BeanFactory 的子接口,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用
    ApplicationContext 而不是底层的 BeanFactory。
    ApplicationContext的主要实现类

3. 基于XML管理bean

3.1 获取bean的三种方式

  • 1、 根据bean的id获取
  • 2、根据bean的类型获取
    注意:根据类型获取bean时,要求IOC容器中有且只有一个类型匹配的bean
    若没有任何一个类型匹配的bean,此时抛出异常:NoSuchBeanDefinitionException
    若有多个类型匹配的bean,此时抛出异常:NoUniqueBeanDefinitionException
  • 3、根据bean的id和类型获取
    结论:
    根据类型来获取bean时,在满足bean唯一性的前提下
    其实只是看:『对象 instanceof 指定的类型』的返回结果
    只要返回的是true就可以认定为和类型匹配,能够获取到。
    即通过bean的类型、bean所继承的类的类型、bean所实现的接口的类型都可以获取bean

3.2 依赖注入的两种方式

  1. 依赖注入之setter注入

配置bean

<bean id="studentOne" class="com.guyue.spring.bean.Student">
  <!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 -->
  <!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关)
-->
  <!-- value属性:指定属性值 -->
  <property name="id" value="1001"></property>
  <property name="name" value="张三"></property>
  <property name="age" value="23"></property>
  <property name="sex" value=""></property>
</bean>
  1. 依赖注入之构造器注入

在Student类中添加有参构造

public Student(Integer id, String name, Integer age, String sex) {
  this.id = id;
  this.name = name;
  this.age = age;
  this.sex = sex;
}

配置bean

<bean id="studentTwo" class="com.atguigu.spring.bean.Student">
  <constructor-arg value="1002"></constructor-arg>
  <constructor-arg value="李四"></constructor-arg>
  <constructor-arg value="33"></constructor-arg>
  <constructor-arg value=""></constructor-arg>
</bean>

3.3 bean的生命周期

  1. bean对象创建(调用无参构造器)
  2. 给bean对象设置属性
  3. bean对象初始化之前操作(由bean的后置处理器负责)
  4. bean对象初始化(需在配置bean时指定初始化方法)
  5. bean对象初始化之后操作(由bean的后置处理器负责)
  6. bean对象就绪可以使用
  7. bean对象销毁(需在配置bean时指定销毁方法)
  8. IOC容器关闭

3.4 基于XML的自动装配

自动装配:根据指定的策略,在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类型属性赋值。
可以通过bean标签中的autowire属性设置自动装配的策略。

1、no,default:表示不装配,即bean中的属性不会自动匹配某个bean为属性赋值,此时属性使用默认值。

2、byType:根据要赋值的属性的类型,在IOC容器中匹配某个bean,为属性赋值。
注意:
a>若通过类型没有找到任何一个类型匹配的bean,此时不装配,属性使用默认值。
b>若通过类型找到了多个类型匹配的bean,此时会抛出异常:NoUniqueBeanDefinitionException
总结:当使用byType实现自动装配时,IOC容器中有且只有一个类型匹配的bean能够为属性赋值。

3、byName:将要赋值的属性的属性名作为bean的id在IOC容器中匹配某个bean,为属性赋值。
总结:当类型匹配的bean有多个时,此时可以使用byName实现自动装配。

4. 基于注解的自动装配

@Autowired注解
在成员变量上直接标记@Autowired注解即可完成自动装配,不需要提供setXxx()方法。

@Service
public class UserServiceImpl implements UserService {
  @Autowired
  private UserDao userDao;
  @Override
  public void saveUser() {
    userDao.saveUser();
 }
}

@Autowired注解可以标记在构造器和set方法上。

@Controller
public class UserController {
  private UserService userService;
 
  @Autowired
  public UserController(UserService userService){
    this.userService = userService;
 }
  public void saveUser(){
    userService.saveUser();
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值