Spring IOC 详解

Spring IOC

  • IOC
    • 什么是IOC
    • IOC容器介绍
      • BeanFactory和ApplicationContext的区别
  • Spring容器管理对象
    • Spring依赖(pom.xml)
    • Spring的配置文件
  • Bean类的实例化方式(demo)
    • 创建实例类
    • 基于xml配置文件实现Bean
      • 基于无参构造函数实例化
      • 静态工厂方式实例化
      • 基于普通工厂方法实例化
    • 基于注解的方式装配Bean
    • spring配置文件引入context约束
    • 实例类上添加注解
  • Spring DI介绍

IOC

什么是IOC

Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转,哪些方面反转了:

●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

IOC容器介绍

Spring IOC 详解_第1张图片
ApplicationContext容器中的接口的继承关系,ApplicationContext是BeanFactory的子接口之一,即BeanFactory是Spring IOC容器定义的最底层的接口,ApplicationCentext是BeanFactory的高级实现之一,是对BeanFactory功能做了许多的扩展。

BeanFactory和ApplicationContext的区别

配置bean的方式:
(1).通过ApplicationContext上下文容器:当在加载xml配置文件时,配置文件中的配置的bean已经被实例化
(2).BeanFactory:在加载配置文件时,配置文件中的bean不被实例化,只有当通过getBean(),获取bean实例的时候才被创建。

主要使用的三种创建IOC的方式
1.ClassPathXmlApplicationContext
读取classpath中的资源
new ClassPathXmlApplicationContext(".xml配置文件");

2.FileSystemXmlAplicationContext
读取指定路径下的资源
new FileSystemXmlApplicationContext("/指定路径");

3.XmlWebAplicationContext
需要在Web环境下读取资源

Spring容器管理对象

Spring依赖(pom.xml)

   
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-coreartifactId>
            <version>4.3.2.RELEASEversion>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-beansartifactId>
            <version>4.3.2.RELEASEversion>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>4.3.2.RELEASEversion>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-expressionartifactId>
            <version>4.3.2.RELEASEversion>
        dependency>

Spring的配置文件

在resources目录下给定xml配置文件,命令为application.xml



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

beans>

Bean类的实例化方式(demo)

创建实例类

package com.tulun.bean;

public class Person {
     
    private String name;
    private int id;
  
    public Person(){
     }
    
    public Person(String name,int id){
     
    this.id = id;
    this.name = name;
    }

    @Override
    public String toString() {
     
        return "Person{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", person1=" + person1 +
                '}';
    }
    //此处省略set和get方法
}

基于xml配置文件实现Bean

配置在application.xml文件中;

基于无参构造函数实例化


    <bean id="person1" class="com.tulun.bean.Person"/>

id->创建的对象名
class->实例类所在地址

确保实例类中存在无参构造函数,否则无法实例化成功

测试(App.java)

    //无参构造方法的实例化
    public void demo1(){
     
        //获取IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        //在容器中获取需要的对象
        Person person = (Person) context.getBean("person1");
        System.out.println(person);
    }

静态工厂方式实例化

1.创建静态工厂类

package com.tulun.factory;

import com.tulun.bean.Person;

public class StaticFactory {
     
    public static Person getPerson(){
     
        return new Person();
    }
}

2.配置xml文件(application.xml)


    <bean id="person2" class="com.tulun.factory.StaticFactory" factory-method="getPerson"/>

class属性指定的静态工厂类的全路径 ,factory-method属性即对应的方法,当前获取Person类在静态工厂下提供的getPerson方法可获取该对象

3.测试(App.java)

    //静态工厂实例化
    public void demo2(){
     
        //获取IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        //在容器中获取需要的对象
        Person person = (Person) context.getBean("person2");
        System.out.println(person);
    }

基于普通工厂方法实例化

1.创建普通工厂类

package com.tulun.factory;

import com.tulun.bean.Person;

public class CommonFactory {
     
    public Person getPerson(){
     
        return new Person();
    }
}

2.配置xml文件(application.xml)

    
    <bean id="factory" class="com.tulun.factory.CommonFactory"/>
    <bean id="person3" factory-bean="factory" factory-method="getPerson"/>

3.测试(App.java)

    //实例工厂实例化
    public void demo3(){
     
        //获取IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        //在容器中获取需要的对象
        Person person = (Person) context.getBean("person3");
        System.out.println(person);
    }

基于注解的方式装配Bean

spring配置文件引入context约束

在resources目录下给定xml配置文件,命令为application1.xml



<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.tulun"/>

beans>
 开启注解扫描:在指定的包路径下所有的类名,属性等上的注解都会进行扫描

实例类上添加注解

@Component
public class Person {
     
    private String name;
    private int id;
    }

测试(App.java)

    //通过注解实例化
    public void demo4(){
     
        //获取IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("application1.xml");
        //在容器中获取需要的对象
        Person person = (Person) context.getBean("person");
        System.out.println(person);
    }

使用注解很方便,在配置问价中指定扫描的包路径或者类路径后,另交给IOC管理的类上直接添加注解@Component

Spring中提供的4中注解来标注bean
@Component 通用的标注的注解
@Repository 对dao层实现类进行标注
@Service 对service层实现类进行标注
@Controller 对Controller层实现类进行标注

@Component 是spring提供的通用的组件注解
@Repository、@Service 、@Controller都是有其衍生出来,功能都是一样的,可以互换,
主要是为了区分被注解的类处在不同的业务层,使逻辑更加清晰

Spring DI介绍

以下是对Spring DI 的简单介绍及使用:
添加链接描述

你可能感兴趣的:(spring,ioc)