Spring之IOC(Inversion Of Control)-控制反转

目录

1、IOC是什么

2、IOC能做什么

3、Spring容器管理对象步骤

1、maven管理依赖—直接复制即可

2、给定容器的配置文件—直接复制即可

3、IOC容器管理对象

4、通过容器来获取对象—重新建一个类,里面内容如下

4、总结:Spring IOC操作

5、Spring中IOC中容器介绍

6、Spring中Bean的实例化方式

6.1、基于XML配置方式装配bean

6.2、使用注解方式装配Bean


1、IOC是什么

IOC(Inversion of Control 即控制反转):将对象交给容器管理。

谁控制谁、控制什么?为什么是反转?那些方面反转?

谁控制了谁?—是容器控制了对象

控制什么?主要控制了外部资源及生命周期

由容器帮我们查找并注入依赖的对象,对象只能被动的接收依赖对象,依赖对象的获取被反转了。

         spring中提供了一种IOC容器,来控制对象的创建,无论是创建对象,处理对象之间的依赖关系,对象的创建时间,还是对象的创建数量,都是spring提供IOC容器上配置对象的信息就可以了。

2、IOC能做什么

由IOC容器帮对象找相应的依赖对象并注入,并不是由对象主动去找

资源集中管理,实现资源的可配置和易管理

降低了使用资源双方的依赖程度,松耦合。

3、Spring容器管理对象步骤

1、maven管理依赖—直接复制即可

    <properties>
        <spring.propety>4.1.7.RELEASE</spring.propety>
    </properties>

    <dependencies>
        <!--spring核心依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.propety}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.propety}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.propety}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.propety}</version>
        </dependency>
    </dependencies>

2、给定容器的配置文件—直接复制即可

注意:建立.xml文件时,先在main包路径下建立resources包(右击该包),设置为如下;

 接着右击resources,选择如下:

名字可以自定义,但后缀名必须是.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> 

3、IOC容器管理对象

创建一个类:内容如下

 在.xml文件中

    <!--使用bean标签来管理对象,id属性必填,用来表示对象,class属性给定对象的全限定名-->
    <bean id="userInfo" class="com.tulun.Spring.IOC.ObjectUse.UserInfo"/>

4、通过容器来获取对象—重新建一个类,里面内容如下

    public static void main(String[] args) {
        //获取IOC容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springcontext1.xml");
        //获取对象
        UserInfo userInfo = (UserInfo)context.getBean("userInfo");
        System.out.println(userInfo);
    }

执行结果如下,说明获取对象成功

4、总结:Spring IOC操作

4.1、增加一个spring配置文件

4.2、解析xml的配置文件

4.3、BeanFactory工厂类

4.4、在工厂类中使用反射创建bean对象

5、Spring中IOC中容器介绍

5.1、在spring中,spring-core包模块中包含IOC技术,IOC容器主要是为了管理对象,以及对象之间的依赖关系,继承关系如下:

5.2、容器实现主要是BeanFactory接口和ApplicationContext接口,其继承关系如上图所示:

BeanFactory:是Spring IOC的最低层设计,提供了先进的配置机制,使得任何类型的对象配置成为可能。

ApplicationContext:ApplicationContext接口是继承自BeanFactory,实现了许多接口的扩展。

BeanFactory的使用和ApplicationContext类似

BeanFactory factory = new xmlBeanFactory(new ClassPathResource("context.xml"));
fatory.getBean("XXX");

BeanFactory和ApplicationContext区别在于:

BeanFactory的实现是按需创建,即第一次获取Bean才创建这个Bean;而ApplicationContext会一次性创建所有Bean。BeanFactory是ApplicationContext父接口,ApplicationContext也提供了一个额外的功能,比如提供支持国际化、事件通知等,通常总是使用ApplicationContext,很少使用BeanFactory。

5.3、ApplicationContext接口常见实现类:

  • ClassPathXmlApplicationContext:

读取的xml配置文件放置在类路径下,优先考虑使用ClassPathXmlApplicationContext

//获取IOC容器

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springcontext1.xml");
  • FileSystemXmlApplicationContext:

读取的配置文件放置在文件系统路径下,则优先考虑使用FileSystemXmlApplicationContext

FileSystemXmlApplicationContext context1 = new FileSystemXmlApplicationContext("c://applacation.xml");
  • XMLWebApplicationContext:

需要在web环境下读取配置信息XMLWebApplicationContext。

6、Spring中Bean的实例化方式

spring中装配Bean的方式主要两种:

①:基于xml配置形式

②:基于注解形式

6.1、基于XML配置方式装配bean

bean基于配置实例化方式有三种形式:

  • 通过无参构造实例化
  • 通过静态功能方式实例化
  • 通过普通工厂实例化

6.1.1、无参构造方式实例化对象

在通过类的全限定名找到类的位置,通过无参构造函数创建对象

<bean id="userInfo" class="com.tulun.Spring.IOC.ObjectUse.UserInfo"/>

注:如果不指定构造函数,JVM会生成默认的无参构造函数;

如果指定有参构造,必须显性的指定一个无参构造函数,否则实例化对象就会抛出异常。

6.1.2、静态工厂方法实例化对象

首先,使用工厂的静态方法返回一个对象

public class ObjectFactory {
    
    //提供静态的方法来获取UserInfo对象
    public static UserInfo getBean() {
        return new UserInfo();
    }
}

在配置文件中使用静态方法返回对象

    <!--
    通过静态工厂获取对象
    class属性指向工厂类全限定名
    factory-method属性是工厂类中获取对象的静态方法
    -->
    <bean id="userInfo1" class="com.tulun.Spring.IOC.IOCDemo.ObjectFactory" factory-method="getBean"/>

6.1.3、通过普通工厂方法实例化对象

通过工厂的非静态方法来得到一个对象

public class ObjectFactory {
    
    //提供静态的方法来获取UserInfo对象
    public static UserInfo getBean() {
        return new UserInfo();
    }
}

在容器中使用工厂的非静态方法获取对象

    <!--
    通过普通工厂获取对象
    -->
    <!--创建工厂对象-->
    <bean id="factory" class="com.tulun.Spring.IOC.IOCDemo.ObjectFactory"/>
    <bean id="userInfo2" class="com.tulun.Spring.IOC.ObjectUse.UserInfo" factory-bean="factory" factory-method="getUserInfo"/>

6.2、使用注解方式装配Bean

通过Component注解标记类

@Component(value = "userInfo")
/**
 * 
 * 注解形式类似于配置中bean标签处理
 * 注解中value参数和bean标签中id是相同的作用
 * <bean id="userInfo" class="com.tulun.Spring.IOC.ObjectUse.UserInfo"/>
 */
public class UserInfo {
    private String name;
    private String sex;


    public UserInfo(){}
    
}    

配置启动组件扫描注解

<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启注解扫描,指定的包路径或者类名:扫描类、方法、属性上是否有注解-->
    <context:component-scan base-package="com.tulun.Spring.IOC.ObjectUse"/>
    
    <!--扫描属性上的注解(不建议使用)-->
    <context:annotation-config></context:annotation-config>
</beans>

@Component注解是spring最早使用的标注类要交给容器管理的注解

还有以下注解:
@Controller 对Controller层类进行标注(主要接受处理URL)
@Service 对Service层的类进行标注(是进行业务处理)
@Repository 对DAO层实现类进行标注(和数据库打交道的类)

后三个都是Component注解衍生出来,功能是一样,可以互换,为了区分被注解标注的类在不同的业务层,是逻辑更清晰

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值