Spring IOC 详解

IOC

什么是IOC

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

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

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

IOC容器介绍

在这里插入图片描述
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)

   <!--Spring依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>

Spring的配置文件

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

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

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

<?xml version="1.0" encoding="UTF-8"?>

<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>
 <context>开启注解扫描:在指定的包路径下所有的类名,属性等上的注解都会进行扫描

实例类上添加注解

@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 的简单介绍及使用:
添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值